VM Maker: VMMaker.oscog-nice.2750.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-nice.2750.mcz

commits-2
 
Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-nice.2750.mcz

==================== Summary ====================

Name: VMMaker.oscog-nice.2750
Author: nice
Time: 2 May 2020, 12:33:42.712426 pm
UUID: f741b52f-ad8a-bb4d-a9ee-41105735f21c
Ancestors: VMMaker.oscog-nice.2749

Extend the capability of SmartSyntaxPluginCodeGenerator to handle DoubleByte and DoubleWord Arrays.

Remove the #debugCode: from the prolog of LargeIntegersPlugin primitives.
This was used only for printing a console trace upon primitive entry.
That's not how we are going to debug the plugin.
We are going to debug either with a VM Simulation, or via a modern debugger like gdb (cough!) if ever the problem lies in code generation itself.

Keep only two sends of debugCode: tracing case of un-normalized inputs.

Note: most of the SmartSyntaxPluginCodeGenerator capabilities/messages are currently unused.
See #initializeCTranslationDictionary.
The lack of examples make it very difficult to follow the code, or even guess the purpose.
No need to say that comments will not help.
Comments? who ever needed a comment in Smalltalk?
With greatest shame, I must confess, I need comments sometimes!
With such property, the code may live very long untouched, put your dirty nose out of this code ;)

=============== Diff against VMMaker.oscog-nice.2749 ===============

Item was added:
+ ----- Method: DoubleByteArray class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlock expr: aString index: anInteger
+
+ ^cg
+ ccgLoad: aBlock
+ expr: aString
+ asUnsignedShortPtrFrom: anInteger
+ andThen: (cg ccgValBlock: 'isShorts')!

Item was added:
+ ----- Method: DoubleByteArray class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
+ ccgDeclareCForVar: aSymbolOrString
+ "Address of an unsigned 16 bit value, regardless of Smalltalk wordSize"
+
+ ^'unsigned short *', aSymbolOrString!

Item was added:
+ ----- Method: DoubleWordArray class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlock expr: aString index: anInteger
+
+ ^cg
+ ccgLoad: aBlock
+ expr: aString
+ asUnsignedLong64PtrFrom: anInteger
+ andThen: (cg ccgValBlock: 'isLong64s')!

Item was added:
+ ----- Method: DoubleWordArray class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
+ ccgDeclareCForVar: aSymbolOrString
+ "Address of an unsigned 64 bit value, regardless of Smalltalk wordSize"
+
+ ^'unsigned long long *', aSymbolOrString!

Item was changed:
  ----- Method: LargeIntegersPlugin>>anyBitOfLargeInt:from:to: (in category 'util') -----
  anyBitOfLargeInt: anOop from: start to: stopArg
  "Argument has to be a Large Integer!!"
  "Tests for any magnitude bits in the interval from start to stopArg."
  | magnitude stop firstDigitIx lastDigitIx firstMask lastMask |
  <var: #digit type: #'unsigned int'>
  <var: #firstMask type: #'unsigned int'>
  <var: #lastMask type: #'unsigned int'>
  <var: #firstDigitIx type: #usqInt>
  <var: #lastDigitIx type: #usqInt>
  <var: #ix type: #usqInt>
- self
- debugCode: [self msg: 'anyBitOfLargeInt: anOop from: start to: stopArg'].
  magnitude := anOop.
  stop := stopArg min: (self highBitOfLargeInt: magnitude).
  start > stop
  ifTrue: [^ false].
  firstDigitIx := start - 1 // 32 + 1.
  lastDigitIx := stop - 1 // 32 + 1.
  firstMask := 16rFFFFFFFF << (start - 1 bitAnd: 31).
  lastMask := 16rFFFFFFFF >> (31 - (stop - 1 bitAnd: 31)).
  firstDigitIx = lastDigitIx
  ifTrue: [| digit |
  digit := self unsafeDigitOfLargeInt: magnitude at: firstDigitIx.
  ^ (digit bitAnd: (firstMask bitAnd: lastMask))
  ~= 0].
  ((self unsafeDigitOfLargeInt: magnitude at: firstDigitIx) bitAnd: firstMask)
  ~= 0
  ifTrue: [^ true].
  firstDigitIx + 1
  to: lastDigitIx - 1
  do: [:ix | (self unsafeDigitOfLargeInt: magnitude at: ix)
  ~= 0
  ifTrue: [^ true]].
  ((self unsafeDigitOfLargeInt: magnitude at: lastDigitIx)  bitAnd: lastMask)
  ~= 0
  ifTrue: [^ true].
  ^ false!

