--- a/ProtoObject.st Tue Dec 06 07:06:38 2016 +0100
+++ b/ProtoObject.st Sun Dec 18 11:19:27 2016 +0000
@@ -159,6 +159,497 @@
valueWithReceiver:self
arguments:{index}
selector:#instVarAt:
+!
+
+isKindOf:aBehavior
+ "this method is required Behavior>>#allSubInstancesDo:"
+
+ aBehavior == Object ifTrue:[^ true].
+
+ ^ (Object compiledMethodAt:#isKindOf:)
+ valueWithReceiver:self
+ arguments:{aBehavior}
+ selector:#isKindOf:
+!
+
+perform:aSelector
+ "this method is required to allow inspection of the object"
+
+ ^ self perform:aSelector withArguments:#().
+!
+
+perform:aSelector with:arg1
+ "this method is required to allow inspection of the object"
+
+ ^ self perform:aSelector withArguments:{arg1}.
+!
+
+perform:aSelector with:arg1 with:arg2
+ "this method is required to allow inspection of the object"
+
+ ^ self perform:aSelector withArguments:{arg1. arg2}.
+!
+
+perform:aSelector with:arg1 with:arg2 with:arg3
+ "this method is required to allow inspection of the object"
+
+ ^ self perform:aSelector withArguments:{arg1. arg2. arg3}.
+!
+
+perform:aSelector with:arg1 with:arg2 with:arg3 with:arg4
+ "this method is required to allow inspection of the object"
+
+ ^ self perform:aSelector withArguments:{arg1. arg2. arg3. arg4}.
+!
+
+perform:aSelector with:arg1 with:arg2 with:arg3 with:arg4 with:arg5
+ "this method is required to allow inspection of the object"
+
+ ^ self perform:aSelector withArguments:{arg1. arg2. arg3. arg4. arg5}.
+!
+
+perform:aSelector with:arg1 with:arg2 with:arg3 with:arg4 with:arg5 with:arg6
+ "this method is required to allow inspection of the object"
+
+ ^ self perform:aSelector withArguments:{arg1. arg2. arg3. arg4. arg5. arg6}.
+!
+
+perform:aSelector withArguments:argArray
+ "send the message aSelector with all args taken from argArray
+ to the receiver.
+
+ 1-to-1 Copy from the same method in Object!!"
+
+ |numberOfArgs a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15|
+
+%{
+#ifdef __SCHTEAM__
+ return context.PERFORM_WITH_ARGUMENTS(self, aSelector, argArray);
+#else
+ REGISTER OBJ *argP;
+ int nargs;
+ OBJ l;
+
+ if (__isArrayLike(argArray)) {
+ nargs = __arraySize(argArray);
+ argP = __arrayVal(argArray);
+ } else {
+ if (__isNonNilObject(argArray)) {
+ static struct inlineCache ilcSize = __ILC0(@line);
+ int i;
+
+ numberOfArgs = (*ilcSize.ilc_func)(argArray, @symbol(size), nil, &ilcSize);
+ if (!__isSmallInteger(numberOfArgs))
+ goto bad;
+ nargs = __intVal(numberOfArgs);
+ argP = (OBJ *)(&a1);
+ for (i=1; i <= nargs; i++) {
+ *argP++ = __AT_(argArray, __mkSmallInteger(i));
+ }
+ argP = (OBJ *)(&a1);
+ } else {
+ nargs = 0;
+ }
+ }
+ switch (nargs) {
+ case 0:
+ if (InterruptPending == nil) {
+ static OBJ last0_0 = nil; static struct inlineCache ilc0_0 = __ILCPERF0(@line);
+ static OBJ last0_1 = nil; static struct inlineCache ilc0_1 = __ILCPERF0(@line);
+ static OBJ last0_2 = nil; static struct inlineCache ilc0_2 = __ILCPERF0(@line);
+ static OBJ last0_3 = nil; static struct inlineCache ilc0_3 = __ILCPERF0(@line);
+ static int flip0 = 0;
+ struct inlineCache *pIlc;
+
+ if (aSelector == last0_0) {
+ pIlc = &ilc0_0;
+ } else if (aSelector == last0_1) {
+ pIlc = &ilc0_1;
+ } else if (aSelector == last0_2) {
+ pIlc = &ilc0_2;
+ } else if (aSelector == last0_3) {
+ pIlc = &ilc0_3;
+ } else {
+ if (flip0 == 0) {
+ pIlc = &ilc0_0;
+ flip0 = 1;
+ last0_0 = aSelector;
+ } else if (flip0 == 1) {
+ pIlc = &ilc0_1;
+ flip0 = 2;
+ last0_1 = aSelector;
+ } else if (flip0 == 2) {
+ pIlc = &ilc0_2;
+ flip0 = 3;
+ last0_2 = aSelector;
+ } else {
+ pIlc = &ilc0_3;
+ flip0 = 0;
+ last0_3 = aSelector;
+ }
+
+ pIlc->ilc_func = __SEND0ADDR__;
+ if (pIlc->ilc_poly) {
+ __flushPolyCache(pIlc->ilc_poly);
+ pIlc->ilc_poly = 0;
+ }
+ }
+ RETURN ((*pIlc->ilc_func)(self, aSelector, nil, pIlc));
+ } else {
+ static struct inlineCache ilc0 = __DUMMYILCSELF0(@line+1);
+ RETURN (_SEND0(self, aSelector, nil, &ilc0));
+ }
+
+ case 1:
+ if (InterruptPending == nil) {
+ static OBJ last1_0 = nil; static struct inlineCache ilc1_0 = __ILCPERF1(@line);
+ static OBJ last1_1 = nil; static struct inlineCache ilc1_1 = __ILCPERF1(@line);
+ static OBJ last1_2 = nil; static struct inlineCache ilc1_2 = __ILCPERF1(@line);
+ static OBJ last1_3 = nil; static struct inlineCache ilc1_3 = __ILCPERF1(@line);
+ static int flip1 = 0;
+ struct inlineCache *pIlc;
+
+ if (aSelector == last1_0) {
+ pIlc = &ilc1_0;
+ } else if (aSelector == last1_1) {
+ pIlc = &ilc1_1;
+ } else if (aSelector == last1_2) {
+ pIlc = &ilc1_2;
+ } else if (aSelector == last1_3) {
+ pIlc = &ilc1_3;
+ } else {
+ if (flip1 == 0) {
+ pIlc = &ilc1_0;
+ flip1 = 1;
+ last1_0 = aSelector;
+ } else if (flip1 == 1) {
+ pIlc = &ilc1_1;
+ flip1 = 2;
+ last1_1 = aSelector;
+ } else if (flip1 == 2) {
+ pIlc = &ilc1_2;
+ flip1 = 3;
+ last1_2 = aSelector;
+ } else {
+ pIlc = &ilc1_3;
+ flip1 = 0;
+ last1_3 = aSelector;
+ }
+
+ pIlc->ilc_func = __SEND1ADDR__;
+ if (pIlc->ilc_poly) {
+ __flushPolyCache(pIlc->ilc_poly);
+ pIlc->ilc_poly = 0;
+ }
+ }
+ RETURN ((*pIlc->ilc_func)(self, aSelector, nil, pIlc, argP[0]));
+ } else {
+ static struct inlineCache ilc1 = __DUMMYILCSELF1(@line+1);
+ RETURN (_SEND1(self, aSelector, nil, &ilc1, argP[0]));
+ }
+
+ case 2:
+ if (InterruptPending == nil) {
+ static OBJ last2_0 = nil; static struct inlineCache ilc2_0 = __ILCPERF2(@line);
+ static OBJ last2_1 = nil; static struct inlineCache ilc2_1 = __ILCPERF2(@line);
+ static int flip2 = 0;
+ struct inlineCache *pIlc;
+
+ if (aSelector == last2_0) {
+ pIlc = &ilc2_0;
+ } else if (aSelector == last2_1) {
+ pIlc = &ilc2_1;
+ } else {
+ if (flip2 == 0) {
+ pIlc = &ilc2_0;
+ flip2 = 1;
+ last2_0 = aSelector;
+ } else {
+ pIlc = &ilc2_1;
+ flip2 = 0;
+ last2_1 = aSelector;
+ }
+
+ pIlc->ilc_func = __SEND2ADDR__;
+ if (pIlc->ilc_poly) {
+ __flushPolyCache(pIlc->ilc_poly);
+ pIlc->ilc_poly = 0;
+ }
+ }
+ RETURN ((*pIlc->ilc_func)(self, aSelector, nil, pIlc, argP[0], argP[1]));
+ } else {
+ static struct inlineCache ilc2 = __DUMMYILCSELF2(@line+1);
+ RETURN (_SEND2(self, aSelector, nil, &ilc2, argP[0], argP[1]));
+ }
+
+ case 3:
+ if (InterruptPending == nil) {
+ static OBJ last3_0 = nil; static struct inlineCache ilc3_0 = __ILCPERF3(@line);
+ static OBJ last3_1 = nil; static struct inlineCache ilc3_1 = __ILCPERF3(@line);
+ static int flip3 = 0;
+ struct inlineCache *pIlc;
+
+ if (aSelector == last3_0) {
+ pIlc = &ilc3_0;
+ } else if (aSelector == last3_1) {
+ pIlc = &ilc3_1;
+ } else {
+ if (flip3 == 0) {
+ pIlc = &ilc3_0;
+ flip3 = 1;
+ last3_0 = aSelector;
+ } else {
+ pIlc = &ilc3_1;
+ flip3 = 0;
+ last3_1 = aSelector;
+ }
+
+ pIlc->ilc_func = __SEND3ADDR__;
+ if (pIlc->ilc_poly) {
+ __flushPolyCache(pIlc->ilc_poly);
+ pIlc->ilc_poly = 0;
+ }
+ }
+ RETURN ((*pIlc->ilc_func)(self, aSelector, nil, pIlc, argP[0], argP[1], argP[2]));
+ } else {
+ static struct inlineCache ilc3 = __DUMMYILCSELF3(@line+1);
+ RETURN (_SEND3(self, aSelector, nil, &ilc3, argP[0], argP[1], argP[2]));
+ }
+
+ case 4:
+ {
+ static OBJ last4 = nil; static struct inlineCache ilc4 = __ILCPERF4(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last4)) {
+ ilc4.ilc_func = __SEND4ADDR__;
+ if (ilc4.ilc_poly) {
+ __flushPolyCache(ilc4.ilc_poly);
+ ilc4.ilc_poly = 0;
+ }
+ last4 = aSelector;
+ }
+ RETURN ( (*ilc4.ilc_func)(self, aSelector, nil, &ilc4,
+ argP[0], argP[1], argP[2], argP[3]));
+ }
+
+ case 5:
+ {
+ static OBJ last5 = nil; static struct inlineCache ilc5 = __ILCPERF5(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last5)) {
+ ilc5.ilc_func = __SEND5ADDR__;
+ if (ilc5.ilc_poly) {
+ __flushPolyCache(ilc5.ilc_poly);
+ ilc5.ilc_poly = 0;
+ }
+ last5 = aSelector;
+ }
+ RETURN ( (*ilc5.ilc_func)(self, aSelector, nil, &ilc5,
+ argP[0], argP[1], argP[2], argP[3], argP[4]));
+ }
+
+ case 6:
+ {
+ static OBJ last6 = nil; static struct inlineCache ilc6 = __ILCPERF6(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last6)) {
+ ilc6.ilc_func = __SEND6ADDR__;
+ if (ilc6.ilc_poly) {
+ __flushPolyCache(ilc6.ilc_poly);
+ ilc6.ilc_poly = 0;
+ }
+ last6 = aSelector;
+ }
+ RETURN ( (*ilc6.ilc_func)(self, aSelector, nil, &ilc6,
+ argP[0], argP[1], argP[2], argP[3], argP[4],
+ argP[5]));
+ }
+
+ case 7:
+ {
+ static OBJ last7 = nil; static struct inlineCache ilc7 = __ILCPERF7(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last7)) {
+ ilc7.ilc_func = __SEND7ADDR__;
+ if (ilc7.ilc_poly) {
+ __flushPolyCache(ilc7.ilc_poly);
+ ilc7.ilc_poly = 0;
+ }
+ last7 = aSelector;
+ }
+ RETURN ( (*ilc7.ilc_func)(self, aSelector, nil, &ilc7,
+ argP[0], argP[1], argP[2], argP[3], argP[4],
+ argP[5], argP[6]));
+ }
+
+ case 8:
+ {
+ static OBJ last8 = nil; static struct inlineCache ilc8 = __ILCPERF8(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last8)) {
+ ilc8.ilc_func = __SEND8ADDR__;
+ if (ilc8.ilc_poly) {
+ __flushPolyCache(ilc8.ilc_poly);
+ ilc8.ilc_poly = 0;
+ }
+ last8 = aSelector;
+ }
+ RETURN ( (*ilc8.ilc_func)(self, aSelector, nil, &ilc8,
+ argP[0], argP[1], argP[2], argP[3], argP[4],
+ argP[5], argP[6], argP[7]));
+ }
+
+ case 9:
+ {
+ static OBJ last9 = nil; static struct inlineCache ilc9 = __ILCPERF9(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last9)) {
+ ilc9.ilc_func = __SEND9ADDR__;
+ if (ilc9.ilc_poly) {
+ __flushPolyCache(ilc9.ilc_poly);
+ ilc9.ilc_poly = 0;
+ }
+ last9 = aSelector;
+ }
+ RETURN ( (*ilc9.ilc_func)(self, aSelector, nil, &ilc9,
+ argP[0], argP[1], argP[2], argP[3], argP[4],
+ argP[5], argP[6], argP[7], argP[8]));
+ }
+
+ case 10:
+ {
+ static OBJ last10 = nil; static struct inlineCache ilc10 = __ILCPERF10(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last10)) {
+ ilc10.ilc_func = __SEND10ADDR__;
+ if (ilc10.ilc_poly) {
+ __flushPolyCache(ilc10.ilc_poly);
+ ilc10.ilc_poly = 0;
+ }
+ last10 = aSelector;
+ }
+ RETURN ( (*ilc10.ilc_func)(self, aSelector, nil, &ilc10,
+ argP[0], argP[1], argP[2], argP[3], argP[4],
+ argP[5], argP[6], argP[7], argP[8], argP[9]));
+ }
+
+ case 11:
+ {
+ static OBJ last11 = nil; static struct inlineCache ilc11 = __ILCPERF11(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last11)) {
+ ilc11.ilc_func = __SEND11ADDR__;
+ if (ilc11.ilc_poly) {
+ __flushPolyCache(ilc11.ilc_poly);
+ ilc11.ilc_poly = 0;
+ }
+ last11 = aSelector;
+ }
+ RETURN ( (*ilc11.ilc_func)(self, aSelector, nil, &ilc11,
+ argP[0], argP[1], argP[2], argP[3], argP[4],
+ argP[5], argP[6], argP[7], argP[8], argP[9],
+ argP[10]));
+ }
+
+ case 12:
+ {
+ static OBJ last12 = nil; static struct inlineCache ilc12 = __ILCPERF12(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last12)) {
+ ilc12.ilc_func = __SEND12ADDR__;
+ if (ilc12.ilc_poly) {
+ __flushPolyCache(ilc12.ilc_poly);
+ ilc12.ilc_poly = 0;
+ }
+ last12 = aSelector;
+ }
+ RETURN ( (*ilc12.ilc_func)(self, aSelector, nil, &ilc12,
+ argP[0], argP[1], argP[2], argP[3], argP[4],
+ argP[5], argP[6], argP[7], argP[8], argP[9],
+ argP[10], argP[11]));
+ }
+
+ case 13:
+ {
+ static OBJ last13 = nil; static struct inlineCache ilc13 = __ILCPERF13(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last13)) {
+ ilc13.ilc_func = __SEND13ADDR__;
+ if (ilc13.ilc_poly) {
+ __flushPolyCache(ilc13.ilc_poly);
+ ilc13.ilc_poly = 0;
+ }
+ last13 = aSelector;
+ }
+ RETURN ( (*ilc13.ilc_func)(self, aSelector, nil, &ilc13,
+ argP[0], argP[1], argP[2], argP[3], argP[4],
+ argP[5], argP[6], argP[7], argP[8], argP[9],
+ argP[10], argP[11], argP[12]));
+ }
+
+ case 14:
+ {
+ static OBJ last14 = nil; static struct inlineCache ilc14 = __ILCPERF14(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last14)) {
+ ilc14.ilc_func = __SEND14ADDR__;
+ if (ilc14.ilc_poly) {
+ __flushPolyCache(ilc14.ilc_poly);
+ ilc14.ilc_poly = 0;
+ }
+ last14 = aSelector;
+ }
+ RETURN ( (*ilc14.ilc_func)(self, aSelector, nil, &ilc14,
+ argP[0], argP[1], argP[2], argP[3], argP[4],
+ argP[5], argP[6], argP[7], argP[8], argP[9],
+ argP[10], argP[11], argP[12], argP[13]));
+ }
+
+ case 15:
+ {
+ static OBJ last15 = nil; static struct inlineCache ilc15 = __ILCPERF15(@line);
+
+ if ((InterruptPending != nil) || (aSelector != last15)) {
+ ilc15.ilc_func = __SEND15ADDR__;
+ if (ilc15.ilc_poly) {
+ __flushPolyCache(ilc15.ilc_poly);
+ ilc15.ilc_poly = 0;
+ }
+ last15 = aSelector;
+ }
+ RETURN ( (*ilc15.ilc_func)(self, aSelector, nil, &ilc15,
+ argP[0], argP[1], argP[2], argP[3], argP[4],
+ argP[5], argP[6], argP[7], argP[8], argP[9],
+ argP[10], argP[11], argP[12], argP[13],
+ argP[14]));
+ }
+ }
+bad:;
+#endif
+%}.
+
+ "/ arrive here, if bad number of arguments (too many)
+ "/ ST/X (currently) only allows up to 15 method arguments
+
+ ^ self primitiveFailed
+!
+
+referencesAny:anObject
+ "this method is required to allow inspection of the object"
+
+ ^ (Object compiledMethodAt:#referencesAny:)
+ valueWithReceiver:self
+ arguments:{anObject}
+ selector:#referencesAny
+!
+
+referencesObject:anObject
+ "this method is required to allow inspection of the object"
+
+ ^ (Object compiledMethodAt:#referencesObject:)
+ valueWithReceiver:self
+ arguments:{anObject}
+ selector:#referencesObject
! !
!ProtoObject methodsFor:'queries'!