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 |