Item was changed:
  ----- Method: LargeIntegersPlugin>>normalize: (in category 'oop functions') -----
  normalize: aLargeInteger
  "Check for leading zeroes and return shortened copy if so."
- self debugCode: [self msg: 'normalize: aLargeInteger'].
  (interpreterProxy isLargePositiveIntegerObject: aLargeInteger)
  ifTrue: [^ self normalizePositive: aLargeInteger]
  ifFalse: [^ self normalizeNegative: aLargeInteger]!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primAnyBitFrom:to: (in category 'Integer primitives') -----
  primAnyBitFrom: from to: to
  | integer someBitIsSet val mask |
- self debugCode: [self msg: 'primAnyBitFrom: from to: to'].
  integer := self
  primitive: 'primAnyBitFromTo'
  parameters: #(#SmallInteger #SmallInteger )
  receiver: #Integer.
  from < 1 | (to < 1)
  ifTrue: [^ interpreterProxy primitiveFail].
  (interpreterProxy isIntegerObject: integer)
  ifTrue: ["For small integers, use a single bit mask operation"
  from <= to
  ifTrue:
  [val := interpreterProxy integerValueOf: integer.
  val < 0 ifTrue: ["Get the bits of magnitude" val := 0 - val].
  mask := (1 asUnsignedInteger << (to min: (self sizeof: #usqInt)*8-1))
  - (1 asUnsignedInteger << (from - 1 min: (self sizeof: #usqInt)*8-1)).
  someBitIsSet := val anyMask: mask]
  ifFalse: [someBitIsSet := 0]]
  ifFalse: [someBitIsSet := self
  anyBitOfLargeInt: integer
  from: from
  to: to].
  ^someBitIsSet asOop: Boolean!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primDigitAdd: (in category 'Integer primitives') -----
  primDigitAdd: secondInteger
  | firstLarge secondLarge firstInteger |
- self debugCode: [self msg: 'primDigitAdd: secondInteger'].
  firstInteger := self
  primitive: 'primDigitAdd'
  parameters: #(Integer )
  receiver: #Integer.
  (interpreterProxy isIntegerObject: firstInteger)
  ifTrue: ["convert it to a not normalized LargeInteger"
  self remapOop: secondInteger in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]
  ifFalse: [firstLarge := firstInteger].
  (interpreterProxy isIntegerObject: secondInteger)
  ifTrue: ["convert it to a not normalized LargeInteger"
  self remapOop: firstLarge in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]
  ifFalse: [secondLarge := secondInteger].
  ^ self digitAddLarge: firstLarge with: secondLarge!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primDigitBitAnd: (in category 'Integer primitives') -----
  primDigitBitAnd: secondInteger
  "Bit logic here is only implemented for positive integers or Zero; if rec
  or arg is negative, it fails."
  | firstInteger |
- self debugCode: [self msg: 'primDigitBitAnd: secondInteger'].
  firstInteger := self
  primitive: 'primDigitBitAnd'
  parameters: #(Integer )
  receiver: #Integer.
  ^ self
  digitBitLogic: firstInteger
  with: secondInteger
  opIndex: andOpIndex!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primDigitBitOr: (in category 'Integer primitives') -----
  primDigitBitOr: secondInteger
  "Bit logic here is only implemented for positive integers or Zero; if rec
  or arg is negative, it fails."
  | firstInteger |
- self debugCode: [self msg: 'primDigitBitOr: secondInteger'].
  firstInteger := self
  primitive: 'primDigitBitOr'
  parameters: #(Integer )
  receiver: #Integer.
  ^ self
  digitBitLogic: firstInteger
  with: secondInteger
  opIndex: orOpIndex!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primDigitBitShiftMagnitude: (in category 'Integer primitives') -----
  primDigitBitShiftMagnitude: shiftCount
  | rShift aLarge anInteger |
- self debugCode: [self msg: 'primDigitBitShiftMagnitude: shiftCount'].
  anInteger := self
  primitive: 'primDigitBitShiftMagnitude'
  parameters: #(#SmallInteger )
  receiver: #Integer.
  (interpreterProxy isIntegerObject: anInteger)
  ifTrue: ["convert it to a not normalized LargeInteger"
  aLarge := self createLargeFromSmallInteger: anInteger]
  ifFalse: [aLarge := anInteger].
  shiftCount >= 0
  ifTrue: [^ self digit: aLarge Lshift: shiftCount]
  ifFalse:
  [rShift := 0 - shiftCount.
  ^ self normalize: (self
  digit: aLarge
  Rshift: rShift
  lookfirst: (self digitSizeOfLargeInt: aLarge))]!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primDigitBitXor: (in category 'Integer primitives') -----
  primDigitBitXor: secondInteger
  "Bit logic here is only implemented for positive integers or Zero; if rec
  or arg is negative, it fails."
  | firstInteger |
- self debugCode: [self msg: 'primDigitBitXor: secondInteger'].
  firstInteger := self
  primitive: 'primDigitBitXor'
  parameters: #(Integer )
  receiver: #Integer.
  ^ self
  digitBitLogic: firstInteger
  with: secondInteger
  opIndex: xorOpIndex!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primDigitCompare: (in category 'Integer primitives') -----
  primDigitCompare: secondInteger
  "Compare the magnitude of self with that of arg.  
  Answer a code of 1, 0, -1 for self >, = , < arg" | firstVal secondVal firstInteger |
- self debugCode: [self msg: 'primDigitCompare: secondInteger'].
  firstInteger := self
  primitive: 'primDigitCompare'
  parameters: #(#Integer )
  receiver: #Integer.
  "shortcut: aSmallInteger has to be smaller in Magnitude than aLargeInteger"
  (interpreterProxy isIntegerObject: firstInteger) ifTrue:
  [(interpreterProxy isIntegerObject: secondInteger) ifTrue:
  [firstVal := interpreterProxy integerValueOf: firstInteger.
  secondVal := interpreterProxy integerValueOf: secondInteger.
  "Compute their magnitudes.  Since SmallIntegers are tagged they have
   fewer bits than an integer on the platform; therefore in computing their
   magnitude they cannot overflow."
  firstVal < 0 ifTrue: [firstVal := 0 - firstVal].
  secondVal < 0 ifTrue: [secondVal := 0 - secondVal].
  ^firstVal = secondVal
  ifTrue: [0 asOop: SmallInteger]
  ifFalse:
  [firstVal < secondVal
  ifTrue: [-1 asOop: SmallInteger]
  ifFalse: [1 asOop: SmallInteger]]].
  ^-1 asOop: SmallInteger]. "first < second"
  (interpreterProxy isIntegerObject: secondInteger) ifTrue:
  [^1 asOop: SmallInteger]. "first > second"
  ^ self digitCompareLarge: firstInteger with: secondInteger!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primDigitDiv:negative: (in category 'Integer primitives') -----
  primDigitDiv: secondInteger negative: neg
  "Answer the result of dividing firstInteger by secondInteger.
  Fail if parameters are not integers, not normalized or secondInteger is
  zero. "
  | firstAsLargeInteger secondAsLargeInteger firstInteger |
- self debugCode: [self msg: 'primDigitDiv: secondInteger negative: neg'].
  firstInteger := self
  primitive: 'primDigitDivNegative'
  parameters: #(#Integer #Boolean )
  receiver: #Integer.
  "Coerce SmallIntegers to corresponding (not normalized) large integers  
  and check for zerodivide."
  (interpreterProxy isIntegerObject: firstInteger)
  ifTrue: ["convert to LargeInteger"
  self
  remapOop: secondInteger
  in: [firstAsLargeInteger := self createLargeFromSmallInteger: firstInteger]]
  ifFalse:
  ["Avoid crashes in case of getting unnormalized args."
  (self isNormalized: firstInteger)
  ifFalse:
  [self debugCode:
  [self msg: 'ERROR in primDigitDiv: secondInteger negative: neg'.
  self msg: '------> receiver *not* normalized!!'].
  ^ interpreterProxy primitiveFail].
  firstAsLargeInteger := firstInteger].
  (interpreterProxy isIntegerObject: secondInteger)
  ifTrue: ["check for zerodivide and convert to LargeInteger"
  (interpreterProxy integerValueOf: secondInteger)
  = 0
  ifTrue: [^ interpreterProxy primitiveFail].
  self
  remapOop: firstAsLargeInteger
  in: [secondAsLargeInteger := self createLargeFromSmallInteger: secondInteger]]
  ifFalse:
  ["Avoid crashes in case of getting unnormalized args."
  (self isNormalized: secondInteger)
  ifFalse:
  [self debugCode:
  [self msg: 'ERROR in primDigitDiv: secondInteger negative: neg'.
  self msg: '------> argument *not* normalized!!'].
  ^ interpreterProxy primitiveFail].
  secondAsLargeInteger := secondInteger].
  ^ self
  digitDivLarge: firstAsLargeInteger
  with: secondAsLargeInteger
  negative: neg!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primDigitMultiply:negative: (in category 'Integer primitives') -----
  primDigitMultiply: secondInteger negative: neg
  | firstLarge secondLarge firstInteger |
- self debugCode: [self msg: 'primDigitMultiply: secondInteger negative: neg'].
  firstInteger := self
  primitive: 'primDigitMultiplyNegative'
  parameters: #(#Integer #Boolean )
  receiver: #Integer.
  (interpreterProxy isIntegerObject: firstInteger)
  ifTrue: ["convert it to a not normalized LargeInteger"
  self
  remapOop: secondInteger
  in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]
  ifFalse: [firstLarge := firstInteger].
  (interpreterProxy isIntegerObject: secondInteger)
  ifTrue: ["convert it to a not normalized LargeInteger"
  self
  remapOop: firstLarge
  in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]
  ifFalse: [secondLarge := secondInteger].
  ^ self
  digitMultiplyLarge: firstLarge
  with: secondLarge
  negative: neg!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primDigitSubtract: (in category 'Integer primitives') -----
  primDigitSubtract: secondInteger
  | firstLarge secondLarge firstInteger |
- self debugCode: [self msg: 'primDigitSubtract: secondInteger'].
  firstInteger := self
  primitive: 'primDigitSubtract'
  parameters: #(#Integer )
  receiver: #Integer.
  (interpreterProxy isIntegerObject: firstInteger)
  ifTrue: ["convert it to a not normalized LargeInteger"
  self
  remapOop: secondInteger
  in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]
  ifFalse: [firstLarge := firstInteger].
  (interpreterProxy isIntegerObject: secondInteger)
  ifTrue: ["convert it to a not normalized LargeInteger"
  self
  remapOop: firstLarge
  in: [secondLarge := self createLargeFromSmallInteger: secondInteger]]
  ifFalse: [secondLarge := secondInteger].
  ^ self digitSubLarge: firstLarge with: secondLarge!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primGetModuleName (in category 'control & support primitives') -----
  primGetModuleName
  "If calling this primitive fails, then C module does not exist."
  | strLen strOop |
- self debugCode: [self msg: 'primGetModuleName'].
  self
  primitive: 'primGetModuleName'
  parameters: #()
  receiver: #Oop.
  strLen := self strlen: self getModuleName.
  strOop := interpreterProxy instantiateClass: interpreterProxy classString indexableSize: strLen.
  self strncpy: (interpreterProxy firstIndexableField: strOop)
  _: self getModuleName
  _: strLen.
  ^strOop!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primMontgomeryDigitLength (in category 'Integer primitives') -----
  primMontgomeryDigitLength
- self debugCode: [self msg: 'primMontgomeryDigitLength'].
  self
  primitive: 'primMontgomeryDigitLength'
  parameters: #()
  receiver: #Integer.
  ^interpreterProxy integerObjectOf: 32!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primMontgomeryTimes:modulo:mInvModB: (in category 'Integer primitives') -----
  primMontgomeryTimes: secondOperandInteger modulo: thirdModuloInteger mInvModB: mInverseInteger
  | firstLarge secondLarge firstInteger thirdLarge mInv |
  <var: #mInv type: #'unsigned int'>
- self debugCode: [self msg: 'montgomeryTimes: secondOperandInteger modulo: thirdModuloInteger mInvModB: smallInverseInteger'].
  firstInteger := self
  primitive: 'primMontgomeryTimesModulo'
  parameters: #(Integer Integer Integer )
  receiver: #Integer.
  mInv := interpreterProxy positive32BitValueOf: mInverseInteger.
  (interpreterProxy isIntegerObject: firstInteger)
  ifTrue: ["convert it to a not normalized LargeInteger"
  self remapOop: #(secondOperandInteger thirdModuloInteger) in: [firstLarge := self createLargeFromSmallInteger: firstInteger]]
  ifFalse: [firstLarge := firstInteger].
  (interpreterProxy isIntegerObject: secondOperandInteger)
  ifTrue: ["convert it to a not normalized LargeInteger"
  self remapOop: #(firstLarge thirdModuloInteger) in: [secondLarge := self createLargeFromSmallInteger: secondOperandInteger]]
  ifFalse: [secondLarge := secondOperandInteger].
  (interpreterProxy isIntegerObject: thirdModuloInteger)
  ifTrue: ["convert it to a not normalized LargeInteger"
  self remapOop: #(firstLarge secondLarge) in: [thirdLarge := self createLargeFromSmallInteger: thirdModuloInteger]]
  ifFalse: [thirdLarge := thirdModuloInteger].
  ^ self digitMontgomery: firstLarge times: secondLarge modulo: thirdLarge mInvModB: mInv!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primNormalizeNegative (in category 'Integer primitives') -----
  primNormalizeNegative
  | rcvr |
- self debugCode: [self msg: 'primNormalizeNegative'].
  rcvr := self
  primitive: 'primNormalizeNegative'
  parameters: #()
  receiver: #LargeNegativeInteger.
  ^ self normalizeNegative: rcvr!

Item was changed:
  ----- Method: LargeIntegersPlugin>>primNormalizePositive (in category 'Integer primitives') -----
  primNormalizePositive
  | rcvr |
- self debugCode: [self msg: 'primNormalizePositive'].
  rcvr := self
  primitive: 'primNormalizePositive'
  parameters: #()
  receiver: #LargePositiveInteger.
  ^ self normalizePositive: rcvr!

Item was added:
+ ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgLoad:expr:asUnsignedLong64PtrFrom:andThen: (in category 'coercing') -----
+ ccgLoad: aBlock expr: aString asUnsignedLong64PtrFrom: stackIndex andThen: valBlock
+ ^self assign: aString coerceTo: 'unsigned long long *' from: stackIndex!

Item was added:
+ ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgLoad:expr:asUnsignedShortPtrFrom:andThen: (in category 'coercing') -----
+ ccgLoad: aBlock expr: aString asUnsignedShortPtrFrom: stackIndex andThen: valBlock
+ ^self assign: aString coerceTo: 'unsigned short *' from: stackIndex!

Item was added:
+ ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asUnsignedLong64PtrFrom:andThen: (in category 'coercing') -----
+ ccgLoad: aBlock expr: aString asUnsignedLong64PtrFrom: anInteger andThen: valBlock
+ "Answer a codestring for integer pointer to first indexable field of object (without validating side-effect unless specified in valBlock), as described in comment to ccgLoad:expr:asRawOopFrom:"
+
+ ^(valBlock value: anInteger), '.',
+ (aBlock value: (String streamContents: [:aStream | aStream
+ nextPutAll: 'self cCoerce: (interpreterProxy firstIndexableField:';
+ crtab: 4;
+ nextPutAll: '(interpreterProxy stackValue:';
+ nextPutAll: anInteger asString;
+ nextPutAll: '))';
+ crtab: 3;
+ nextPutAll: 'to: ''unsigned long long *''']))!

Item was added:
+ ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asUnsignedShortPtrFrom:andThen: (in category 'coercing') -----
+ ccgLoad: aBlock expr: aString asUnsignedShortPtrFrom: anInteger andThen: valBlock
+ "Answer a codestring for integer pointer to first indexable field of object (without validating side-effect unless specified in valBlock), as described in comment to ccgLoad:expr:asRawOopFrom:"
+
+ ^(valBlock value: anInteger), '.',
+ (aBlock value: (String streamContents: [:aStream | aStream
+ nextPutAll: 'self cCoerce: (interpreterProxy firstIndexableField:';
+ crtab: 4;
+ nextPutAll: '(interpreterProxy stackValue:';
+ nextPutAll: anInteger asString;
+ nextPutAll: '))';
+ crtab: 3;
+ nextPutAll: 'to: ''unsigned short *''']))!

Item was added:
+ ----- Method: SmartSyntaxPluginCodeGenerator>>generateIsBytes:on:indent: (in category 'translating builtins') -----
+ generateIsBytes: aNode on: aStream indent: anInteger
+ self genCallOf: #isBytes: with: aNode receiver on: aStream!

Item was added:
+ ----- Method: SmartSyntaxPluginCodeGenerator>>generateIsLong64s:on:indent: (in category 'translating builtins') -----
+ generateIsLong64s: aNode on: aStream indent: anInteger
+ self genCallOf: #isLong64s: with: aNode receiver on: aStream!

Item was added:
+ ----- Method: SmartSyntaxPluginCodeGenerator>>generateIsShorts:on:indent: (in category 'translating builtins') -----
+ generateIsShorts: aNode on: aStream indent: anInteger
+ self genCallOf: #isShorts: with: aNode receiver on: aStream!

Item was changed:
  ----- Method: SmartSyntaxPluginCodeGenerator>>initializeCTranslationDictionary (in category 'translating builtins') -----
  initializeCTranslationDictionary
  "Initialize the dictionary mapping message names to actions for C code generation."
 
  | pairs |
  super initializeCTranslationDictionary.
  pairs := #(
  #asCInt #generateAsCInt:on:indent:
  #asCUnsigned #generateAsCUnsigned:on:indent:
  #asCBoolean #generateAsCBoolean:on:indent:
  #asCDouble #generateAsCDouble:on:indent:
 
  #asSmallIntegerObj #generateAsSmallIntegerObj:on:indent:
  #asPositiveIntegerObj #generateAsPositiveIntegerObj:on:indent:
  #asBooleanObj #generateAsBooleanObj:on:indent:
  #asFloatObj #generateAsFloatObj:on:indent:
 
  #asIf:var: #generateAsIfVar:on:indent:
  #asIf:var:asValue: #generateAsIfVarAsValue:on:indent:
  #asIf:var:put: #generateAsIfVarPut:on:indent:
  #field: #generateField:on:indent:
  #field:put: #generateFieldPut:on:indent:
 
  #class #generateClass:on:indent:
 
  #stSize #generateStSize:on:indent:
  #stAt: #generateStAt:on:indent:
  #stAt:put: #generateStAtPut:on:indent:
 
  #asCharPtr #generateAsCharPtr:on:indent:
  #asIntPtr #generateAsIntPtr:on:indent:
  #cPtrAsOop #generateCPtrAsOop:on:indent:
  #next #generateNext:on:indent:
 
  #asOop: #generateAsOop:on:indent:
  #asValue: #generateAsValue:on:indent:
 
  #isFloat #generateIsFloat:on:indent:
  #isIndexable #generateIsIndexable:on:indent:
  #isIntegerOop #generateIsIntegerOop:on:indent:
  #isIntegerValue #generateIsIntegerValue:on:indent:
  "#FloatOop #generateIsFloatValue:on:indent:" "unused, never implemented"
+ #isBytes #generateIsBytes:on:indent:
+ #isShorts #generateIsShorts:on:indent:
+ #isLong64s #generateIsLong64s:on:indent:
  #isWords #generateIsWords:on:indent:
  #isWordsOrBytes #generateIsWordsOrBytes:on:indent:
  #isPointers #generateIsPointers:on:indent:
  #isNil #generateIsNil:on:indent:
  #isMemberOf: #generateIsMemberOf:on:indent:
  #isKindOf: #generateIsKindOf:on:indent:
 
  #fromStack: #generateFromStack:on:indent:
  "#clone #generateClone:on:indent:" "unused, never implemented"
  "#new #generateNew:on:indent:" "unused, never implemented"
  "#new: #generateNewSize:on:indent:" "unused, never implemented"
  "#superclass #generateSuperclass:on:indent:" "unused, never implemented"
  #debugCode: #generateDebugCode:on:indent:
  ).
 
  1 to: pairs size by: 2 do: [:i |
  translationDict at: (pairs at: i) put: (pairs at: i + 1)].
  !

Item was added:
+ ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asUnsignedLong64PtrFrom:andThen: (in category 'simulation') -----
+ ccgLoad: codeGen expr: exprBlock asUnsignedLong64PtrFrom: stackIndex andThen: validateBlock
+ ^[:oop|
+   validateBlock value: oop.
+   interpreterProxy cCoerce: (interpreterProxy firstIndexableField: oop) asInteger to: #'unsigned long long *']!

Item was added:
+ ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asUnsignedShortPtrFrom:andThen: (in category 'simulation') -----
+ ccgLoad: codeGen expr: exprBlock asUnsignedShortPtrFrom: stackIndex andThen: validateBlock
+ ^[:oop|
+   validateBlock value: oop.
+   interpreterProxy cCoerce: (interpreterProxy firstIndexableField: oop) asInteger to: #'unsigned short *']!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgValBlock: (in category 'simulation') -----
  ccgValBlock: aString
  ^aString caseOf: {
  ['isBytes'] -> [ [:oop|
  interpreterProxy success: (interpreterProxy isBytes: oop).
  oop]].
+ ['isShorts'] -> [ [:oop|
+ interpreterProxy success: (interpreterProxy isShorts: oop).
+ oop]].
  ['isWords'] -> [ [:oop|
  interpreterProxy success: (interpreterProxy isWords: oop).
  oop]].
+ ['isLong64s'] -> [ [:oop|
+ interpreterProxy success: (interpreterProxy isLong64s: oop).
+ oop]].
  ['isWordsOrBytes'] -> [ [:oop|
  interpreterProxy success: (interpreterProxy isWordsOrBytes: oop).
  oop]].
  ['isIndexable'] -> [ [:oop|
  interpreterProxy success: (interpreterProxy isIndexable: oop).
  oop]] }!

Item was added:
+ ----- Method: SmartSyntaxPluginValidationCodeGenerator>>ccgLoad:expr:asUnsignedLong64PtrFrom:andThen: (in category 'coercing') -----
+ ccgLoad: aBlock expr: aString asUnsignedLong64PtrFrom: stackIndex andThen: validationString
+ ^validationString, (self stackAccessorFor: stackIndex)!

Item was added:
+ ----- Method: SmartSyntaxPluginValidationCodeGenerator>>ccgLoad:expr:asUnsignedShortPtrFrom:andThen: (in category 'coercing') -----
+ ccgLoad: aBlock expr: aString asUnsignedShortPtrFrom: stackIndex andThen: validationString
+ ^validationString, (self stackAccessorFor: stackIndex)!