Method.st
changeset 2 6526dde5f3ac
parent 1 a27a279701f8
child 3 24d81bf47225
equal deleted inserted replaced
1:a27a279701f8 2:6526dde5f3ac
   207 !Method methodsFor:'queries'!
   207 !Method methodsFor:'queries'!
   208 
   208 
   209 containingClass
   209 containingClass
   210     "return the class I am defined in"
   210     "return the class I am defined in"
   211 
   211 
   212     Smalltalk allClassesDo:[:aClass |
   212     Smalltalk allBehaviorsDo:[:aClass |
   213         (aClass containsMethod:self) ifTrue:[^ aClass]
   213         (aClass containsMethod:self) ifTrue:[^ aClass]
   214     ].
   214     ].
   215     ^ nil
   215     ^ nil
   216 !
   216 !
   217 
   217 
   353 ! !
   353 ! !
   354 
   354 
   355 !Method methodsFor:'executing'!
   355 !Method methodsFor:'executing'!
   356 
   356 
   357 valueWithReceiver:anObject arguments:argArray
   357 valueWithReceiver:anObject arguments:argArray
   358     "low level call of a methods code - big danger alert.
   358     "low level call of a methods code - BIG DANGER ALERT.
       
   359      Perform the receiver-method on anObject as receiver and argArray as
       
   360      arguments. This does NO message lookup at all and mimics a
       
   361      traditional function call.
   359      This method is provided for debugging- and breakpoint-support;
   362      This method is provided for debugging- and breakpoint-support;
   360      not for general use. The receiver must be a method compiled in
   363      not for general use. The receiver must be a method compiled in
   361      anObjects class or one of its superclasses 
   364      anObjects class or one of its superclasses 
   362      - otherwise strange things (and also strange crashes) can occur. 
   365      - otherwise strange things (and also strange crashes) can occur. 
   363      Be warned."
   366      Be warned."
   364 
   367 
   365     |numArgs a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12|
   368     |a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12|
   366 
   369 
   367     argArray class == Array ifFalse:[
       
   368         ^ self error:'argumentArray must be an Array'
       
   369     ].
       
   370     numArgs := argArray size.
       
   371     numArgs > 12 ifTrue:[
       
   372         ^ self error:'too many arguments'
       
   373     ].
       
   374 %{
   370 %{
   375     OBJFUNC code;
   371     OBJFUNC code;
   376     OBJ searchClass;
   372     OBJ searchClass;
   377     static struct inlineCache dummy = _DUMMYILC0;
   373     static struct inlineCache dummy = _DUMMYILC0;
       
   374     int nargs;
       
   375     OBJ *ap;
       
   376 
       
   377     if (_isArray(argArray)) {
       
   378         nargs = _arraySize(argArray);
       
   379 	ap = _ArrayInstPtr(argArray)->a_element;
       
   380     } else {
       
   381 	if (argArray == nil) {
       
   382 	    nargs = 0;
       
   383 	} else
       
   384 	    nargs = -1;
       
   385     }
   378 
   386 
   379     code = _MethodInstPtr(self)->m_code;
   387     code = _MethodInstPtr(self)->m_code;
   380     searchClass = dummy.ilc_class = _Class(anObject);
   388     searchClass = dummy.ilc_class = _Class(anObject);
   381     switch (_intVal(numArgs)) {
   389     switch (nargs) {
   382         case 0:
   390         case 0:
   383             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy) );
   391             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy) );
   384 
   392 
   385         case 1:
   393         case 1:
   386             a1 = _ArrayInstPtr(argArray)->a_element[0];
   394 #ifdef PASS_ARG_REF
   387 #ifdef PASS_ARG_REF
   395             a1 = ap[0];
   388             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   396             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1 );
   389 #else
   397 #else
   390             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1) );
   398             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0]) );
   391 #endif
   399 #endif
   392 
   400 
   393         case 2:
   401         case 2:
   394             a1 = _ArrayInstPtr(argArray)->a_element[0];
   402 #ifdef PASS_ARG_REF
   395             a2 = _ArrayInstPtr(argArray)->a_element[1];
   403             a1 = ap[0];
   396 #ifdef PASS_ARG_REF
   404             a2 = ap[1];
   397             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   405             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   398 #else
   406 #else
   399             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2) );
   407             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1]) );
   400 #endif
   408 #endif
   401 
   409 
   402         case 3:
   410         case 3:
   403             a1 = _ArrayInstPtr(argArray)->a_element[0];
   411 #ifdef PASS_ARG_REF
   404             a2 = _ArrayInstPtr(argArray)->a_element[1];
   412             a1 = ap[0];
   405             a3 = _ArrayInstPtr(argArray)->a_element[2];
   413             a2 = ap[1];
   406 #ifdef PASS_ARG_REF
   414             a3 = ap[2];
   407             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   415             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   408 #else
   416 #else
   409             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3) );
   417             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2]) );
   410 #endif
   418 #endif
   411 
   419 
   412         case 4:
   420         case 4:
   413             a1 = _ArrayInstPtr(argArray)->a_element[0];
   421 #ifdef PASS_ARG_REF
   414             a2 = _ArrayInstPtr(argArray)->a_element[1];
   422             a1 = ap[0];
   415             a3 = _ArrayInstPtr(argArray)->a_element[2];
   423             a2 = ap[1];
   416             a4 = _ArrayInstPtr(argArray)->a_element[3];
   424             a3 = ap[2];
   417 #ifdef PASS_ARG_REF
   425             a4 = ap[3];
   418             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   426             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   419 #else
   427 #else
   420             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4) );
   428             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3]) );
   421 #endif
   429 #endif
   422 
   430 
   423         case 5:
   431         case 5:
   424             a1 = _ArrayInstPtr(argArray)->a_element[0];
   432 #ifdef PASS_ARG_REF
   425             a2 = _ArrayInstPtr(argArray)->a_element[1];
   433             a1 = ap[0];
   426             a3 = _ArrayInstPtr(argArray)->a_element[2];
   434             a2 = ap[1];
   427             a4 = _ArrayInstPtr(argArray)->a_element[3];
   435             a3 = ap[2];
   428             a5 = _ArrayInstPtr(argArray)->a_element[4];
   436             a4 = ap[3];
   429 #ifdef PASS_ARG_REF
   437             a5 = ap[4];
   430             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   438             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   431 #else
   439 #else
   432             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5) );
   440             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4]) );
   433 #endif
   441 #endif
   434 
   442 
   435         case 6:
   443         case 6:
   436             a1 = _ArrayInstPtr(argArray)->a_element[0];
   444 #ifdef PASS_ARG_REF
   437             a2 = _ArrayInstPtr(argArray)->a_element[1];
   445             a1 = ap[0];
   438             a3 = _ArrayInstPtr(argArray)->a_element[2];
   446             a2 = ap[1];
   439             a4 = _ArrayInstPtr(argArray)->a_element[3];
   447             a3 = ap[2];
   440             a5 = _ArrayInstPtr(argArray)->a_element[4];
   448             a4 = ap[3];
   441             a6 = _ArrayInstPtr(argArray)->a_element[5];
   449             a5 = ap[4];
   442 #ifdef PASS_ARG_REF
   450             a6 = ap[5];
   443             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   451             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   444 #else
   452 #else
   445             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6) );
   453             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
       
   454 									   ap[5]) );
   446 #endif
   455 #endif
   447 
   456 
   448         case 7:
   457         case 7:
   449             a1 = _ArrayInstPtr(argArray)->a_element[0];
   458 #ifdef PASS_ARG_REF
   450             a2 = _ArrayInstPtr(argArray)->a_element[1];
   459             a1 = ap[0];
   451             a3 = _ArrayInstPtr(argArray)->a_element[2];
   460             a2 = ap[1];
   452             a4 = _ArrayInstPtr(argArray)->a_element[3];
   461             a3 = ap[2];
   453             a5 = _ArrayInstPtr(argArray)->a_element[4];
   462             a4 = ap[3];
   454             a6 = _ArrayInstPtr(argArray)->a_element[5];
   463             a5 = ap[4];
   455             a7 = _ArrayInstPtr(argArray)->a_element[6];
   464             a6 = ap[5];
   456 #ifdef PASS_ARG_REF
   465             a7 = ap[6];
   457             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   466             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   458 #else
   467 #else
   459             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7) );
   468             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
       
   469 									   ap[5], ap[6]) );
   460 #endif
   470 #endif
   461 
   471 
   462         case 8:
   472         case 8:
   463             a1 = _ArrayInstPtr(argArray)->a_element[0];
   473 #ifdef PASS_ARG_REF
   464             a2 = _ArrayInstPtr(argArray)->a_element[1];
   474             a1 = ap[0];
   465             a3 = _ArrayInstPtr(argArray)->a_element[2];
   475             a2 = ap[1];
   466             a4 = _ArrayInstPtr(argArray)->a_element[3];
   476             a3 = ap[2];
   467             a5 = _ArrayInstPtr(argArray)->a_element[4];
   477             a4 = ap[3];
   468             a6 = _ArrayInstPtr(argArray)->a_element[5];
   478             a5 = ap[4];
   469             a7 = _ArrayInstPtr(argArray)->a_element[6];
   479             a6 = ap[5];
   470             a8 = _ArrayInstPtr(argArray)->a_element[7];
   480             a7 = ap[6];
   471 #ifdef PASS_ARG_REF
   481             a8 = ap[7];
   472             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   482             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   473 #else
   483 #else
   474             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7, a8) );
   484             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
       
   485 									   ap[5], ap[6], ap[7]) );
   475 #endif
   486 #endif
   476 
   487 
   477         case 9:
   488         case 9:
   478             a1 = _ArrayInstPtr(argArray)->a_element[0];
   489 #ifdef PASS_ARG_REF
   479             a2 = _ArrayInstPtr(argArray)->a_element[1];
   490             a1 = ap[0];
   480             a3 = _ArrayInstPtr(argArray)->a_element[2];
   491             a2 = ap[1];
   481             a4 = _ArrayInstPtr(argArray)->a_element[3];
   492             a3 = ap[2];
   482             a5 = _ArrayInstPtr(argArray)->a_element[4];
   493             a4 = ap[3];
   483             a6 = _ArrayInstPtr(argArray)->a_element[5];
   494             a5 = ap[4];
   484             a7 = _ArrayInstPtr(argArray)->a_element[6];
   495             a6 = ap[5];
   485             a8 = _ArrayInstPtr(argArray)->a_element[7];
   496             a7 = ap[6];
   486             a9 = _ArrayInstPtr(argArray)->a_element[8];
   497             a8 = ap[7];
   487 #ifdef PASS_ARG_REF
   498             a9 = ap[8];
   488             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   499             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   489 #else
   500 #else
   490             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7, a8, a9) );
   501             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
       
   502 									   ap[5], ap[6], ap[7], ap[8]) );
   491 #endif
   503 #endif
   492 
   504 
   493         case 10:
   505         case 10:
   494             a1 = _ArrayInstPtr(argArray)->a_element[0];
   506 #ifdef PASS_ARG_REF
   495             a2 = _ArrayInstPtr(argArray)->a_element[1];
   507             a1 = ap[0];
   496             a3 = _ArrayInstPtr(argArray)->a_element[2];
   508             a2 = ap[1];
   497             a4 = _ArrayInstPtr(argArray)->a_element[3];
   509             a3 = ap[2];
   498             a5 = _ArrayInstPtr(argArray)->a_element[4];
   510             a4 = ap[3];
   499             a6 = _ArrayInstPtr(argArray)->a_element[5];
   511             a5 = ap[4];
   500             a7 = _ArrayInstPtr(argArray)->a_element[6];
   512             a6 = ap[5];
   501             a8 = _ArrayInstPtr(argArray)->a_element[7];
   513             a7 = ap[6];
   502             a9 = _ArrayInstPtr(argArray)->a_element[8];
   514             a8 = ap[7];
   503             a10 = _ArrayInstPtr(argArray)->a_element[9];
   515             a9 = ap[8];
   504 #ifdef PASS_ARG_REF
   516             a10 = ap[9];
   505             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   517             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   506 #else
   518 #else
   507             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) );
   519             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
       
   520 									   ap[5], ap[6], ap[7], ap[8], ap[9]) );
   508 #endif
   521 #endif
   509 
   522 
   510         case 11:
   523         case 11:
   511             a1 = _ArrayInstPtr(argArray)->a_element[0];
   524 #ifdef PASS_ARG_REF
   512             a2 = _ArrayInstPtr(argArray)->a_element[1];
   525             a1 = ap[0];
   513             a3 = _ArrayInstPtr(argArray)->a_element[2];
   526             a2 = ap[1];
   514             a4 = _ArrayInstPtr(argArray)->a_element[3];
   527             a3 = ap[2];
   515             a5 = _ArrayInstPtr(argArray)->a_element[4];
   528             a4 = ap[3];
   516             a6 = _ArrayInstPtr(argArray)->a_element[5];
   529             a5 = ap[4];
   517             a7 = _ArrayInstPtr(argArray)->a_element[6];
   530             a6 = ap[5];
   518             a8 = _ArrayInstPtr(argArray)->a_element[7];
   531             a7 = ap[6];
   519             a9 = _ArrayInstPtr(argArray)->a_element[8];
   532             a8 = ap[7];
   520             a10 = _ArrayInstPtr(argArray)->a_element[9];
   533             a9 = ap[8];
   521             a11 = _ArrayInstPtr(argArray)->a_element[10];
   534             a10 = ap[9];
   522 #ifdef PASS_ARG_REF
   535             a11 = ap[10];
   523             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   536             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   524 #else
   537 #else
   525             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) );
   538             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
       
   539 									   ap[5], ap[6], ap[7], ap[8], ap[9], 
       
   540 									   ap[10]) );
   526 #endif
   541 #endif
   527 
   542 
   528         case 12:
   543         case 12:
   529             a1 = _ArrayInstPtr(argArray)->a_element[0];
   544 #ifdef PASS_ARG_REF
   530             a2 = _ArrayInstPtr(argArray)->a_element[1];
   545             a1 = ap[0];
   531             a3 = _ArrayInstPtr(argArray)->a_element[2];
   546             a2 = ap[1];
   532             a4 = _ArrayInstPtr(argArray)->a_element[3];
   547             a3 = ap[2];
   533             a5 = _ArrayInstPtr(argArray)->a_element[4];
   548             a4 = ap[3];
   534             a6 = _ArrayInstPtr(argArray)->a_element[5];
   549             a5 = ap[4];
   535             a7 = _ArrayInstPtr(argArray)->a_element[6];
   550             a6 = ap[5];
   536             a8 = _ArrayInstPtr(argArray)->a_element[7];
   551             a7 = ap[6];
   537             a9 = _ArrayInstPtr(argArray)->a_element[8];
   552             a8 = ap[7];
   538             a10 = _ArrayInstPtr(argArray)->a_element[9];
   553             a9 = ap[8];
   539             a11 = _ArrayInstPtr(argArray)->a_element[10];
   554             a10 = ap[9];
   540             a12 = _ArrayInstPtr(argArray)->a_element[11];
   555             a11 = ap[10];
   541 #ifdef PASS_ARG_REF
   556             a12 = ap[11];
   542             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   557             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, &a1) );
   543 #else
   558 #else
   544             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) );
   559             RETURN ( (*code)(anObject, nil, SND_COMMA searchClass, &dummy, ap[0], ap[1], ap[2], ap[3], ap[4], 
       
   560 									   ap[5], ap[6], ap[7], ap[8], ap[9], 
       
   561 									   ap[10], ap[11]) );
   545 #endif
   562 #endif
   546     }
   563     }
   547 %}
   564 %}
       
   565 .
       
   566     (argArray isMemberOf:Array) ifFalse:[
       
   567         ^ self error:'argumentArray must be an Array'
       
   568     ].
       
   569     ^ self error:'too many arguments'
       
   570 
   548     "(String compiledMethodAt:#print) valueWithReceiver:'hello' arguments:#()"
   571     "(String compiledMethodAt:#print) valueWithReceiver:'hello' arguments:#()"
   549     "(Float compiledMethodAt:#+) valueWithReceiver:1.0 arguments:#(2.0)"
   572     "(Float compiledMethodAt:#+) valueWithReceiver:1.0 arguments:#(2.0)"
       
   573     "the next example is a wrong one - but will not crash the system ..."
       
   574     "(True compiledMethodAt:#printString) valueWithReceiver:false arguments:nil"
   550 ! !
   575 ! !
   551 
   576 
   552 !Method methodsFor:'printing'!
   577 !Method methodsFor:'printing'!
   553 
   578 
   554 printOn:aStream
   579 printOn:aStream