<div dir="ltr"><div><div><div>As suggested by Eliot, the class checks could be defined as macros in the plugin preamble (if internal plugin and if SPURVM...), but this should also be the case of many other vm api selectors (like isIntegerObject: etc...).<br><br></div>As suggested by Levente, this could as well be generalized by link time optimization options of clang/gcc (-flto)...<br></div>Or by aggregating vm and internal plugins into a single source file.<br></div>We&#39;ll see later.<br></div><div class="gmail_extra"><br><div class="gmail_quote">2016-04-20 1:04 GMT+02:00  <span dir="ltr">&lt;<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1813.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1813.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: VMMaker.oscog-nice.1813<br>
Author: nice<br>
Time: 20 April 2016, 1:02:48.617 am<br>
UUID: 9ce7e2b2-2956-4228-9744-345c61a693ed<br>
Ancestors: VMMaker.oscog-nice.1812<br>
<br>
Revert elimination of type specifications for LargeIntegersPlugin.<br>
<br>
Instead, provide a bunch of Integer type checking.<br>
- isIntegerObject: &lt;=&gt; isMemberOf: SmallInteger (already existing)<br>
- isKindOfInteger: &lt;=&gt; isKindOf: Integer<br>
- isLargeIntegerObject= &lt;=&gt; isKindOf: LargePositiveInteger (Squeak) or LargeInteger (Pharo)<br>
- isLargePositiveIntegerObject: &lt;=&gt; isMemberOf: LargePositiveInteger<br>
- isLargeNegativeIntegerObject: &lt;=&gt; isMemberOf: LargeNegativeInteger<br>
<br>
Note that this will require a change of svn source for platforms/Cross/vm/sqVirtalMachine.[ch]<br>
<br>
=============== Diff against VMMaker.oscog-nice.1812 ===============<br>
<br>
Item was changed:<br>
  ----- Method: FFIPlugin&gt;&gt;ffiPushUnsignedLongLongOop: (in category &#39;callout support&#39;) -----<br>
  ffiPushUnsignedLongLongOop: oop<br>
        &quot;Push a longlong type (e.g., a 64bit integer).<br>
        Note: Coercions from float are *not* supported.&quot;<br>
        | lowWord highWord length ptr |<br>
        &lt;var: #ptr type:&#39;unsigned char *&#39;&gt;<br>
        oop == interpreterProxy nilObject<br>
                ifTrue:[^self ffiPushUnsignedLong: 0 Long: 0.]. &quot;@@: check this&quot;<br>
        oop == interpreterProxy falseObject<br>
                ifTrue:[^self ffiPushUnsignedLong: 0 Long: 0].<br>
        oop == interpreterProxy trueObject<br>
                ifTrue:[^self ffiPushUnsignedLong: 0 Long: 1].<br>
        (interpreterProxy isIntegerObject: oop) ifTrue:[<br>
                lowWord := interpreterProxy integerValueOf: oop.<br>
                lowWord &lt; 0 ifTrue:[^self ffiFail: FFIErrorCoercionFailed].<br>
                highWord := 0.<br>
        ] ifFalse:[<br>
+               (interpreterProxy isLargePositiveIntegerObject: oop)<br>
-               (interpreterProxy fetchClassOf: oop) = interpreterProxy classLargePositiveInteger<br>
                        ifFalse:[^interpreterProxy primitiveFail].<br>
                (interpreterProxy isBytes: oop) ifFalse:[^self ffiFail: FFIErrorCoercionFailed].<br>
                length := interpreterProxy byteSizeOf: oop.<br>
                length &gt; 8 ifTrue:[^self ffiFail: FFIErrorCoercionFailed].<br>
                lowWord := highWord := 0.<br>
                ptr := interpreterProxy firstIndexableField: oop.<br>
                0 to: (length min: 4)-1 do:[:i|<br>
                        lowWord := lowWord + ((ptr at: i) &lt;&lt; (i*8))].<br>
                0 to: (length-5) do:[:i|<br>
                        highWord := highWord + ((ptr at: i+4) &lt;&lt; (i*8))].<br>
        ].<br>
        ^self ffiPushUnsignedLong: lowWord Long: highWord.!<br>
<br>
Item was changed:<br>
  ----- Method: IA32ABIPlugin&gt;&gt;primAlienReplace (in category &#39;primitives-accessing&#39;) -----<br>
  primAlienReplace<br>
        &quot;Copy some number of bytes from some source object starting at the index<br>
         into the receiver destination object  from startIndex to stopIndex .  The  source<br>
         and destination may be Aliens or byte-indexable objects.  The primitive wll have either<br>
        of the following signatures:<br>
        &lt;Alien | indexableByteSubclass | indexableWordSubclass&gt;<br>
                primReplaceFrom: start &lt;Integer&gt;<br>
                to: stop &lt;Integer&gt;<br>
                with: replacement &lt;Alien | indexableByteSubclass | indexableWordSubclass | Integer&gt;<br>
                startingAt: repStart &lt;Integer&gt; ^&lt;self&gt;<br>
                &lt;primitive: &#39;primitiveAlienReplace&#39; error: errorCode module: &#39;IA32ABI&#39;&gt;<br>
        &lt;Anywhere&gt;<br>
                primReplaceIn: dest &lt;Alien | indexableByteSubclass | indexableWordSubclass&gt;<br>
                from: start &lt;Integer&gt;<br>
                to: stop &lt;Integer&gt;<br>
                with: replacement &lt;Alien | indexableByteSubclass | indexableWordSubclass | Integer&gt;<br>
                startingAt: repStart &lt;Integer&gt; ^&lt;self&gt;<br>
                &lt;primitive: &#39;primitiveAlienReplace&#39; error: errorCode module: &#39;IA32ABI&#39;&gt;<br>
        &quot;<br>
        | array start stop repl replStart dest src totalLength count |<br>
        &lt;export: true&gt;<br>
        array := interpreterProxy stackValue: 4.<br>
        start := interpreterProxy stackIntegerValue: 3.<br>
        stop := interpreterProxy stackIntegerValue: 2.<br>
        repl := interpreterProxy stackValue: 1.<br>
        replStart := interpreterProxy stackIntegerValue: 0.<br>
<br>
        (interpreterProxy failed<br>
         or: [(interpreterProxy isWordsOrBytes: array) not]) ifTrue:<br>
                [^interpreterProxy primitiveFailFor: PrimErrBadArgument].<br>
<br>
        (self isAlien: array)<br>
                ifTrue:<br>
                        [totalLength := self sizeField: array.<br>
                         dest := (self startOfData: array withSize: totalLength) + start - 1.<br>
                         totalLength = 0 &quot;no bounds checks for zero-sized (pointer) Aliens&quot;<br>
                                ifTrue: [totalLength := stop]<br>
                                ifFalse: [totalLength := totalLength abs]]<br>
                ifFalse:<br>
                        [totalLength := interpreterProxy byteSizeOf: array.<br>
                         dest := (self startOfByteData: array) + start - 1].<br>
        (start &gt;= 1 and: [start - 1 &lt;= stop and: [stop &lt;= totalLength]])<br>
                ifFalse: [^interpreterProxy primitiveFailFor: PrimErrBadIndex].<br>
<br>
        (interpreterProxy isIntegerObject: repl)<br>
                ifTrue:<br>
                        [(interpreterProxy integerValueOf: repl) &lt;= 0 ifTrue:<br>
                                [^interpreterProxy primitiveFailFor: PrimErrBadArgument].<br>
                        src := (interpreterProxy integerValueOf: repl) + replStart - 1]<br>
                ifFalse:<br>
+                       [(interpreterProxy isLargePositiveIntegerObject: repl)<br>
-                       [(interpreterProxy fetchClassOf: repl) ==  interpreterProxy classLargePositiveInteger<br>
                                ifTrue:<br>
                                        [src := (interpreterProxy positive32BitValueOf: repl) + replStart - 1.<br>
                                         interpreterProxy failed ifTrue:<br>
                                                [^interpreterProxy primitiveFailFor: PrimErrBadArgument]]<br>
                                ifFalse:<br>
                                        [(self isAlien: repl)<br>
                                                ifTrue:<br>
                                                        [totalLength := self sizeField: repl.<br>
                                                         src := (self startOfData: repl withSize: totalLength) + replStart - 1.<br>
                                                         totalLength = 0 &quot;no bounds checks for zero-sized (pointer) Aliens&quot;<br>
                                                                ifTrue: [totalLength := stop - start + replStart]<br>
                                                                ifFalse: [totalLength := totalLength abs]]<br>
                                                ifFalse:<br>
                                                        [(interpreterProxy isWordsOrBytes: repl) ifFalse:<br>
                                                                [^interpreterProxy primitiveFailFor: PrimErrBadArgument].<br>
                                                         totalLength := interpreterProxy byteSizeOf: repl.<br>
                                                         src := (self startOfByteData: repl) + replStart - 1].<br>
                                        (replStart &gt;= 1 and: [stop - start + replStart &lt;= totalLength]) ifFalse:<br>
                                                [^interpreterProxy primitiveFailFor: PrimErrBadIndex]]].<br>
<br>
        (interpreterProxy isOopImmutable: array) ifTrue:<br>
                [^interpreterProxy primitiveFailFor: PrimErrNoModification].<br>
<br>
        count := stop - start + 1.<br>
        self cCode: &#39;memmove((void *)dest,(void *)src,count)&#39;<br>
                inSmalltalk:<br>
                        [count := count + src + dest. &quot;squash unused var compiler warnings&quot;<br>
                         self error: &#39;not implemented&#39;].<br>
<br>
        interpreterProxy pop: interpreterProxy methodArgumentCount!<br>
<br>
Item was added:<br>
+ ----- Method: Integer class&gt;&gt;ccg:prolog:expr:index: (in category &#39;*VMMaker-plugin generation&#39;) -----<br>
+ ccg: cg prolog: aBlock expr: aString index: anInteger<br>
+<br>
+       ^cg ccgLoad: aBlock expr: aString asKindOfIntegerFrom: anInteger!<br>
<br>
Item was added:<br>
+ ----- Method: Interpreter&gt;&gt;isKindOfInteger: (in category &#39;plugin primitive support&#39;) -----<br>
+ isKindOfInteger: oop<br>
+       &quot;Answer true if the oop is kind of Integer (Small or Large).&quot;<br>
+       &lt;api&gt;<br>
+       &lt;inline: true&gt;<br>
+       ^(self isIntegerObject: oop)<br>
+               or: [self isLargeIntegerInstance: oop]!<br>
<br>
Item was added:<br>
+ ----- Method: Interpreter&gt;&gt;isLargeIntegerObject: (in category &#39;plugin primitive support&#39;) -----<br>
+ isLargeIntegerObject: oop<br>
+       ^(self isLargeIntegerInstance: oop)!<br>
<br>
Item was added:<br>
+ ----- Method: Interpreter&gt;&gt;isLargeNegativeIntegerObject: (in category &#39;plugin primitive support&#39;) -----<br>
+ isLargeNegativeIntegerObject: oop<br>
+       ^(self isInstanceOfClassLargeNegativeInteger: oop)!<br>
<br>
Item was added:<br>
+ ----- Method: Interpreter&gt;&gt;isLargePositiveIntegerObject: (in category &#39;plugin primitive support&#39;) -----<br>
+ isLargePositiveIntegerObject: oop<br>
+       ^(self isInstanceOfClassLargePositiveInteger: oop)!<br>
<br>
Item was removed:<br>
- ----- Method: InterpreterPrimitives&gt;&gt;isInstanceOfClassLargeNegativeInteger: (in category &#39;primitive support&#39;) -----<br>
- isInstanceOfClassLargeNegativeInteger: oop<br>
-       &lt;inline: true&gt;<br>
-       &quot;N.B.  Because Slang always inlines is:instanceOf:compactClassIndex:<br>
-        (because is:instanceOf:compactClassIndex: has an inline: pragma) the<br>
-        phrase (objectMemory splObj: ClassLargeNegativeInteger) is expanded<br>
-        in-place and is _not_ evaluated if oop has a non-zero CompactClassIndex.&quot;<br>
-       ^objectMemory<br>
-               is: oop<br>
-               instanceOf: (objectMemory splObj: ClassLargeNegativeInteger)<br>
-               compactClassIndex: ClassLargeNegativeIntegerCompactIndex!<br>
<br>
Item was removed:<br>
- ----- Method: InterpreterPrimitives&gt;&gt;isInstanceOfClassLargePositiveInteger: (in category &#39;primitive support&#39;) -----<br>
- isInstanceOfClassLargePositiveInteger: oop<br>
-       &lt;inline: true&gt;<br>
-       &quot;N.B.  Because Slang always inlines is:instanceOf:compactClassIndex:<br>
-        (because is:instanceOf:compactClassIndex: has an inline: pragma) the<br>
-        phrase (objectMemory splObj: ClassLargePositiveInteger) is expanded<br>
-        in-place and is _not_ evaluated if oop has a non-zero CompactClassIndex.&quot;<br>
-       ^objectMemory<br>
-               is: oop<br>
-               instanceOf: (objectMemory splObj: ClassLargePositiveInteger)<br>
-               compactClassIndex: ClassLargePositiveIntegerCompactIndex!<br>
<br>
Item was added:<br>
+ ----- Method: InterpreterProxy&gt;&gt;isKindOfInteger: (in category &#39;testing&#39;) -----<br>
+ isKindOfInteger: objectOrientedPointer<br>
+       ^objectOrientedPointer isInteger!<br>
<br>
Item was added:<br>
+ ----- Method: InterpreterProxy&gt;&gt;isLargeIntegerObject: (in category &#39;testing&#39;) -----<br>
+ isLargeIntegerObject: objectOrientedPointer<br>
+       ^objectOrientedPointer isKindOf: LargePositiveInteger!<br>
<br>
Item was added:<br>
+ ----- Method: InterpreterProxy&gt;&gt;isLargeNegativeIntegerObject: (in category &#39;testing&#39;) -----<br>
+ isLargeNegativeIntegerObject: objectOrientedPointer<br>
+       ^objectOrientedPointer isMemberOf: LargeNegativeInteger!<br>
<br>
Item was added:<br>
+ ----- Method: InterpreterProxy&gt;&gt;isLargePositiveIntegerObject: (in category &#39;testing&#39;) -----<br>
+ isLargePositiveIntegerObject: objectOrientedPointer<br>
+       ^objectOrientedPointer isMemberOf: LargePositiveInteger!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;digitAddLarge:with: (in category &#39;oop functions&#39;) -----<br>
  digitAddLarge: firstInteger with: secondInteger<br>
        &quot;Does not need to normalize!!&quot;<br>
        | over firstDigitLen secondDigitLen shortInt shortDigitLen longInt longDigitLen sum newSum neg |<br>
        &lt;var: #over type: #&#39;unsigned int&#39;&gt;<br>
        firstDigitLen := self digitSizeOfLargeInt: firstInteger.<br>
        secondDigitLen := self digitSizeOfLargeInt: secondInteger.<br>
+       neg := interpreterProxy isLargeNegativeIntegerObject: firstInteger.<br>
-       neg := (interpreterProxy fetchClassOf: firstInteger)<br>
-               = interpreterProxy classLargeNegativeInteger.<br>
        firstDigitLen &lt;= secondDigitLen<br>
                ifTrue:<br>
                        [shortInt := firstInteger.<br>
                        shortDigitLen := firstDigitLen.<br>
                        longInt := secondInteger.<br>
                        longDigitLen := secondDigitLen]<br>
                ifFalse:<br>
                        [shortInt := secondInteger.<br>
                        shortDigitLen := secondDigitLen.<br>
                        longInt := firstInteger.<br>
                        longDigitLen := firstDigitLen].<br>
        &quot;       sum := Integer new: len neg: firstInteger negative.&quot;<br>
        self remapOop: #(shortInt longInt ) in: [sum := self createLargeIntegerNeg: neg digitLength: longDigitLen].<br>
        over := self<br>
                                cDigitAdd: (self pointerToFirstDigitOfLargeInt: shortInt)<br>
                                len: shortDigitLen<br>
                                with: (self pointerToFirstDigitOfLargeInt: longInt)<br>
                                len: longDigitLen<br>
                                into: (self pointerToFirstDigitOfLargeInt: sum).<br>
        over &gt; 0<br>
                ifTrue:<br>
                        [&quot;sum := sum growby: 1.&quot;<br>
                        self remapOop: sum in: [newSum := self createLargeIntegerNeg: neg byteLength: longDigitLen * 4 + 1].<br>
                        self<br>
                                cDigitCopyFrom: (self pointerToFirstDigitOfLargeInt: sum)<br>
                                to: (self pointerToFirstDigitOfLargeInt: newSum)<br>
                                len: longDigitLen.<br>
                        sum := newSum.<br>
                        &quot;C index!!&quot;<br>
                        self cDigitOf: (self pointerToFirstDigitOfLargeInt: sum)<br>
                                at: longDigitLen put: over]<br>
                ifFalse:<br>
                        [sum := neg<br>
                                ifTrue: [self normalizeNegative: sum]<br>
                                ifFalse: [self normalizePositive: sum]].<br>
        ^ sum!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;digitBitLogic:with:opIndex: (in category &#39;oop functions&#39;) -----<br>
  digitBitLogic: firstInteger with: secondInteger opIndex: opIx<br>
        &quot;Bit logic here is only implemented for positive integers or Zero;<br>
        if rec or arg is negative, it fails.&quot;<br>
        | firstLarge secondLarge firstLen secondLen shortLen shortLarge longLen longLarge result |<br>
        (interpreterProxy isIntegerObject: firstInteger)<br>
                ifTrue:<br>
                        [(interpreterProxy integerValueOf: firstInteger)<br>
                                &lt; 0 ifTrue: [^ interpreterProxy primitiveFail].<br>
                        &quot;convert it to a not normalized LargeInteger&quot;<br>
                        self remapOop: secondInteger in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]<br>
                ifFalse:<br>
+                       [(interpreterProxy isLargePositiveIntegerObject: firstInteger) ifFalse: [^ interpreterProxy primitiveFail].<br>
-                       [(interpreterProxy fetchClassOf: firstInteger)<br>
-                               = interpreterProxy classLargePositiveInteger ifFalse: [^ interpreterProxy primitiveFail].<br>
                        firstLarge := firstInteger].<br>
        (interpreterProxy isIntegerObject: secondInteger)<br>
                ifTrue:<br>
                        [(interpreterProxy integerValueOf: secondInteger)<br>
                                &lt; 0 ifTrue: [^ interpreterProxy primitiveFail].<br>
                        &quot;convert it to a not normalized LargeInteger&quot;<br>
                        self remapOop: firstLarge in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]<br>
                ifFalse:<br>
+                       [(interpreterProxy isLargePositiveIntegerObject: secondInteger) ifFalse: [^ interpreterProxy primitiveFail].<br>
-                       [(interpreterProxy fetchClassOf: secondInteger)<br>
-                               = interpreterProxy classLargePositiveInteger ifFalse: [^ interpreterProxy primitiveFail].<br>
                        secondLarge := secondInteger].<br>
        firstLen := self byteSizeOfLargeInt: firstLarge.<br>
        secondLen := self byteSizeOfLargeInt: secondLarge.<br>
        firstLen &lt; secondLen<br>
                ifTrue:<br>
                        [shortLen := firstLen.<br>
                        shortLarge := firstLarge.<br>
                        longLen := secondLen.<br>
                        longLarge := secondLarge]<br>
                ifFalse:<br>
                        [shortLen := secondLen.<br>
                        shortLarge := secondLarge.<br>
                        longLen := firstLen.<br>
                        longLarge := firstLarge].<br>
        self remapOop: #(shortLarge longLarge ) in: [result := interpreterProxy instantiateClass: interpreterProxy classLargePositiveInteger indexableSize: longLen].<br>
        self<br>
                cDigitOp: opIx<br>
                short: (self pointerToFirstDigitOfLargeInt: shortLarge)<br>
                len: shortLen + 3 // 4<br>
                long: (self pointerToFirstDigitOfLargeInt: longLarge)<br>
                len: longLen + 3 // 4<br>
                into: (self pointerToFirstDigitOfLargeInt: result).<br>
        interpreterProxy failed ifTrue: [^ 0].<br>
        ^ self normalizePositive: result!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;digitSubLarge:with: (in category &#39;oop functions&#39;) -----<br>
  digitSubLarge: firstInteger with: secondInteger<br>
        &quot;Normalizes.&quot;<br>
        | firstDigitLen secondDigitLen larger largeDigitLen smaller smallerDigitLen neg resDigitLen res firstNeg |<br>
+       firstNeg := interpreterProxy isLargeNegativeIntegerObject: firstInteger.<br>
-       firstNeg := (interpreterProxy fetchClassOf: firstInteger)<br>
-                               = interpreterProxy classLargeNegativeInteger.<br>
        firstDigitLen := self digitSizeOfLargeInt: firstInteger.<br>
        secondDigitLen := self digitSizeOfLargeInt: secondInteger.<br>
        firstDigitLen = secondDigitLen ifTrue:<br>
                [[firstDigitLen &gt; 1<br>
                  and: [(self unsafeDigitOfLargeInt: firstInteger at: firstDigitLen) = (self unsafeDigitOfLargeInt: secondInteger at: firstDigitLen)]]<br>
                        whileTrue: [firstDigitLen := firstDigitLen - 1].<br>
                secondDigitLen := firstDigitLen].<br>
        (firstDigitLen &lt; secondDigitLen<br>
         or: [firstDigitLen = secondDigitLen<br>
                 and: [(self unsafeDigitOfLargeInt: firstInteger at: firstDigitLen) &lt; (self unsafeDigitOfLargeInt: secondInteger at: firstDigitLen)]])<br>
                ifTrue:<br>
                        [larger := secondInteger.<br>
                        largeDigitLen := secondDigitLen.<br>
                        smaller := firstInteger.<br>
                        smallerDigitLen := firstDigitLen.<br>
                        neg := firstNeg == false]<br>
                ifFalse:<br>
                        [larger := firstInteger.<br>
                        largeDigitLen := firstDigitLen.<br>
                        smaller := secondInteger.<br>
                        smallerDigitLen := secondDigitLen.<br>
                        neg := firstNeg].<br>
        resDigitLen := largeDigitLen.<br>
        self remapOop: #(smaller larger)<br>
                in: [res := self createLargeIntegerNeg: neg digitLength: resDigitLen].<br>
        self<br>
                cDigitSub: (self pointerToFirstDigitOfLargeInt: smaller)<br>
                len: smallerDigitLen<br>
                with: (self pointerToFirstDigitOfLargeInt: larger)<br>
                len: largeDigitLen<br>
                into: (self pointerToFirstDigitOfLargeInt: res).<br>
        ^neg<br>
                ifTrue: [self normalizeNegative: res]<br>
                ifFalse: [self normalizePositive: res]!<br>
<br>
Item was removed:<br>
- ----- Method: LargeIntegersPlugin&gt;&gt;isLargeIntegerOop: (in category &#39;util&#39;) -----<br>
- isLargeIntegerOop: oop<br>
-       | oopClass |<br>
-       oopClass := interpreterProxy fetchClassOf: oop.<br>
-       ^oopClass == interpreterProxy classLargeNegativeInteger or: [oopClass == interpreterProxy classLargePositiveInteger]!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;normalize: (in category &#39;oop functions&#39;) -----<br>
  normalize: aLargeInteger<br>
        &quot;Check for leading zeroes and return shortened copy if so.&quot;<br>
        self debugCode: [self msg: &#39;normalize: aLargeInteger&#39;].<br>
+       (interpreterProxy isLargePositiveIntegerObject: aLargeInteger)<br>
-       (interpreterProxy fetchClassOf: aLargeInteger)<br>
-               = interpreterProxy classLargePositiveInteger<br>
                ifTrue: [^ self normalizePositive: aLargeInteger]<br>
                ifFalse: [^ self normalizeNegative: aLargeInteger]!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primAnyBitFrom:to: (in category &#39;Integer primitives&#39;) -----<br>
  primAnyBitFrom: from to: to<br>
        | integer large |<br>
        self debugCode: [self msg: &#39;primAnyBitFrom: from to: to&#39;].<br>
        integer := self<br>
                                primitive: &#39;primAnyBitFromTo&#39;<br>
+                               parameters: #(#SmallInteger #SmallInteger )<br>
+                               receiver: #Integer.<br>
-                               parameters: #(#SmallInteger #SmallInteger ).<br>
        (interpreterProxy isIntegerObject: integer)<br>
                ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        large := self createLargeFromSmallInteger: integer]<br>
+               ifFalse: [large := integer].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: integer) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       large := integer].<br>
        ^ (self<br>
                anyBitOfLargeInt: large<br>
                from: from<br>
                to: to)<br>
                asOop: Boolean!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primDigitAdd: (in category &#39;Integer primitives&#39;) -----<br>
  primDigitAdd: secondInteger<br>
        | firstLarge secondLarge firstInteger |<br>
        self debugCode: [self msg: &#39;primDigitAdd: secondInteger&#39;].<br>
+       firstInteger := self<br>
+                               primitive: &#39;primDigitAdd&#39;<br>
+                               parameters: #(Integer )<br>
+                               receiver: #Integer.<br>
-       firstInteger := self primitive: &#39;primDigitAdd&#39;.<br>
        (interpreterProxy isIntegerObject: firstInteger)<br>
+               ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        self remapOop: secondInteger in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]<br>
+               ifFalse: [firstLarge := firstInteger].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       firstLarge := firstInteger].<br>
        (interpreterProxy isIntegerObject: secondInteger)<br>
+               ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        self remapOop: firstLarge in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]<br>
+               ifFalse: [secondLarge := secondInteger].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: secondInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       secondLarge := secondInteger].<br>
        ^ self digitAddLarge: firstLarge with: secondLarge!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primDigitBitAnd: (in category &#39;Integer primitives&#39;) -----<br>
  primDigitBitAnd: secondInteger<br>
        &quot;Bit logic here is only implemented for positive integers or Zero; if rec<br>
        or arg is negative, it fails.&quot;<br>
        | firstInteger |<br>
        self debugCode: [self msg: &#39;primDigitBitAnd: secondInteger&#39;].<br>
+       firstInteger := self<br>
+                               primitive: &#39;primDigitBitAnd&#39;<br>
+                               parameters: #(Integer )<br>
+                               receiver: #Integer.<br>
-       firstInteger := self primitive: &#39;primDigitBitAnd&#39;.<br>
        ^ self<br>
                digitBitLogic: firstInteger<br>
                with: secondInteger<br>
                opIndex: andOpIndex!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primDigitBitOr: (in category &#39;Integer primitives&#39;) -----<br>
  primDigitBitOr: secondInteger<br>
        &quot;Bit logic here is only implemented for positive integers or Zero; if rec<br>
        or arg is negative, it fails.&quot;<br>
        | firstInteger |<br>
        self debugCode: [self msg: &#39;primDigitBitOr: secondInteger&#39;].<br>
+       firstInteger := self<br>
+                               primitive: &#39;primDigitBitOr&#39;<br>
+                               parameters: #(Integer )<br>
+                               receiver: #Integer.<br>
-       firstInteger := self primitive: &#39;primDigitBitOr&#39;.<br>
        ^ self<br>
                digitBitLogic: firstInteger<br>
                with: secondInteger<br>
                opIndex: orOpIndex!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primDigitBitShiftMagnitude: (in category &#39;Integer primitives&#39;) -----<br>
  primDigitBitShiftMagnitude: shiftCount<br>
        | rShift aLarge anInteger |<br>
        self debugCode: [self msg: &#39;primDigitBitShiftMagnitude: shiftCount&#39;].<br>
        anInteger := self<br>
                                primitive: &#39;primDigitBitShiftMagnitude&#39;<br>
+                               parameters: #(#SmallInteger )<br>
+                               receiver: #Integer.<br>
-                               parameters: #(#SmallInteger ).<br>
        (interpreterProxy isIntegerObject: anInteger)<br>
+               ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        aLarge := self createLargeFromSmallInteger: anInteger]<br>
+               ifFalse: [aLarge := anInteger].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: anInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       aLarge := anInteger].<br>
        shiftCount &gt;= 0<br>
                ifTrue: [^ self digit: aLarge Lshift: shiftCount]<br>
                ifFalse:<br>
                        [rShift := 0 - shiftCount.<br>
                        ^ self normalize: (self<br>
                                        digit: aLarge<br>
                                        Rshift: rShift<br>
                                        lookfirst: (self digitSizeOfLargeInt: aLarge))]!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primDigitBitXor: (in category &#39;Integer primitives&#39;) -----<br>
  primDigitBitXor: secondInteger<br>
        &quot;Bit logic here is only implemented for positive integers or Zero; if rec<br>
        or arg is negative, it fails.&quot;<br>
        | firstInteger |<br>
        self debugCode: [self msg: &#39;primDigitBitXor: secondInteger&#39;].<br>
+       firstInteger := self<br>
+                               primitive: &#39;primDigitBitXor&#39;<br>
+                               parameters: #(Integer )<br>
+                               receiver: #Integer.<br>
-       firstInteger := self primitive: &#39;primDigitBitXor&#39;.<br>
        ^ self<br>
                digitBitLogic: firstInteger<br>
                with: secondInteger<br>
                opIndex: xorOpIndex!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primDigitCompare: (in category &#39;Integer primitives&#39;) -----<br>
  primDigitCompare: secondInteger<br>
+       | firstVal secondVal firstInteger |<br>
-       | firstVal secondVal firstInteger firstIsSmall secondIsSmall |<br>
        self debugCode: [self msg: &#39;primDigitCompare: secondInteger&#39;].<br>
+       firstInteger := self<br>
+                               primitive: &#39;primDigitCompare&#39;<br>
+                               parameters: #(#Integer )<br>
+                               receiver: #Integer.<br>
-       firstInteger := self primitive: &#39;primDigitCompare&#39;.<br>
        &quot;shortcut: aSmallInteger has to be smaller in Magnitude as aLargeInteger&quot;<br>
+       (interpreterProxy isIntegerObject: firstInteger)<br>
+               ifTrue: [&quot;first&quot;<br>
+                       (interpreterProxy isIntegerObject: secondInteger)<br>
+                               ifTrue: [&quot;second&quot;<br>
+                                       (firstVal := interpreterProxy integerValueOf: firstInteger) &gt; (secondVal := interpreterProxy integerValueOf: secondInteger)<br>
-       firstIsSmall := interpreterProxy isIntegerObject: firstInteger.<br>
-       secondIsSmall := interpreterProxy isIntegerObject: secondInteger.<br>
-       firstIsSmall ifFalse: [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail]].<br>
-       secondIsSmall ifFalse: [(self isLargeIntegerOop: secondInteger) ifFalse: [^interpreterProxy primitiveFail]].<br>
-       firstIsSmall<br>
-               ifTrue:<br>
-                       [secondIsSmall<br>
-                               ifTrue:<br>
-                                       [(firstVal := interpreterProxy integerValueOf: firstInteger) &gt; (secondVal := interpreterProxy integerValueOf: secondInteger)<br>
                                                ifTrue: [^ 1 asOop: SmallInteger&quot;first &gt; second&quot;]<br>
                                                ifFalse: [firstVal &lt; secondVal<br>
                                                                ifTrue: [^ -1 asOop: SmallInteger&quot;first &lt; second&quot;]<br>
                                                                ifFalse: [^ 0 asOop: SmallInteger&quot;first = second&quot;]]]<br>
+                               ifFalse: [&quot;SECOND&quot;<br>
+                                       ^ -1 asOop: SmallInteger&quot;first &lt; SECOND&quot;]]<br>
+               ifFalse: [&quot;FIRST&quot;<br>
+                       (interpreterProxy isIntegerObject: secondInteger)<br>
+                               ifTrue: [&quot;second&quot;<br>
+                                       ^ 1 asOop: SmallInteger&quot;FIRST &gt; second&quot;]<br>
+                               ifFalse: [&quot;SECOND&quot;<br>
+                                       ^ self digitCompareLarge: firstInteger with: secondInteger]]!<br>
-                               ifFalse:<br>
-                                       [^ -1 asOop: SmallInteger&quot;first &lt; SECOND&quot;]]<br>
-               ifFalse:<br>
-                       [secondIsSmall<br>
-                               ifTrue:<br>
-                                       [^ 1 asOop: SmallInteger&quot;FIRST &gt; second&quot;]<br>
-                               ifFalse:<br>
-                                       [^ self digitCompareLarge: firstInteger with: secondInteger]]!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primDigitDiv:negative: (in category &#39;Integer primitives&#39;) -----<br>
  primDigitDiv: secondInteger negative: neg<br>
        &quot;Answer the result of dividing firstInteger by secondInteger.<br>
        Fail if parameters are not integers, not normalized or secondInteger is<br>
        zero. &quot;<br>
        | firstAsLargeInteger secondAsLargeInteger firstInteger |<br>
        self debugCode: [self msg: &#39;primDigitDiv: secondInteger negative: neg&#39;].<br>
        firstInteger := self<br>
                                primitive: &#39;primDigitDivNegative&#39;<br>
+                               parameters: #(#Integer #Boolean )<br>
+                               receiver: #Integer.<br>
-                               parameters: #(#Oop #Boolean ).<br>
        &quot;Coerce SmallIntegers to corresponding (not normalized) large integers<br>
        and check for zerodivide.&quot;<br>
        (interpreterProxy isIntegerObject: firstInteger)<br>
+               ifTrue: [&quot;convert to LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert to LargeInteger&quot;<br>
                        self<br>
                                remapOop: secondInteger<br>
                                in: [firstAsLargeInteger := self createLargeFromSmallInteger: firstInteger]]<br>
                ifFalse:<br>
+                       [&quot;Avoid crashes in case of getting unnormalized args.&quot;<br>
+                       (self isNormalized: firstInteger)<br>
+                               ifFalse:<br>
+                                       [self debugCode:<br>
+                                               [self msg: &#39;ERROR in primDigitDiv: secondInteger negative: neg&#39;.<br>
+                                               self msg: &#39;------&gt; receiver *not* normalized!!&#39;].<br>
+                                       ^ interpreterProxy primitiveFail].<br>
+                       firstAsLargeInteger := firstInteger].<br>
-                       [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       &quot;Avoid crashes in case of getting unnormalized args.&quot;<br>
-                       (self isNormalized: firstInteger) ifFalse: [self<br>
-                               debugCode: [self msg: &#39;ERROR in primDigitDiv: secondInteger negative: neg&#39;.<br>
-                                       self msg: &#39;------&gt; receiver *not* normalized!!&#39;].<br>
-                       ^ interpreterProxy primitiveFail].firstAsLargeInteger := firstInteger].<br>
        (interpreterProxy isIntegerObject: secondInteger)<br>
+               ifTrue: [&quot;check for zerodivide and convert to LargeInteger&quot;<br>
+                       (interpreterProxy integerValueOf: secondInteger)<br>
+                                       = 0<br>
-               ifTrue:<br>
-                       [&quot;check for zerodivide and convert to LargeInteger&quot;<br>
-                       (interpreterProxy integerValueOf: secondInteger) = 0<br>
                                ifTrue: [^ interpreterProxy primitiveFail].<br>
                        self<br>
                                remapOop: firstAsLargeInteger<br>
                                in: [secondAsLargeInteger := self createLargeFromSmallInteger: secondInteger]]<br>
                ifFalse:<br>
+                       [&quot;Avoid crashes in case of getting unnormalized args.&quot;<br>
+                       (self isNormalized: secondInteger)<br>
+                               ifFalse:<br>
+                                       [self debugCode:<br>
+                                               [self msg: &#39;ERROR in primDigitDiv: secondInteger negative: neg&#39;.<br>
+                                               self msg: &#39;------&gt; argument *not* normalized!!&#39;].<br>
+                                       ^ interpreterProxy primitiveFail].<br>
-                       [(self isLargeIntegerOop: secondInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       (self isNormalized: secondInteger) ifFalse: [self<br>
-                               debugCode: [self msg: &#39;ERROR in primDigitDiv: secondInteger negative: neg&#39;.<br>
-                                       self msg: &#39;------&gt; argument *not* normalized!!&#39;].<br>
-                       ^ interpreterProxy primitiveFail].<br>
                        secondAsLargeInteger := secondInteger].<br>
        ^ self<br>
                digitDivLarge: firstAsLargeInteger<br>
                with: secondAsLargeInteger<br>
                negative: neg!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primDigitMultiply:negative: (in category &#39;Integer primitives&#39;) -----<br>
  primDigitMultiply: secondInteger negative: neg<br>
        | firstLarge secondLarge firstInteger |<br>
        self debugCode: [self msg: &#39;primDigitMultiply: secondInteger negative: neg&#39;].<br>
        firstInteger := self<br>
                                primitive: &#39;primDigitMultiplyNegative&#39;<br>
+                               parameters: #(#Integer #Boolean )<br>
+                               receiver: #Integer.<br>
-                               parameters: #(#Oop #Boolean ).<br>
        (interpreterProxy isIntegerObject: firstInteger)<br>
+               ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        self<br>
                                remapOop: secondInteger<br>
                                in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]<br>
+               ifFalse: [firstLarge := firstInteger].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       firstLarge := firstInteger].<br>
        (interpreterProxy isIntegerObject: secondInteger)<br>
+               ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        self<br>
                                remapOop: firstLarge<br>
                                in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]<br>
+               ifFalse: [secondLarge := secondInteger].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: secondInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       secondLarge := secondInteger].<br>
        ^ self<br>
                digitMultiplyLarge: firstLarge<br>
                with: secondLarge<br>
                negative: neg!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primDigitSubtract: (in category &#39;Integer primitives&#39;) -----<br>
  primDigitSubtract: secondInteger<br>
        | firstLarge secondLarge firstInteger |<br>
        self debugCode: [self msg: &#39;primDigitSubtract: secondInteger&#39;].<br>
+       firstInteger := self<br>
+                               primitive: &#39;primDigitSubtract&#39;<br>
+                               parameters: #(#Integer )<br>
+                               receiver: #Integer.<br>
-       firstInteger := self primitive: &#39;primDigitSubtract&#39;.<br>
        (interpreterProxy isIntegerObject: firstInteger)<br>
+               ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        self<br>
                                remapOop: secondInteger<br>
                                in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]<br>
+               ifFalse: [firstLarge := firstInteger].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       firstLarge := firstInteger].<br>
        (interpreterProxy isIntegerObject: secondInteger)<br>
+               ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        self<br>
                                remapOop: firstLarge<br>
                                in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]<br>
+               ifFalse: [secondLarge := secondInteger].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       secondLarge := secondInteger].<br>
        ^ self digitSubLarge: firstLarge with: secondLarge!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primMontgomeryDigitLength (in category &#39;Integer primitives&#39;) -----<br>
  primMontgomeryDigitLength<br>
        self debugCode: [self msg: &#39;primMontgomeryDigitLength&#39;].<br>
+       self<br>
+                               primitive: &#39;primMontgomeryDigitLength&#39;<br>
+                               parameters: #()<br>
+                               receiver: #Integer.<br>
-       self primitive: &#39;primMontgomeryDigitLength&#39;.<br>
        ^interpreterProxy integerObjectOf: 32!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primMontgomeryTimes:modulo:mInvModB: (in category &#39;Integer primitives&#39;) -----<br>
  primMontgomeryTimes: secondOperandInteger modulo: thirdModuloInteger mInvModB: mInverseInteger<br>
        | firstLarge secondLarge firstInteger thirdLarge mInv |<br>
        &lt;var: #mInv type: #&#39;unsigned int&#39;&gt;<br>
        self debugCode: [self msg: &#39;montgomeryTimes: secondOperandInteger modulo: thirdModuloInteger mInvModB: smallInverseInteger&#39;].<br>
+       firstInteger := self<br>
+                               primitive: &#39;primMontgomeryTimesModulo&#39;<br>
+                               parameters: #(Integer Integer Integer )<br>
+                               receiver: #Integer.<br>
+        mInv := interpreterProxy positive32BitValueOf: mInverseInteger.<br>
-       firstInteger := self primitive: &#39;primMontgomeryTimesModulo&#39;.<br>
-       mInv := interpreterProxy positive32BitValueOf: mInverseInteger.<br>
        (interpreterProxy isIntegerObject: firstInteger)<br>
+               ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        self remapOop: #(secondOperandInteger thirdModuloInteger) in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]<br>
+               ifFalse: [firstLarge := firstInteger].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: firstInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       firstLarge := firstInteger].<br>
        (interpreterProxy isIntegerObject: secondOperandInteger)<br>
+               ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        self remapOop: #(firstLarge thirdModuloInteger) in: [secondLarge := self createLargeFromSmallInteger: secondOperandInteger]]<br>
+               ifFalse: [secondLarge := secondOperandInteger].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: secondOperandInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       secondLarge := secondOperandInteger].<br>
        (interpreterProxy isIntegerObject: thirdModuloInteger)<br>
+               ifTrue: [&quot;convert it to a not normalized LargeInteger&quot;<br>
-               ifTrue:<br>
-                       [&quot;convert it to a not normalized LargeInteger&quot;<br>
                        self remapOop: #(firstLarge secondLarge) in: [thirdLarge := self createLargeFromSmallInteger: thirdModuloInteger]]<br>
+               ifFalse: [thirdLarge := thirdModuloInteger].<br>
-               ifFalse:<br>
-                       [(self isLargeIntegerOop: thirdModuloInteger) ifFalse: [^interpreterProxy primitiveFail].<br>
-                       thirdLarge := thirdModuloInteger].<br>
        ^ self digitMontgomery: firstLarge times: secondLarge modulo: thirdLarge mInvModB: mInv!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primNormalizeNegative (in category &#39;Integer primitives&#39;) -----<br>
  primNormalizeNegative<br>
        | rcvr |<br>
        self debugCode: [self msg: &#39;primNormalizeNegative&#39;].<br>
+       rcvr := self<br>
+                               primitive: &#39;primNormalizeNegative&#39;<br>
+                               parameters: #()<br>
+                               receiver: #LargeNegativeInteger.<br>
-       rcvr := self primitive: &#39;primNormalizeNegative&#39;.<br>
-       (interpreterProxy fetchClassOf: rcvr) == interpreterProxy classLargeNegativeInteger ifFalse: [^interpreterProxy primitiveFail].<br>
        ^ self normalizeNegative: rcvr!<br>
<br>
Item was changed:<br>
  ----- Method: LargeIntegersPlugin&gt;&gt;primNormalizePositive (in category &#39;Integer primitives&#39;) -----<br>
  primNormalizePositive<br>
        | rcvr |<br>
        self debugCode: [self msg: &#39;primNormalizePositive&#39;].<br>
+       rcvr := self<br>
+                               primitive: &#39;primNormalizePositive&#39;<br>
+                               parameters: #()<br>
+                               receiver: #LargePositiveInteger.<br>
-       rcvr := self primitive: &#39;primNormalizePositive&#39;.<br>
-       (interpreterProxy fetchClassOf: rcvr) == interpreterProxy classLargePositiveInteger ifFalse: [^interpreterProxy primitiveFail].<br>
        ^ self normalizePositive: rcvr!<br>
<br>
Item was added:<br>
+ ----- Method: LargeNegativeInteger class&gt;&gt;ccg:prolog:expr:index: (in category &#39;*VMMaker-plugin generation&#39;) -----<br>
+ ccg: cg prolog: aBlock expr: aString index: anInteger<br>
+<br>
+       ^cg ccgLoad: aBlock expr: aString asMemberOfLargeNegativeIntegerFrom: anInteger!<br>
<br>
Item was added:<br>
+ ----- Method: LargePositiveInteger class&gt;&gt;ccg:prolog:expr:index: (in category &#39;*VMMaker-plugin generation&#39;) -----<br>
+ ccg: cg prolog: aBlock expr: aString index: anInteger<br>
+<br>
+       ^cg ccgLoad: aBlock expr: aString asMemberOfLargePositiveIntegerFrom: anInteger!<br>
<br>
Item was added:<br>
+ ----- Method: NewCoObjectMemorySimulator&gt;&gt;isKindOfInteger: (in category &#39;simulation only&#39;) -----<br>
+ isKindOfInteger: offset<br>
+       ^coInterpreter isKindOfInteger: offset!<br>
<br>
Item was added:<br>
+ ----- Method: NewCoObjectMemorySimulator&gt;&gt;isLargeIntegerObject: (in category &#39;simulation only&#39;) -----<br>
+ isLargeIntegerObject: offset<br>
+       ^coInterpreter isLargeIntegerObject: offset!<br>
<br>
Item was added:<br>
+ ----- Method: NewCoObjectMemorySimulator&gt;&gt;isLargeNegativeIntegerObject: (in category &#39;simulation only&#39;) -----<br>
+ isLargeNegativeIntegerObject: offset<br>
+       ^coInterpreter isLargeNegativeIntegerObject: offset!<br>
<br>
Item was added:<br>
+ ----- Method: NewCoObjectMemorySimulator&gt;&gt;isLargePositiveIntegerObject: (in category &#39;simulation only&#39;) -----<br>
+ isLargePositiveIntegerObject: offset<br>
+       ^coInterpreter isLargePositiveIntegerObject: offset!<br>
<br>
Item was added:<br>
+ ----- Method: NewObjectMemorySimulator&gt;&gt;isKindOfInteger: (in category &#39;simulation only&#39;) -----<br>
+ isKindOfInteger: offset<br>
+       ^coInterpreter isKindOfInteger: offset!<br>
<br>
Item was added:<br>
+ ----- Method: NewObjectMemorySimulator&gt;&gt;isLargeIntegerObject: (in category &#39;simulation only&#39;) -----<br>
+ isLargeIntegerObject: offset<br>
+       ^coInterpreter isLargeIntegerObject: offset!<br>
<br>
Item was added:<br>
+ ----- Method: NewObjectMemorySimulator&gt;&gt;isLargeNegativeIntegerObject: (in category &#39;simulation only&#39;) -----<br>
+ isLargeNegativeIntegerObject: offset<br>
+       ^coInterpreter isLargeNegativeIntegerObject: offset!<br>
<br>
Item was added:<br>
+ ----- Method: NewObjectMemorySimulator&gt;&gt;isLargePositiveIntegerObject: (in category &#39;simulation only&#39;) -----<br>
+ isLargePositiveIntegerObject: offset<br>
+       ^coInterpreter isLargePositiveIntegerObject: offset!<br>
<br>
Item was changed:<br>
  ----- Method: ObjectMemory&gt;&gt;cCoerceSimple:to: (in category &#39;simulation support&#39;) -----<br>
  cCoerceSimple: value to: cTypeString<br>
        &lt;doNotGenerate&gt;<br>
        ^cTypeString caseOf:<br>
+          {    [#&#39;char *&#39;]                     -&gt;      [value].<br>
+               [#&#39;unsigned int&#39;]       -&gt;      [value]. }!<br>
-          {    [#&#39;char *&#39;]     -&gt;      [value] }!<br>
<br>
Item was added:<br>
+ ----- Method: ObjectMemory&gt;&gt;isInstanceOfClassLargeNegativeInteger: (in category &#39;interpreter access&#39;) -----<br>
+ isInstanceOfClassLargeNegativeInteger: oop<br>
+       &lt;inline: true&gt;<br>
+       &quot;N.B.  Because Slang always inlines is:instanceOf:compactClassIndex:<br>
+        (because is:instanceOf:compactClassIndex: has an inline: pragma) the<br>
+        phrase (objectMemory splObj: ClassLargeNegativeInteger) is expanded<br>
+        in-place and is _not_ evaluated if oop has a non-zero CompactClassIndex.&quot;<br>
+       ^self<br>
+               is: oop<br>
+               instanceOf: (self splObj: ClassLargeNegativeInteger)<br>
+               compactClassIndex: ClassLargeNegativeIntegerCompactIndex!<br>
<br>
Item was added:<br>
+ ----- Method: ObjectMemory&gt;&gt;isInstanceOfClassLargePositiveInteger: (in category &#39;interpreter access&#39;) -----<br>
+ isInstanceOfClassLargePositiveInteger: oop<br>
+       &lt;inline: true&gt;<br>
+       &quot;N.B.  Because Slang always inlines is:instanceOf:compactClassIndex:<br>
+        (because is:instanceOf:compactClassIndex: has an inline: pragma) the<br>
+        phrase (objectMemory splObj: ClassLargePositiveInteger) is expanded<br>
+        in-place and is _not_ evaluated if oop has a non-zero CompactClassIndex.&quot;<br>
+       ^self<br>
+               is: oop<br>
+               instanceOf: (self splObj: ClassLargePositiveInteger)<br>
+               compactClassIndex: ClassLargePositiveIntegerCompactIndex!<br>
<br>
Item was added:<br>
+ ----- Method: ObjectMemory&gt;&gt;isLargeIntegerInstance: (in category &#39;interpreter access&#39;) -----<br>
+ isLargeIntegerInstance: oop<br>
+       &lt;inline: true&gt;<br>
+       ^(self isInstanceOfClassLargePositiveInteger: oop)<br>
+               or: [self isInstanceOfClassLargeNegativeInteger: oop]!<br>
<br>
Item was added:<br>
+ ----- Method: SmartSyntaxPluginCodeGenerator&gt;&gt;ccgLoad:expr:asKindOfIntegerFrom: (in category &#39;coercing&#39;) -----<br>
+ ccgLoad: aBlock expr: aString asKindOfIntegerFrom: anInteger<br>
+<br>
+       ^String streamContents: [:aStream | aStream<br>
+               nextPutAll: &#39;interpreterProxy success: (interpreterProxy isKindOfInteger: (interpreterProxy stackValue: &#39;;<br>
+               nextPutAll: anInteger asString;<br>
+               nextPutAll: &#39;)).&#39;;<br>
+               crtab;<br>
+               nextPutAll: (self<br>
+                                               ccgLoad: aBlock<br>
+                                               expr: aString<br>
+                                               asRawOopFrom: anInteger)]!<br>
<br>
Item was added:<br>
+ ----- Method: SmartSyntaxPluginCodeGenerator&gt;&gt;ccgLoad:expr:asMemberOfLargeNegativeIntegerFrom: (in category &#39;coercing&#39;) -----<br>
+ ccgLoad: aBlock expr: aString asMemberOfLargeNegativeIntegerFrom: anInteger<br>
+<br>
+       ^String streamContents: [:aStream | aStream<br>
+               nextPutAll: &#39;interpreterProxy success: (interpreterProxy isLargeNegativeIntegerObject: (interpreterProxy stackValue: &#39;;<br>
+               nextPutAll: anInteger asString;<br>
+               nextPutAll: &#39;)).&#39;;<br>
+               crtab;<br>
+               nextPutAll: (self<br>
+                                               ccgLoad: aBlock<br>
+                                               expr: aString<br>
+                                               asRawOopFrom: anInteger)]!<br>
<br>
Item was added:<br>
+ ----- Method: SmartSyntaxPluginCodeGenerator&gt;&gt;ccgLoad:expr:asMemberOfLargePositiveIntegerFrom: (in category &#39;coercing&#39;) -----<br>
+ ccgLoad: aBlock expr: aString asMemberOfLargePositiveIntegerFrom: anInteger<br>
+<br>
+       ^String streamContents: [:aStream | aStream<br>
+               nextPutAll: &#39;interpreterProxy success: (interpreterProxy isLargePositiveIntegerObject: (interpreterProxy stackValue: &#39;;<br>
+               nextPutAll: anInteger asString;<br>
+               nextPutAll: &#39;)).&#39;;<br>
+               crtab;<br>
+               nextPutAll: (self<br>
+                                               ccgLoad: aBlock<br>
+                                               expr: aString<br>
+                                               asRawOopFrom: anInteger)]!<br>
<br>
Item was added:<br>
+ ----- Method: SmartSyntaxPluginSimulator&gt;&gt;ccgLoad:expr:asKindOfIntegerFrom: (in category &#39;simulation&#39;) -----<br>
+ ccgLoad: forProlog expr: failBlock asKindOfIntegerFrom: argIndexOrNil<br>
+       ^[:oop|<br>
+          interpreterProxy success: (interpreterProxy isKindOfInteger: oop).<br>
+          oop]!<br>
<br>
Item was added:<br>
+ ----- Method: SmartSyntaxPluginSimulator&gt;&gt;ccgLoad:expr:asMemberOfLargeNegativeIntegerFrom: (in category &#39;simulation&#39;) -----<br>
+ ccgLoad: forProlog expr: failBlock asMemberOfLargeNegativeIntegerFrom: argIndexOrNil<br>
+       ^[:oop|<br>
+          interpreterProxy success: (interpreterProxy isLargeNegativeIntegerObject: oop).<br>
+          oop]!<br>
<br>
Item was added:<br>
+ ----- Method: SmartSyntaxPluginSimulator&gt;&gt;ccgLoad:expr:asMemberOfLargePositiveIntegerFrom: (in category &#39;simulation&#39;) -----<br>
+ ccgLoad: forProlog expr: failBlock asMemberOfLargePositiveIntegerFrom: argIndexOrNil<br>
+       ^[:oop|<br>
+          interpreterProxy success: (interpreterProxy isLargePositiveIntegerObject: oop).<br>
+          oop]!<br>
<br>
Item was added:<br>
+ ----- Method: SpurMemoryManager&gt;&gt;isInstanceOfClassLargeNegativeInteger: (in category &#39;interpreter access&#39;) -----<br>
+ isInstanceOfClassLargeNegativeInteger: oop<br>
+       &quot;Answer if the oop is a large negative integer instance.&quot;<br>
+       ^(self isNonImmediate: oop) and: [(self classIndexOf: oop) = ClassLargeNegativeIntegerCompactIndex]!<br>
<br>
Item was added:<br>
+ ----- Method: SpurMemoryManager&gt;&gt;isInstanceOfClassLargePositiveInteger: (in category &#39;interpreter access&#39;) -----<br>
+ isInstanceOfClassLargePositiveInteger: oop<br>
+       &quot;Answer if the oop is a large positive integer instance.&quot;<br>
+       ^(self isNonImmediate: oop) and: [(self classIndexOf: oop) = ClassLargePositiveIntegerCompactIndex]!<br>
<br>
Item was added:<br>
+ ----- Method: SpurMemoryManager&gt;&gt;isLargeIntegerInstance: (in category &#39;interpreter access&#39;) -----<br>
+ isLargeIntegerInstance: oop<br>
+       &quot;Answer if the oop is a large positive or negative integer instance.&quot;<br>
+       ^(self isNonImmediate: oop) and: [((self classIndexOf: oop) - ClassLargeNegativeIntegerCompactIndex) asUnsignedInteger &lt;= 1]!<br>
<br>
Item was added:<br>
+ ----- Method: StackInterpreter&gt;&gt;isKindOfInteger: (in category &#39;internal interpreter access&#39;) -----<br>
+ isKindOfInteger: oop<br>
+       &quot;Answer true if the oop is kind of Integer (Small or Large).&quot;<br>
+       &lt;api&gt;<br>
+       &lt;inline: true&gt;<br>
+       ^(objectMemory isIntegerObject: oop)<br>
+               or: [objectMemory isLargeIntegerInstance: oop]!<br>
<br>
Item was added:<br>
+ ----- Method: StackInterpreter&gt;&gt;isLargeIntegerObject: (in category &#39;internal interpreter access&#39;) -----<br>
+ isLargeIntegerObject: oop<br>
+       &lt;api&gt;<br>
+       &lt;inline: true&gt;<br>
+       ^objectMemory isLargeIntegerInstance: oop!<br>
<br>
Item was added:<br>
+ ----- Method: StackInterpreter&gt;&gt;isLargeNegativeIntegerObject: (in category &#39;internal interpreter access&#39;) -----<br>
+ isLargeNegativeIntegerObject: oop<br>
+       &lt;api&gt;<br>
+       &lt;inline: true&gt;<br>
+       ^objectMemory isInstanceOfClassLargeNegativeInteger: oop!<br>
<br>
Item was added:<br>
+ ----- Method: StackInterpreter&gt;&gt;isLargePositiveIntegerObject: (in category &#39;internal interpreter access&#39;) -----<br>
+ isLargePositiveIntegerObject: oop<br>
+       &lt;api&gt;<br>
+       &lt;inline: true&gt;<br>
+       ^objectMemory isInstanceOfClassLargePositiveInteger: oop!<br>
<br>
Item was changed:<br>
  ----- Method: StackInterpreter&gt;&gt;printStringOf: (in category &#39;debug printing&#39;) -----<br>
  printStringOf: oop<br>
        | fmt len cnt max i |<br>
        &lt;inline: false&gt;<br>
        (objectMemory isImmediate: oop) ifTrue:<br>
                [^self].<br>
        (objectMemory addressCouldBeObj: oop) ifFalse:<br>
                [^self].<br>
        fmt := objectMemory formatOf: oop.<br>
        fmt &lt; objectMemory firstByteFormat ifTrue: [^self].<br>
<br>
        cnt := (max := 128) min: (len := objectMemory lengthOf: oop).<br>
        i := 0.<br>
<br>
        ((objectMemory is: oop<br>
                  instanceOf: (objectMemory splObj: ClassByteArray)<br>
                  compactClassIndex: classByteArrayCompactIndex)<br>
+       or: [(objectMemory isLargeIntegerInstance: oop)])<br>
-       or: [(self isInstanceOfClassLargePositiveInteger: oop)<br>
-       or: [(self isInstanceOfClassLargeNegativeInteger: oop)]])<br>
                ifTrue:<br>
                        [[i &lt; cnt] whileTrue:<br>
                                [self printHex: (objectMemory fetchByte: i ofObject: oop).<br>
                                 i := i + 1]]<br>
                ifFalse:<br>
                        [[i &lt; cnt] whileTrue:<br>
                                [self cCode:<br>
                                                [(objectMemory fetchByte: i ofObject: oop) = 13 &quot;Character cr asInteger&quot; ifTrue:<br>
                                                        [self print: &#39;&lt;CR&gt;&#39;.<br>
                                                         i + 1 &lt; len ifTrue:<br>
                                                                [self print: &#39;...&#39;].<br>
                                                         ^self]].<br>
                                 self printChar: (objectMemory fetchByte: i ofObject: oop).<br>
                                 i := i + 1]].<br>
        len &gt; max ifTrue:<br>
                [self print: &#39;...&#39;].<br>
        self flush!<br>
<br>
Item was changed:<br>
  ----- Method: ThreadedFFIPlugin&gt;&gt;ffiIntegerValueOf: (in category &#39;callout support&#39;) -----<br>
  ffiIntegerValueOf: oop<br>
        &quot;Support for generic callout. Answer an integer value that is coerced as C would do.&quot;<br>
        &lt;inline: true&gt;<br>
        &quot;Cheat with a tag test&quot;<br>
        (oop anyMask: BytesPerWord - 1)<br>
                ifTrue:<br>
                        [(interpreterProxy isIntegerObject: oop) ifTrue:<br>
                                [^interpreterProxy integerValueOf: oop].<br>
                        self cppIf: SPURVM<br>
                                ifTrue:<br>
                                        [(interpreterProxy isCharacterObject: oop) ifTrue: &quot;Immediate in Spur&quot;<br>
                                                [^interpreterProxy characterValueOf: oop].<br>
                                         (interpreterProxy isFloatObject: oop) ifTrue: &quot;Immediate in 64-bit Spur&quot;<br>
                                                [^interpreterProxy floatValueOf: oop]]]<br>
                ifFalse:<br>
                        [self cppIf: SPURVM<br>
                                ifTrue: &quot;No non-immediate characters in Spur&quot;<br>
                                        []<br>
                                ifFalse:<br>
                                        [(interpreterProxy isCharacterObject: oop) ifTrue:<br>
                                                [^interpreterProxy characterValueOf: oop]].<br>
                         (interpreterProxy isFloatObject: oop) ifTrue:<br>
                                [^interpreterProxy floatValueOf: oop].<br>
                         oop = interpreterProxy nilObject ifTrue: [^0]. &quot;@@: should we really allow this????&quot;<br>
                         oop = interpreterProxy falseObject ifTrue: [^0].<br>
                         oop = interpreterProxy trueObject ifTrue: [^1].<br>
+                        (interpreterProxy isLargePositiveIntegerObject: oop) ifTrue:<br>
-                        (interpreterProxy fetchClassOf: oop) = interpreterProxy classLargePositiveInteger ifTrue:<br>
                                [self cppIf: BytesPerWord = 8 &quot;Use cppIf: to get the return type of the function right.  Should be sqInt on 32-bits.&quot;<br>
                                        ifTrue: [^interpreterProxy positive64BitValueOf: oop]<br>
                                        ifFalse: [^interpreterProxy positive32BitValueOf: oop]]].<br>
        ^interpreterProxy signedMachineIntegerValueOf: oop &quot;&lt;- will fail if not integer&quot;!<br>
<br>
</blockquote></div><br></div>