Method.st
changeset 2 6526dde5f3ac
parent 1 a27a279701f8
child 3 24d81bf47225
--- a/Method.st	Fri Jul 16 11:39:45 1993 +0200
+++ b/Method.st	Mon Oct 04 11:32:33 1993 +0100
@@ -209,7 +209,7 @@
 containingClass
     "return the class I am defined in"
 
-    Smalltalk allClassesDo:[:aClass |
+    Smalltalk allBehaviorsDo:[:aClass |
         (aClass containsMethod:self) ifTrue:[^ aClass]
     ].
     ^ nil
@@ -355,198 +355,223 @@
 !Method methodsFor:'executing'!
 
 valueWithReceiver:anObject arguments:argArray
-    "low level call of a methods code - big danger alert.
+    "low level call of a methods code - BIG DANGER ALERT.
+     Perform the receiver-method on anObject as receiver and argArray as
+     arguments. This does NO message lookup at all and mimics a
+     traditional function call.
      This method is provided for debugging- and breakpoint-support;
      not for general use. The receiver must be a method compiled in
      anObjects class or one of its superclasses 
      - otherwise strange things (and also strange crashes) can occur. 
      Be warned."
 
-    |numArgs a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12|
+    |a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12|
 
-    argArray class == Array ifFalse:[
-        ^ self error:'argumentArray must be an Array'
-    ].
-    numArgs := argArray size.
-    numArgs > 12 ifTrue:[
-        ^ self error:'too many arguments'
-    ].
 %{
     OBJFUNC code;
     OBJ searchClass;
     static struct inlineCache dummy = _DUMMYILC0;
+    int nargs;
+    OBJ *ap;
+
+    if (_isArray(argArray)) {
+        nargs = _arraySize(argArray);
+	ap = _ArrayInstPtr(argArray)->a_element;
+    } else {
+	if (argArray == nil) {
+	    nargs = 0;
+	} else
+	    nargs = -1;
+    }
 
     code = _MethodInstPtr(self)->m_code;
     searchClass = dummy.ilc_class = _Class(anObject);
-    switch (_intVal(numArgs)) {
+    switch (nargs) {
         case 0:
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy) );
 
         case 1:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
 #ifdef PASS_ARG_REF
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
+            a1 = ap[0];
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1 );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0]) );
 #endif
 
         case 2:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1]) );
 #endif
 
         case 3:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
-            a3 = _ArrayInstPtr(argArray)->a_element[2];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
+            a3 = ap[2];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2]) );
 #endif
 
         case 4:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
-            a3 = _ArrayInstPtr(argArray)->a_element[2];
-            a4 = _ArrayInstPtr(argArray)->a_element[3];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
+            a3 = ap[2];
+            a4 = ap[3];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3]) );
 #endif
 
         case 5:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
-            a3 = _ArrayInstPtr(argArray)->a_element[2];
-            a4 = _ArrayInstPtr(argArray)->a_element[3];
-            a5 = _ArrayInstPtr(argArray)->a_element[4];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
+            a3 = ap[2];
+            a4 = ap[3];
+            a5 = ap[4];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4]) );
 #endif
 
         case 6:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
-            a3 = _ArrayInstPtr(argArray)->a_element[2];
-            a4 = _ArrayInstPtr(argArray)->a_element[3];
-            a5 = _ArrayInstPtr(argArray)->a_element[4];
-            a6 = _ArrayInstPtr(argArray)->a_element[5];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
+            a3 = ap[2];
+            a4 = ap[3];
+            a5 = ap[4];
+            a6 = ap[5];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
+									   ap[5]) );
 #endif
 
         case 7:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
-            a3 = _ArrayInstPtr(argArray)->a_element[2];
-            a4 = _ArrayInstPtr(argArray)->a_element[3];
-            a5 = _ArrayInstPtr(argArray)->a_element[4];
-            a6 = _ArrayInstPtr(argArray)->a_element[5];
-            a7 = _ArrayInstPtr(argArray)->a_element[6];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
+            a3 = ap[2];
+            a4 = ap[3];
+            a5 = ap[4];
+            a6 = ap[5];
+            a7 = ap[6];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
+									   ap[5], ap[6]) );
 #endif
 
         case 8:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
-            a3 = _ArrayInstPtr(argArray)->a_element[2];
-            a4 = _ArrayInstPtr(argArray)->a_element[3];
-            a5 = _ArrayInstPtr(argArray)->a_element[4];
-            a6 = _ArrayInstPtr(argArray)->a_element[5];
-            a7 = _ArrayInstPtr(argArray)->a_element[6];
-            a8 = _ArrayInstPtr(argArray)->a_element[7];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
+            a3 = ap[2];
+            a4 = ap[3];
+            a5 = ap[4];
+            a6 = ap[5];
+            a7 = ap[6];
+            a8 = ap[7];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7, a8) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
+									   ap[5], ap[6], ap[7]) );
 #endif
 
         case 9:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
