Changed to use argframe macros
authorKresten Krab Thorup <krab@gcc.gnu.org>
Tue, 27 Apr 1993 20:36:53 +0000 (20:36 +0000)
committerKresten Krab Thorup <krab@gcc.gnu.org>
Tue, 27 Apr 1993 20:36:53 +0000 (20:36 +0000)
From-SVN: r4253

gcc/objc/Makefile.in
gcc/objc/Object.h
gcc/objc/Object.m
gcc/objc/misc.c
gcc/objc/objc.h
gcc/objc/runtime.h
gcc/objc/sendmsg.c

index 6b22c6862b8dcdc83fba4dddd49037facff90e16..e4b3bbd5952fb0852d74feb8458e2b0c1d0bc717 100644 (file)
@@ -60,9 +60,12 @@ libobjc.a: $(OBJC_O)
        $(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)
@@ -74,19 +77,6 @@ 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
index 6ef6e879fa4ca4de616057519a07f1e0d09f62d2..53f0253e8c5d4f1e8152130f99f45fb822000ed4 100644 (file)
@@ -52,10 +52,14 @@ typedef char *STR;                              /* String alias */
 
 @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.
@@ -119,8 +123,8 @@ typedef void* arglist_t;
 - 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;
index 5f35bd39df975b08e4c15f8e96589e8f13279028..3a524dc7bb04c907ad4cc0230b34e9861ec78bfe 100644 (file)
@@ -245,12 +245,12 @@ extern int errno;
   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);
 }
index b9b64ac273c4f6608abaac4f976840c3e52ad8ba..915e29dd28bae1ebf2e0511e607749955e1ee1c2 100644 (file)
@@ -26,8 +26,6 @@ You should have received a copy of the GNU General Public License along with
 
 #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; */
index d5eace390cb160e9d6d8972feca86b9bb74f97e3..569693781cce7711545563627bc22de842f4cdc5 100644 (file)
@@ -440,36 +440,12 @@ IMP objc_msg_lookup_super(Super_t super, SEL sel);
 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__
 
index ef6e572048dccbf94689c19ca3a36a16584c7df5..b0a1e163a24eed134fa0eb3e30db030ff2e29d11 100644 (file)
@@ -51,6 +51,8 @@ extern void __objc_register_selectors_from_class(Class*); /* (objc-sel.c) */
 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;
 
index b8ffed626d57354c59604ea0a5a2eadb9437bbf8..1c5c6631829afc20d4f1f4b9fdb823af42b58e81 100644 (file)
@@ -25,6 +25,7 @@ You should have received a copy of the GNU General Public License along with
    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";
@@ -110,11 +111,13 @@ objc_msg_lookup_super (Super_t super, SEL sel)
 }
 
 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);