$(AR) rc libobjc.a $(OBJC_O)
# ranlib is run in the parent directory's makefile.
+ARGFRAME_H = argframe.h af-sparc.h
+
OBJC_H = hash.h list.h sarray.h objc.h \
objc-api.h cache.h \
- Object.h Protocol.h mutex.h
+ Object.h Protocol.h mutex.h \
+ $(ARGFRAME_H)
# copy objc headers to installation include directory
copy-headers: $(OBJC_H)
chmod a+r $(incinstalldir)/objc; \
done
-sendmsg.o: sendmsg.c fflags
- $(GCC_FOR_TARGET) `cat fflags` -c $(GCC_CFLAGS) $(SUBDIR_INCLUDES) $(srcdir)/objc/sendmsg.c
-
-## Next to are for heuristics on forwarding mechanism...
-_forward: _forward.c
- -$(GCC_FOR_TARGET) -c $(GCC_CFLAGS) $(SUBDIR_INCLUDES) $(srcdir)/objc/_forward.c
- -$(GCC_FOR_TARGET) ./_forward.o -o _forward
- if [ ! -f ./_forward ]; then touch ./_forward; else true; fi
-
-fflags: _forward
- -rm -f fflags
- -if [ -s ./_forward ]; then ./_forward > fflags; else touch fflags; fi
-
mostlyclean:
-rm -f *.o libobjc.a _forward fflags
clean: mostlyclean
@class Protocol;
typedef struct objc_typed_stream TypedStream;
-typedef void* arglist_t;
#endif /* not __objc_INCLUDE_GNU */
+#ifndef __AF_FRAME
+typedef struct __gnuc_af_frame *af_frame;
+#define __AF_FRAME
+#endif
+
/*
* All classes are derived from Object. As such,
* this is the overhead tacked onto those objects.
- perform:(SEL)aSel with:anObject1 with:anObject2;
/* Forwarding */
-- forward:(SEL)aSel :(arglist_t)argFrame;
-- performv:(SEL)aSel :(arglist_t)argFrame;
+- forward:(SEL)aSel :(af_frame)argFrame;
+- performv:(SEL)aSel :(af_frame)argFrame;
/* Posing */
+ poseAs:(Class*)aClassObject;
return (*msg)(self, aSel, anObject1, anObject2);
}
-- forward:(SEL)aSel :(arglist_t)argFrame
+- forward:(SEL)aSel :(af_frame)argFrame
{
return [self doesNotRecognize: aSel];
}
-- performv:(SEL)aSel :(arglist_t)argFrame
+- performv:(SEL)aSel :(af_frame)argFrame
{
return objc_msg_sendv(self, aSel, method_get_argsize(0), argFrame);
}
#include "runtime.h"
-void objc_error(id object, const char* fmt, va_list);
-
void (*_objc_error)(id, const char*, va_list) = objc_error;
/* id (*_objc_object_alloc)(Class*) = 0; */
/* id (*_objc_object_dispose)(id) = 0; */
typedef void* retval_t; /* return value */
typedef void(*apply_t)(void); /* function pointer */
-#ifndef __object_INCLUDE_GNU
-
-#if defined(REG_ARGS) || defined(STACK_ARGS)
-
-typedef struct {
- char* arg_pointer;
-#ifdef STRUCT_RETURN
- void* struct_return;
-#endif
-#ifdef REG_ARGS
- void* regs[2];
-#endif
-} *arglist_t;
-
-#ifdef REG_ARGS
-#define __objc_frame_receiver(FRAME) (FRAME)->regs[0]
-#define __objc_frame_selector(FRAME) ((SEL)(FRAME)->regs[1])
-
-#else
-#define __objc_frame_receiver(FRAME) ((id*)(FRAME)->arg_pointer)[0]
-#define __objc_frame_selector(FRAME) ((SEL*)(FRAME)->arg_pointer)[1]
-#endif
-#else
-
-typedef void* arglist_t;
-
+#ifndef __AF_FRAME
+typedef struct __gnuc_af_frame *af_frame;
+#define __AF_FRAME
#endif
-#endif /* not __object_INCLUDE_GNU */
-retval_t objc_msg_sendv(id, SEL, size_t, arglist_t);
+retval_t objc_msg_sendv(id, SEL, size_t, af_frame);
#ifdef __OBJC__
extern void __objc_update_dispatch_table_for_class (Class*);/* (objc-msg.c) */
extern void class_add_method_list(Class*, MethodList_t);
+void objc_error(id object, const char* fmt, va_list);
+
/* True when class links has been resolved */
extern BOOL __objc_class_links_resolved;
covered by the GNU General Public License. */
#include "runtime.h"
+#include "argframe.h"
#ifdef OBJC_SPARSE_LOOKUP
const char* __objc_sparse_lookup_id = "Method lookup uses sparse arrays";
}
retval_t
-objc_msg_sendv(id object, SEL op, size_t frame_size, arglist_t arg_frame)
+objc_msg_sendv(id object, SEL op, size_t frame_size, af_frame arg_frame)
{
-#ifdef __objc_frame_receiver
- __objc_frame_receiver(arg_frame) = object;
- __objc_frame_selector(arg_frame) = op;
+#ifndef __ARGFRAME_DOES_NOT_WORK
+ af_cum cum;
+ af_start (cum, arg_frame);
+ af_put (arg_frame, cum, id, object);
+ af_put (arg_frame, cum, SEL, op);
return __builtin_apply((apply_t)get_imp(object->class_pointer, op),
arg_frame,
frame_size);