--- 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'!