-            a3 = _ArrayInstPtr(argArray)->a_element[2];
-            a4 = _ArrayInstPtr(argArray)->a_element[3];
-            a5 = _ArrayInstPtr(argArray)->a_element[4];
-            a6 = _ArrayInstPtr(argArray)->a_element[5];
-            a7 = _ArrayInstPtr(argArray)->a_element[6];
-            a8 = _ArrayInstPtr(argArray)->a_element[7];
-            a9 = _ArrayInstPtr(argArray)->a_element[8];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
+            a3 = ap[2];
+            a4 = ap[3];
+            a5 = ap[4];
+            a6 = ap[5];
+            a7 = ap[6];
+            a8 = ap[7];
+            a9 = ap[8];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7, a8, a9) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
+									   ap[5], ap[6], ap[7], ap[8]) );
 #endif
 
         case 10:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
-            a3 = _ArrayInstPtr(argArray)->a_element[2];
-            a4 = _ArrayInstPtr(argArray)->a_element[3];
-            a5 = _ArrayInstPtr(argArray)->a_element[4];
-            a6 = _ArrayInstPtr(argArray)->a_element[5];
-            a7 = _ArrayInstPtr(argArray)->a_element[6];
-            a8 = _ArrayInstPtr(argArray)->a_element[7];
-            a9 = _ArrayInstPtr(argArray)->a_element[8];
-            a10 = _ArrayInstPtr(argArray)->a_element[9];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
+            a3 = ap[2];
+            a4 = ap[3];
+            a5 = ap[4];
+            a6 = ap[5];
+            a7 = ap[6];
+            a8 = ap[7];
+            a9 = ap[8];
+            a10 = ap[9];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
+									   ap[5], ap[6], ap[7], ap[8], ap[9]) );
 #endif
 
         case 11:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
-            a3 = _ArrayInstPtr(argArray)->a_element[2];
-            a4 = _ArrayInstPtr(argArray)->a_element[3];
-            a5 = _ArrayInstPtr(argArray)->a_element[4];
-            a6 = _ArrayInstPtr(argArray)->a_element[5];
-            a7 = _ArrayInstPtr(argArray)->a_element[6];
-            a8 = _ArrayInstPtr(argArray)->a_element[7];
-            a9 = _ArrayInstPtr(argArray)->a_element[8];
-            a10 = _ArrayInstPtr(argArray)->a_element[9];
-            a11 = _ArrayInstPtr(argArray)->a_element[10];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
+            a3 = ap[2];
+            a4 = ap[3];
+            a5 = ap[4];
+            a6 = ap[5];
+            a7 = ap[6];
+            a8 = ap[7];
+            a9 = ap[8];
+            a10 = ap[9];
+            a11 = ap[10];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
+									   ap[5], ap[6], ap[7], ap[8], ap[9], 
+									   ap[10]) );
 #endif
 
         case 12:
-            a1 = _ArrayInstPtr(argArray)->a_element[0];
-            a2 = _ArrayInstPtr(argArray)->a_element[1];
-            a3 = _ArrayInstPtr(argArray)->a_element[2];
-            a4 = _ArrayInstPtr(argArray)->a_element[3];
-            a5 = _ArrayInstPtr(argArray)->a_element[4];
-            a6 = _ArrayInstPtr(argArray)->a_element[5];
-            a7 = _ArrayInstPtr(argArray)->a_element[6];
-            a8 = _ArrayInstPtr(argArray)->a_element[7];
-            a9 = _ArrayInstPtr(argArray)->a_element[8];
-            a10 = _ArrayInstPtr(argArray)->a_element[9];
-            a11 = _ArrayInstPtr(argArray)->a_element[10];
-            a12 = _ArrayInstPtr(argArray)->a_element[11];
 #ifdef PASS_ARG_REF
+            a1 = ap[0];
+            a2 = ap[1];
+            a3 = ap[2];
+            a4 = ap[3];
+            a5 = ap[4];
+            a6 = ap[5];
+            a7 = ap[6];
+            a8 = ap[7];
+            a9 = ap[8];
+            a10 = ap[9];
+            a11 = ap[10];
+            a12 = ap[11];
             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
 #else
-            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) );
+            RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
+									   ap[5], ap[6], ap[7], ap[8], ap[9], 
+									   ap[10], ap[11]) );
 #endif
     }
 %}
+.
+    (argArray isMemberOf:Array) ifFalse:[
+        ^ self error:'argumentArray must be an Array'
+    ].
+    ^ self error:'too many arguments'
+
     "(String compiledMethodAt:#print) valueWithReceiver:'hello' arguments:#()"
     "(Float compiledMethodAt:#+) valueWithReceiver:1.0 arguments:#(2.0)"
+    "the next example is a wrong one - but will not crash the system ..."
+    "(True compiledMethodAt:#printString) valueWithReceiver:false arguments:nil"
 ! !
 
 !Method methodsFor:'printing'!