[Vm-dev] VM Maker: VMMaker.oscog-eem.3215.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Jul 19 05:03:46 UTC 2022


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.3215.mcz

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

Name: VMMaker.oscog-eem.3215
Author: eem
Time: 18 July 2022, 10:03:34.658056 pm
UUID: 90653d57-2b29-487b-a295-50a5f31605b1
Ancestors: VMMaker.oscog-eem.3214

Allow a plugin class to override the default types of pointers per spec class by overriding SmartSyntaxInterpreterPlugin class>>typeForSpecClass:.

A flaw of the rather lovely SmartSyntaxInterpreterPlugin framework is that when simulating pointer type  is determined by spec array (parameters: and/or reciever: in primitive:parameters:[receiver:]), not by the type of the variable assigned to.  But this shouldn't be the case.  The type of firstIndexableField: is intentionally #'void *', which in C can freely be assigned to any pointer type. Fix simulation so that the casts applied to firstIndexableField: reflect the type of the target variable, only defaulting to the type specified by the spec class if there is no declaration.

Hence significantly simplify the pointer API, removing ccgLoad:expr:asCharPtrFrom:andThen: et al, and keeping only ccgLoad:expr:asNullTerminatedCharPtrFrom:andThen:, ccgLoad:expr:asPtrFrom:andThen:ccgLoad:expr:asOopPtrFrom:andThen:.

Simplify signature map generation in SmartSyntaxPluginSimulator now that creating a SmartSyntaxPluginTMethod is required to extract the relevant type information.

=============== Diff against VMMaker.oscog-eem.3214 ===============

Item was added:
+ ----- Method: Array class>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#'sqInt *'!

Item was changed:
  ----- Method: Array class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
  	^cg 
+ 		ccgLoad: aBlockOrCTypeStringOrNil 
- 		ccgLoad: aBlock 
  		expr: aString 
+ 		asOopPtrFrom: stackIndexOrNil
+ 		andThen: (cg ccgValBlock: #isIndexable:)!
- 		asOopPtrFrom: anInteger
- 		andThen: (cg ccgValBlock: 'isIndexable')!

Item was removed:
- ----- Method: Array class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#'sqInt *', aSymbolOrString!

Item was changed:
  ----- Method: ArrayedCollection class>>ccg:generateCoerceToValueFrom:on: (in category '*VMMaker-plugin generation') -----
  ccg: cg generateCoerceToValueFrom: aNode on: aStream
  	"N.B.  The could be used both for generation and simulation so answer the result (for interpretation)"
  	^cg 
+ 		generateCoerceToPtr: self cType
+ 		fromObject: aNode
+ 		on: aStream!
- 		generateCoerceToPtr: (self ccgDeclareCForVar: '')
- 		fromObject: aNode on: aStream!

Item was added:
+ ----- Method: BitsAsWords class>>cType (in category 'plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#'unsigned int *'!

Item was changed:
  ----- Method: BitsAsWords class>>ccg:prolog:expr:index: (in category 'plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
  	^cg 
+ 		ccgLoad: aBlockOrCTypeStringOrNil 
- 		ccgLoad: aBlock 
  		expr: aString 
+ 		asPtrFrom: stackIndexOrNil
+ 		andThen: (cg ccgValBlock: #isWordsOrBytes:)!
- 		asUnsignedPtrFrom: anInteger
- 		andThen: (cg ccgValBlock: 'isWordsOrBytes')!

Item was removed:
- ----- Method: BitsAsWords class>>ccgDeclareCForVar: (in category 'plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#'unsigned int *', aSymbolOrString!

Item was changed:
  ----- Method: Boolean class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asBooleanValueFrom: stackIndexOrNil!
- 	^cg ccgLoad: aBlock expr: aString asBooleanValueFrom: anInteger!

Item was added:
+ ----- Method: ByteArray class>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#'char *'!

Item was changed:
  ----- Method: ByteArray class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
  	^cg 
+ 		ccgLoad: aBlockOrCTypeStringOrNil 
- 		ccgLoad: aBlock 
  		expr: aString 
+ 		asPtrFrom: stackIndexOrNil
+ 		andThen: (cg ccgValBlock: #isBytes:)!
- 		asCharPtrFrom: anInteger
- 		andThen: (cg ccgValBlock: 'isBytes')!

Item was removed:
- ----- Method: ByteArray class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#'char *', aSymbolOrString!

Item was changed:
  ----- Method: CObjectAccessor>>coerceTo:sim: (in category 'converting') -----
  coerceTo: cTypeString sim: interpreterSimulator
  
  	cTypeString caseOf: {
  		[#'float *']			-> [^self asFloatAccessor].
  		[#'int *']			-> [^self asIntAccessor].
+ 		[#'char *']			-> [^self asPluggableAccessor: { [:obj :index| Character value: (obj at: index)]. [:obj :index :character| obj at: index put: character asInteger] }].
  		['sqInputEvent*']	-> [^self] }
  		otherwise: [self halt].
  	^ self!

Item was changed:
  ----- Method: CompiledMethod>>asTranslationMethodOfClass: (in category '*VMMaker-C translation') -----
  asTranslationMethodOfClass: aTMethodClass
   	"Answer a TMethod (or subclass) derived from the receiver."
+ 	^self asTranslationMethodOfClass: aTMethodClass pluginClass: nil!
- 	^((CompiledMethod includesSelector: #ast)
- 			ifTrue: [self parseTree] "Pharo Opal Bytecode Compiler"
- 			ifFalse: [self methodNode]) "Squeak Smalltalk-80 Bytecode Compiler"
- 		asTranslationMethodOfClass: aTMethodClass!

Item was added:
+ ----- Method: CompiledMethod>>asTranslationMethodOfClass:pluginClass: (in category '*VMMaker-C translation') -----
+ asTranslationMethodOfClass: aTMethodClass pluginClass: pluginClassOrNil
+  	"Answer a TMethod (or subclass) derived from the receiver."
+ 	^((CompiledMethod includesSelector: #ast)
+ 			ifTrue: [self parseTree] "Pharo Opal Bytecode Compiler"
+ 			ifFalse: [self methodNode]) "Squeak Smalltalk-80 Bytecode Compiler"
+ 		asTranslationMethodOfClass: aTMethodClass pluginClass: pluginClassOrNil!

Item was added:
+ ----- Method: DoubleByteArray class>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 	"Address of an unsigned 16 bit value, regardless of Smalltalk wordSize"
+ 
+ 	^#'unsigned short *'!

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

Item was removed:
- ----- 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>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 	"Address of an unsigned 64 bit value, regardless of Smalltalk wordSize"
+ 
+ 	^#'unsigned long long *'!

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

Item was removed:
- ----- 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 added:
+ ----- Method: Float class>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#double!

Item was changed:
  ----- Method: Float class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asFloatValueFrom: stackIndexOrNil!
- 	^cg ccgLoad: aBlock expr: aString asFloatValueFrom: anInteger!

Item was removed:
- ----- Method: Float class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#double, ' ', aSymbolOrString!

Item was added:
+ ----- Method: Float32Array class>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#'float *'!

Item was changed:
  ----- Method: Float32Array class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asPtrFrom: stackIndexOrNil andThen: (cg ccgValBlock: #isWordsOrBytes:)!
- 	^cg ccgLoad: aBlock expr: aString asWBFloatPtrFrom: anInteger!

Item was removed:
- ----- Method: Float32Array class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#'float *', aSymbolOrString!

Item was changed:
  ----- Method: Integer class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asKindOfIntegerFrom: stackIndexOrNil!
- 	^cg ccgLoad: aBlock expr: aString asKindOfIntegerFrom: anInteger!

Item was added:
+ ----- Method: IntegerArray class>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#'int *'!

Item was changed:
  ----- Method: IntegerArray class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
  	^cg 
+ 		ccgLoad: aBlockOrCTypeStringOrNil 
- 		ccgLoad: aBlock 
  		expr: aString 
+ 		asPtrFrom: stackIndexOrNil
+ 		andThen: (cg ccgValBlock: #isWords:)!
- 		asIntPtrFrom: anInteger
- 		andThen: (cg ccgValBlock: 'isWords')!

Item was removed:
- ----- Method: IntegerArray class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#'int *', aSymbolOrString!

Item was changed:
  ----- Method: LargeNegativeInteger class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asMemberOfLargeNegativeIntegerFrom: stackIndexOrNil!
- 	^cg ccgLoad: aBlock expr: aString asMemberOfLargeNegativeIntegerFrom: anInteger!

Item was changed:
  ----- Method: LargePositiveInteger class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asMemberOfLargePositiveIntegerFrom: stackIndexOrNil!
- 	^cg ccgLoad: aBlock expr: aString asMemberOfLargePositiveIntegerFrom: anInteger!

Item was changed:
  ----- Method: MethodNode>>asTranslationMethodOfClass: (in category '*VMMaker-C translation') -----
+ asTranslationMethodOfClass: aTMethodClass
- asTranslationMethodOfClass: aClass
   	"Answer a TMethod (or subclass) derived from the receiver."
+ 	^self asTranslationMethodOfClass: aTMethodClass pluginClass: nil!
- 	^aClass new
- 		setSelector: selectorOrFalse
- 		definingClass: encoder associationForClass value
- 		args: arguments
- 		locals: encoder tempsAndBlockArgs
- 		block: block
- 		primitive: primitive
- 		properties: properties
- 		comment: comment!

Item was added:
+ ----- Method: MethodNode>>asTranslationMethodOfClass:pluginClass: (in category '*VMMaker-C translation') -----
+ asTranslationMethodOfClass: aTMethodClass pluginClass: pluginClassOrNil
+  	"Answer a TMethod (or subclass) derived from the receiver."
+ 	^aTMethodClass new
+ 		pluginClass: pluginClassOrNil;
+ 		setSelector: selectorOrFalse
+ 		definingClass: encoder associationForClass value
+ 		args: arguments
+ 		locals: encoder tempsAndBlockArgs
+ 		block: block
+ 		primitive: primitive
+ 		properties: properties
+ 		comment: comment!

Item was added:
+ ----- Method: NullTerminatedString class>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#'char *'!

Item was changed:
  ----- Method: NullTerminatedString class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
  	^cg 
+ 		ccgLoad: aBlockOrCTypeStringOrNil 
- 		ccgLoad: aBlock 
  		expr: aString 
+ 		asNullTerminatedCharPtrFrom: stackIndexOrNil
- 		asNullTerminatedCharPtrFrom: anInteger
  		andThen: 'interpreterProxy failed not'!

Item was removed:
- ----- Method: NullTerminatedString class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#'char *', aSymbolOrString!

Item was added:
+ ----- Method: Object class>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#sqInt!

Item was changed:
  ----- Method: Object class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asKindOf: self from: stackIndexOrNil!
- 	^cg ccgLoad: aBlock expr: aString asKindOf: self from: anInteger!

Item was removed:
- ----- Method: Object class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#sqInt, ' ', aSymbolOrString!

Item was added:
+ ----- Method: Oop class>>cType (in category 'plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#sqInt!

Item was changed:
  ----- Method: Oop class>>ccg:prolog:expr:index: (in category 'plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asRawOopFrom: stackIndexOrNil!
- 	^cg ccgLoad: aBlock expr: aString asRawOopFrom: anInteger!

Item was removed:
- ----- Method: Oop class>>ccgDeclareCForVar: (in category 'plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#sqInt, ' ', aSymbolOrString!

Item was changed:
  ----- Method: SmallInteger class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asIntegerValueFrom: stackIndexOrNil!
- 	^cg ccgLoad: aBlock expr: aString asIntegerValueFrom: anInteger!

Item was added:
+ ----- Method: SmartSyntaxInterpreterPlugin class>>typeForSpecClass: (in category 'translation') -----
+ typeForSpecClass: aSignatureTypeClass
+ 	"Answer the type of a variable assigned a parameter of type aSignatureTypeClass.
+ 	 By default this is aSignatureTypeClass's C type, but this hook allows plugins to override that default."
+ 	^aSignatureTypeClass cType!

Item was removed:
- ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgLoad:expr:asCharPtrFrom:andThen: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asCharPtrFrom: stackIndex andThen: valBlock
- 	^stackIndex
- 		ifNil: [self assign: aString coerceTo: #'char *' expr: valBlock]
- 		ifNotNil: [self assign: aString coerceTo: #'char *' from: stackIndex]!

Item was removed:
- ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgLoad:expr:asIntPtrFrom:andThen: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asIntPtrFrom: stackIndex andThen: valBlock
- 	^self assign: aString coerceTo: #'int *' from: stackIndex!

Item was changed:
  ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgLoad:expr:asOopPtrFrom:andThen: (in category 'coercing') -----
  ccgLoad: aBlock expr: aString asOopPtrFrom: stackIndex andThen: valBlock
+ 	^self
+ 			ccgLoad: aBlock 
+ 			expr: aString 
+ 			asPtrFrom: stackIndex
+ 			andThen: nil!
- 	^self assign: aString coerceTo: #'sqInt *' from: stackIndex!

Item was changed:
  ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgLoad:expr:asPtrFrom:andThen: (in category 'coercing') -----
  ccgLoad: aBlock expr: aString asPtrFrom: stackIndex andThen: valBlock
+ 	"Two cases, one is to use firstIndexableField: on the object at stackIndx.  Since firstIndexableField:
+ 	 has type void * it can be freely assigned to any pointer type without casting.  The other case, stackIndex isNil,
+ 	 is e.g. from WordsOrNil, where there is an ifTrue:ifFalse:, one arm casting 0 to void *."
+ 	^aString, ' := ', (stackIndex
+ 						ifNil: [valBlock]
+ 						ifNotNil:
+ 							['interpreterProxy firstIndexableField:', (self stackAccessorFor: stackIndex)])!
- 	^stackIndex
- 		ifNil: [aString, ' := ', valBlock]
- 		ifNotNil: [self assign: aString coerceTo: #'void *' from: stackIndex]!

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

Item was removed:
- ----- 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 removed:
- ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgLoad:expr:asUnsignedPtrFrom:andThen: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asUnsignedPtrFrom: stackIndex andThen: valBlock
- 	^self assign: aString coerceTo: #'unsigned *' from: stackIndex!

Item was removed:
- ----- 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 removed:
- ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgLoad:expr:asWBCharPtrFrom: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asWBCharPtrFrom: stackIndex
- 	^self assign: aString coerceTo: #'char *' from: stackIndex!

Item was removed:
- ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgLoad:expr:asWBFloatPtrFrom: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asWBFloatPtrFrom: stackIndex
- 	^self assign: aString coerceTo: #'float *' from: stackIndex!

Item was removed:
- ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgLoad:expr:asWBIntPtrFrom: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asWBIntPtrFrom: stackIndex
- 	^self assign: aString coerceTo: #'int *' from: stackIndex!

Item was changed:
  ----- Method: SmartSyntaxPluginAssignmentCodeGenerator>>ccgValBlock: (in category 'coercing support') -----
+ ccgValBlock: anInterpreterProxyTestingSelector
- ccgValBlock: aString
  	"ignore"!

Item was changed:
  ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asBooleanValueFrom: (in category 'coercing') -----
  ccgLoad: aBlock expr: aString asBooleanValueFrom: anInteger
  	"Answer codestring for boolean coercion (with validating side-effect) of object, as described in comment to ccgLoad:expr:asRawOopFrom:"
  
+ 	^aBlock value: 'interpreterProxy stackBooleanValue:', anInteger printString!
- 	^aBlock value: (String streamContents: [:aStream | aStream
- 		nextPutAll: 'interpreterProxy booleanValueOf:';
- 		crtab: 2;
- 		nextPutAll: '(interpreterProxy stackValue:';
- 		nextPutAll: anInteger asString;
- 		nextPutAll:	')'])!

Item was removed:
- ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asCharPtrFrom:andThen: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asCharPtrFrom: anInteger andThen: valBlock
- 	"Answer codestring for character pointer to first indexable field of object (without validating side-effect unless specified in valBlock), as described in comment to ccgLoad:expr:asRawOopFrom:"
- 
- 	^self ccgLoad: aBlock expr: aString asPtrFrom: anInteger andThen: valBlock!

Item was changed:
  ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asFloatValueFrom: (in category 'coercing') -----
  ccgLoad: aBlock expr: aString asFloatValueFrom: anInteger
  	"Answer codestring for double precision coercion (with validating side-effect) of oop, as described in comment to ccgLoad:expr:asRawOopFrom:"
  
+ 	^aBlock value: 'interpreterProxy stackFloatValue: ', anInteger printString!
- 	^aBlock value: (String streamContents: [:aStream | aStream
- 		nextPutAll: 'interpreterProxy stackFloatValue: ';
- 		nextPutAll: anInteger asString])!

Item was removed:
- ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asIntPtrFrom:andThen: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asIntPtrFrom: anInteger andThen: valBlock
- 	"Answer 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:"
- 
- 	^self ccgLoad: aBlock expr: aString asPtrFrom: anInteger andThen: valBlock!

Item was changed:
  ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asIntegerValueFrom: (in category 'coercing') -----
  ccgLoad: aBlock expr: aString asIntegerValueFrom: anInteger
  	"Answer codestring for integer coercion (with validating side-effect) of oop, as described in comment to ccgLoad:expr:asRawOopFrom:"
  
+ 	^aBlock value: 'interpreterProxy stackIntegerValue: ', anInteger printString!
- 	^aBlock value: (String streamContents: [:aStream | aStream
- 		nextPutAll: 'interpreterProxy stackIntegerValue: ';
- 		nextPutAll: anInteger asString])!

Item was changed:
  ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asNonIntegerValueFrom: (in category 'coercing') -----
  ccgLoad: aBlock expr: aString asNonIntegerValueFrom: anInteger
  	"Answer codestring for oop (with validating side effect), as described in comment to ccgLoad:expr:asRawOopFrom:"
  
+ 	^aBlock value: 'interpreterProxy stackObjectValue: ', anInteger printString!
- 	^aBlock value: (String streamContents: [:aStream | aStream
- 		nextPutAll: 'interpreterProxy stackObjectValue: ';
- 		nextPutAll: anInteger asString])!

Item was removed:
- ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asShortPtrFrom:andThen: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asShortPtrFrom: anInteger andThen: valBlock
- 	^self ccgLoad: aBlock expr: aString asPtrFrom: anInteger andThen: valBlock!

Item was removed:
- ----- 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:"
- 
- 	^self ccgLoad: aBlock expr: aString asPtrFrom: anInteger andThen: valBlock!

Item was removed:
- ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asUnsignedPtrFrom:andThen: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asUnsignedPtrFrom: 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:"
- 
- 	^self ccgLoad: aBlock expr: aString asPtrFrom: anInteger andThen: valBlock!

Item was removed:
- ----- 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:"
- 
- 	^self ccgLoad: aBlock expr: aString asPtrFrom: anInteger andThen: valBlock!

Item was removed:
- ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asWBCharPtrFrom: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asWBCharPtrFrom: anInteger
- 	"Answer codestring for char pointer to first indexable field of object (with validating side-effect), as described in comment to ccgLoad:expr:asRawOopFrom:"
- 
- 	^aBlock value: (String streamContents: [:aStream | aStream
- 		nextPutAll: 'self cCoerce: (interpreterProxy arrayValueOf:';
- 		crtab: 4;
- 		nextPutAll: '(interpreterProxy stackValue:';
- 		nextPutAll: anInteger asString;
- 		nextPutAll:	'))';
- 		crtab: 3;
- 		nextPutAll: 'to: ''char *'''])!

Item was removed:
- ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asWBFloatPtrFrom: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asWBFloatPtrFrom: anInteger
- 	"Answer codestring for single-precision float pointer to first indexable field of object (with validating side-effect), as described in comment to ccgLoad:expr:asRawOopFrom:"
- 
- 	^aBlock value: (String streamContents: [:aStream | aStream
- 		nextPutAll: 'self cCoerce: (interpreterProxy arrayValueOf:';
- 		crtab: 4;
- 		nextPutAll: '(interpreterProxy stackValue:';
- 		nextPutAll: anInteger asString;
- 		nextPutAll:	'))';
- 		crtab: 3;
- 		nextPutAll: 'to: ''float *'''])!

Item was removed:
- ----- Method: SmartSyntaxPluginCodeGenerator>>ccgLoad:expr:asWBIntPtrFrom: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asWBIntPtrFrom: anInteger
- 	"Answer codestring for integer pointer to first indexable field of object (with validating side-effect), as described in comment to ccgLoad:expr:asRawOopFrom:"
- 
- 	^aBlock value: (String streamContents: [:aStream | aStream
- 		nextPutAll: 'self cCoerce: (interpreterProxy arrayValueOf:';
- 		crtab: 4;
- 		nextPutAll: '(interpreterProxy stackValue:';
- 		nextPutAll: anInteger asString;
- 		nextPutAll:	'))';
- 		crtab: 3;
- 		nextPutAll: 'to: ''int *'''])!

Item was changed:
  ----- Method: SmartSyntaxPluginCodeGenerator>>ccgValBlock: (in category 'coercing') -----
+ ccgValBlock: anInterpreterProxyTestingSelector
+ 	self break.
- ccgValBlock: valString
- 
  	^[:index | String streamContents:
  		[:aStream | aStream
  			nextPutAll: 'interpreterProxy success: (interpreterProxy ';
+ 			nextPutAll: anInterpreterProxyTestingSelector;
+ 			nextPutAll: '(interpreterProxy stackValue: ';
- 			nextPutAll: valString;
- 			nextPutAll: ': (interpreterProxy stackValue: ';
  			nextPutAll: index asString;
+ 			nextPutAll: '))']]!
- 			nextPutAll: '))']] !

Item was changed:
  ----- Method: SmartSyntaxPluginCodeGenerator>>compileToTMethodSelector:in: (in category 'utilities') -----
  compileToTMethodSelector: selector in: aClass
  	"Compile a method to a TMethod"
  	(breakSrcInlineSelectors notNil
+ 	 and: [breakOnInline ~~ true]) ifTrue:
- 	 and: [(breakSrcInlineSelectors includes: selector) not "i.e. break in the superclass method..."
- 	 and: [breakOnInline ~~ true]]) ifTrue:
  		[| methodNode |
  		methodNode := (aClass >> selector) methodNode.
  		methodNode block nodesDo:
  			[:n|
  			(n isMessageNode
  			 and: [(n selector key beginsWith: #primitive:parameters:)
  			 and: [n arguments first isLiteralNode
+ 			 and: [breakSrcInlineSelectors includes: n arguments first key asSymbol]]]) ifTrue:
+ 				[self halt.
+ 				 ^(aClass >> selector) asTranslationMethodOfClass: self translationMethodClass pluginClass: pluginClass]].
+ 		(breakSrcInlineSelectors includes: selector) ifTrue:
+ 			[self halt]].
+ 	^(aClass >> selector) asTranslationMethodOfClass: self translationMethodClass pluginClass: pluginClass!
- 			 and: [breakSrcInlineSelectors includes: n arguments first key asSymbol]]]) ifTrue: [self halt. ^super compileToTMethodSelector: selector in: aClass]]].
- 	^super compileToTMethodSelector: selector in: aClass!

Item was changed:
  ----- Method: SmartSyntaxPluginCodeGenerator>>var:as: (in category 'transforming') -----
  var: varName as: aClass
  	"Record the given C declaration for a global variable"
  
+ 	^self var: varName type: aClass cType!
- 	variableDeclarations at: varName asString put: (aClass ccgDeclareCForVar: varName)!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asBooleanValueFrom: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: failBlock asBooleanValueFrom: anInteger
- ccgLoad: forProlog expr: failBlock asBooleanValueFrom: anInteger 
  	^[:oop| interpreterProxy booleanValueOf: oop]!

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

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asFloatValueFrom: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: exprBlock asFloatValueFrom: stackIndex
+ 	self assert: (codeGenerator isFloatingPointCType: cTypeString).
- ccgLoad: codeGen expr: exprBlock asFloatValueFrom: stackIndex
  	^[:oop| interpreterProxy floatValueOf: oop]!

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

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asIntegerValueFrom: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: failBlock asIntegerValueFrom: anInteger
+ 	self assert: (codeGenerator isSignedIntegralCType: cTypeString).
- ccgLoad: forProlog expr: failBlock asIntegerValueFrom: anInteger 
  	^[:oop| interpreterProxy checkedIntegerValueOf: oop]!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asKindOf:from: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: failBlock asKindOf: aClass from: argIndexOrNil
- ccgLoad: forProlog expr: failBlock asKindOf: aClass from: argIndexOrNil 
  	^[:oop|
+ 	   interpreterProxy success: (interpreterProxy is: oop KindOf: aClass name).
- 	   interpreterProxy success: (interpreterProxy is: oop KindOf: aClass name asString).
  	   oop]!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asKindOfIntegerFrom: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: failBlock asKindOfIntegerFrom: argIndexOrNil
+ 	self assert: (codeGenerator isSignedIntegralCType: cTypeString).
- ccgLoad: forProlog expr: failBlock asKindOfIntegerFrom: argIndexOrNil 
  	^[:oop|
  	   interpreterProxy success: (interpreterProxy isKindOfInteger: oop).
  	   oop]!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asMemberOfLargeNegativeIntegerFrom: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: failBlock asMemberOfLargeNegativeIntegerFrom: argIndexOrNil
- ccgLoad: forProlog expr: failBlock asMemberOfLargeNegativeIntegerFrom: argIndexOrNil 
  	^[:oop|
  	   interpreterProxy success: (interpreterProxy isLargeNegativeIntegerObject: oop).
  	   oop]!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asMemberOfLargePositiveIntegerFrom: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: failBlock asMemberOfLargePositiveIntegerFrom: argIndexOrNil
- ccgLoad: forProlog expr: failBlock asMemberOfLargePositiveIntegerFrom: argIndexOrNil 
  	^[:oop|
  	   interpreterProxy success: (interpreterProxy isLargePositiveIntegerObject: oop).
  	   oop]!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asOopPtrFrom:andThen: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: exprBlock asOopPtrFrom: stackIndex andThen: validateBlock
+ 	| cType |
+ 	cType := cTypeString asSymbol.
- ccgLoad: codeGen expr: exprBlock asOopPtrFrom: stackIndex andThen: validateBlock
  	^[:oop|
  	   validateBlock value: oop.
+ 	   interpreterProxy cCoerce: (interpreterProxy firstIndexableField: oop) asInteger to: cType]!
- 	   interpreterProxy cCoerce: (interpreterProxy firstIndexableField: oop) asInteger to: #'sqInt *']!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asPtrFrom:andThen: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: exprBlock asPtrFrom: stackIndexOrNil andThen: validateBlock
+ 	| cType |
+ 	cType := cTypeString asSymbol.
- ccgLoad: codeGen expr: exprBlock asPtrFrom: stackIndexOrNil andThen: validateBlock
- 	stackIndexOrNil ifNil: [self halt: 'need to figure out how to simulate WordsOrNil'].
  	^[:oop|
  	   validateBlock value: oop.
+ 	   interpreterProxy cCoerce: (interpreterProxy firstIndexableField: oop) asInteger to: cType]!
- 	   interpreterProxy cCoerce: (interpreterProxy firstIndexableField: oop) asInteger to: #'int *']!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asRawOopFrom: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: failBlock asRawOopFrom: anUndefinedObject
+ 	self assert: (codeGenerator isIntegralCType: cTypeString).
- ccgLoad: forProlog expr: failBlock asRawOopFrom: anUndefinedObject 
  	^[:oop| oop]!

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

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asUnsigned32BitValueFrom:andThen: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: exprBlock asUnsigned32BitValueFrom: stackIndex andThen: validateBlock
+ 	self assert: (codeGenerator isIntegralCType: cTypeString).
- ccgLoad: codeGen expr: exprBlock asUnsigned32BitValueFrom: stackIndex andThen: validateBlock
  	^[:oop|
  	   validateBlock value: oop.
  	   interpreterProxy positive32BitValueOf: oop]!

Item was removed:
- ----- 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 removed:
- ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asUnsignedPtrFrom:andThen: (in category 'simulation') -----
- ccgLoad: codeGen expr: exprBlock asUnsignedPtrFrom: stackIndex andThen: validateBlock
- 	^[:oop|
- 	   validateBlock value: oop.
- 	   interpreterProxy cCoerce: (interpreterProxy firstIndexableField: oop) asInteger to: #'unsigned *']!

Item was removed:
- ----- 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>>ccgLoad:expr:asUnsignedValueFrom: (in category 'simulation') -----
+ ccgLoad: cTypeString expr: exprBlock asUnsignedValueFrom: stackIndex
+ 	self assert: (codeGenerator isIntegralCType: cTypeString).
- ccgLoad: codeGen expr: exprBlock asUnsignedValueFrom: stackIndex
  	^[:oop|
  	  interpreterProxy bytesPerOop = 4
  		ifTrue: [interpreterProxy positive32BitValueOf: oop]
  		ifFalse: [interpreterProxy positive64BitValueOf: oop]]!

Item was removed:
- ----- Method: SmartSyntaxPluginSimulator>>ccgLoad:expr:asWBFloatPtrFrom: (in category 'simulation') -----
- ccgLoad: codeGen expr: exprBlock asWBFloatPtrFrom: stackIndex
- 	self shouldBeImplemented!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>ccgValBlock: (in category 'simulation') -----
+ ccgValBlock: anInterpreterProxyTestingSelector 
+ 	^[:oop|
+ 		interpreterProxy success: (interpreterProxy perform: anInterpreterProxyTestingSelector with: oop).
+ 		oop]!
- 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]].
- 		['isWordsOrShorts']	-> [	[:oop|
- 								 interpreterProxy success: (interpreterProxy isWordsOrShorts: oop).
- 								 oop]] }!

Item was added:
+ ----- Method: SmartSyntaxPluginSimulator>>ccgValBlock:or: (in category 'simulation') -----
+ ccgValBlock: unarySelector or: anInterpreterProxyTestingSelector
+ 	"unarySelector must be simple; nilObject, classArray etc. anInterpreterProxyTestingSelector must be a single keyword."
+ 	^[:oop|
+ 		interpreterProxy success: ((interpreterProxy perform: unarySelector) = oop or: [interpreterProxy perform: anInterpreterProxyTestingSelector with: oop]).
+ 		 oop]!

Item was removed:
- ----- Method: SmartSyntaxPluginSimulator>>ccgValBlock:or:index: (in category 'simulation') -----
- ccgValBlock: unarySelectorString or: keywordSelector index: ignored
- 	"unarySelector must be simple; nilObject, classArray etc. keywordSelector must be of the list below."
- 	| unarySelector |
- 	unarySelector := unarySelectorString asSymbol.
- 	^keywordSelector caseOf: {
- 		['isBytes']			-> [	[:oop|
- 								 interpreterProxy success: ((interpreterProxy perform: unarySelector) = oop or: [interpreterProxy isBytes: oop]).
- 								 oop]].
- 		['isShorts']			-> [	[:oop|
- 								 interpreterProxy success: ((interpreterProxy perform: unarySelector) = oop or: [interpreterProxy isShorts: oop]).
- 								 oop]].
- 		['isWords']			-> [	[:oop|
- 								 interpreterProxy success: ((interpreterProxy perform: unarySelector) = oop or: [interpreterProxy isWords: oop]).
- 								 oop]].
- 		['isLong64s']		-> [	[:oop|
- 								 interpreterProxy success: ((interpreterProxy perform: unarySelector) = oop or: [interpreterProxy isLong64s: oop]).
- 								 oop]].
- 		['isWordsOrBytes']	-> [	[:oop|
- 								 interpreterProxy success: ((interpreterProxy perform: unarySelector) = oop or: [interpreterProxy isWordsOrBytes: oop]).
- 								 oop]].
- 		['isIndexable']		-> [	[:oop|
- 								 interpreterProxy success: ((interpreterProxy perform: unarySelector) = oop or: [interpreterProxy isIndexable: oop]).
- 								 oop]].
- 		['isWordsOrShorts']	-> [	[:oop|
- 								 interpreterProxy success: ((interpreterProxy perform: unarySelector) = oop or: [interpreterProxy isWordsOrShorts: oop]).
- 								 oop]] }!

Item was removed:
- ----- Method: SmartSyntaxPluginSimulator>>computeSignatureFor:from: (in category 'initialize') -----
- computeSignatureFor: selector from: tuple
- 	^signatureMap
- 		at: selector
- 		put: {	tuple first.
- 				tuple second collect:
- 					[:argClass|
- 					argClass
- 						ccg: self
- 						prolog: true
- 						expr: [interpreterProxy primitiveFail]
- 						index: nil].
- 				tuple third
- 					ifNil: [#yourself]
- 					ifNotNil:
- 						[:rcvrClass|
- 						rcvrClass
- 							ccg: self
- 							prolog: false
- 							expr: [interpreterProxy primitiveFail]
- 							index: nil] }!

Item was added:
+ ----- Method: SmartSyntaxPluginSimulator>>computeSignatureFor:from:in: (in category 'initialize') -----
+ computeSignatureFor: selector from: tuple in: aSmartSyntaxPluginTMethod
+ 	"Compute the signature for the method.  This is effectively an array of blocks, one for each argument,
+ 	 which are applied to the arguments (and receiver) to validate each argument, and possibly convert it
+ 	 appropriately to be assigned to the relevant actual parameter of a primitive invocation."
+ 	^signatureMap
+ 		at: selector
+ 		put: {	tuple first.
+ 				tuple second withIndexCollect:
+ 					[:argClass :index| | type |
+ 					aSmartSyntaxPluginTMethod fullArgs ifNotNil:
+ 						[:args|
+ 						(aSmartSyntaxPluginTMethod declarations at: (args at: index) ifAbsent: nil) ifNotNil:
+ 							[:decl|
+ 							type := codeGenerator extractTypeFor: (args at: index) fromDeclaration: decl]].
+ 					type ifNil: [type := pluginClass typeForSpecClass: argClass].
+ 					argClass
+ 						ccg: self "pass the C type for the declaration, if there is one, otherwise pass the default type for thie argClass in this plugin"
+ 						prolog: type
+ 						expr: [interpreterProxy primitiveFail]
+ 						index: nil].
+ 				tuple third
+ 					ifNil: [#yourself]
+ 					ifNotNil:
+ 						[:rcvrClass| | type |
+ 						aSmartSyntaxPluginTMethod receiver ifNotNil:
+ 							[:receiver|
+ 							(aSmartSyntaxPluginTMethod declarations at: receiver ifAbsent: nil) ifNotNil:
+ 								[:decl|
+ 								type := codeGenerator extractTypeFor: receiver fromDeclaration: decl]].
+ 						type ifNil: [type := pluginClass typeForSpecClass: rcvrClass].
+ 						rcvrClass
+ 							ccg: self
+ 							prolog: type
+ 							expr: [interpreterProxy primitiveFail]
+ 							index: nil] }!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>computeSignatureMap (in category 'initialize') -----
  computeSignatureMap
  	signatureMap := Dictionary new.
  	codeGenerator := pluginClass buildCodeGenerator.
  	codeGenerator inferTypesForImplicitlyTypedVariablesAndMethods.
  	codeGenerator sortedExportMethods do:
  		[:tm|
  		tm primitiveSpecInto:
  			[:smalltalkSel :primSel :rcvrSpec :argSpec|
+ 			self computeSignatureFor: primSel from: { smalltalkSel. argSpec ifNil: [#()]. rcvrSpec } in: tm]]!
- 			self computeSignatureFor: primSel from: { smalltalkSel. argSpec ifNil: [#()]. rcvrSpec }]]!

Item was removed:
- ----- Method: SmartSyntaxPluginSimulator>>getPrimitiveSignatureFor: (in category 'initialize') -----
- getPrimitiveSignatureFor: aMethod
- 	"aMethod is a SmartSyntaxInterpreterPlugin method using one of the signature specifier selectors,
- 		primitive: primitive:parameters: primitive:parameters:receiver:
- 	Find the first one in the method and compute the signature for it via computeSignatureFor:from:"
- 	aMethod methodNode block nodesDo:
- 		[:n|
- 		(n isMessageNode and: [#(primitive: primitive:parameters: primitive:parameters:receiver:) includes: n selector key]) ifTrue:
- 			[| args primitiveName argumentClassNames receiverClassSymbolOrNil |
- 			args := n arguments.
- 			primitiveName := args first key.
- 			argumentClassNames := args size > 1 ifTrue: [args second key] ifFalse: [#()].
- 			receiverClassSymbolOrNil := args size > 2 ifTrue: [n arguments last literalValue].
- 			^self computeSignatureFor: aMethod selector from: {primitiveName. argumentClassNames. receiverClassSymbolOrNil}]].
- 	self error: 'can''t find primitive name in ', aMethod methodReference stringVersionDefault!

Item was changed:
  ----- Method: SmartSyntaxPluginSimulator>>primitive:parameters:receiver: (in category 'simulation') -----
  primitive: primNameString parameters: argumentClassNames receiver: rcvrClassSymbolOrNil
  	^rcvrClassSymbolOrNil ifNotNil:
  		[interpreterProxy stackValue: interpreterProxy methodArgumentCount]!

Item was changed:
  TMethod subclass: #SmartSyntaxPluginTMethod
+ 	instanceVariableNames: 'isPrimitive fullSelector fullArgs parmSpecs rcvrSpec pluginClass receiver'
- 	instanceVariableNames: 'isPrimitive fullSelector fullArgs parmSpecs rcvrSpec'
  	classVariableNames: 'Them'
  	poolDictionaries: ''
  	category: 'VMMaker-SmartSyntaxPlugins'!
  
+ !SmartSyntaxPluginTMethod commentStamp: 'eem 6/6/2018 14:06' prior: 0!
- !SmartSyntaxPluginTMethod commentStamp: '' prior: 0!
  Variation of TMethod node of the Smalltalk C Code Generator, used in conjunction with SmartSyntaxPluginCodeGenerator and SmartSyntaxInterpreterPlugin to generate named primitives from methods containing type coercion specifications such as
  	primitive: functionName parameters: #(Boolean Oop String WordsArray WordsOrBytes)
  	primitive: functionName parameters: #(SmallInteger LargeNegativeInteger LargePositiveInteger Integer Unsigned) receiver: #Oop!

Item was removed:
- ----- Method: SmartSyntaxPluginTMethod>>fromContext:primitive:parameters:receiver: (in category 'initialization') -----
- fromContext: aContext primitive: aString parameters: aClassList receiver: aClass
- 
- 	fullArgs := args := aContext tempNames
- 				copyFrom: 1
- 				to: aContext method numArgs.
- 	self 
- 		primitive: aString
- 		parameters: aClassList
- 		receiver: aClass!

Item was added:
+ ----- Method: SmartSyntaxPluginTMethod>>fullArgs (in category 'accessing-simulation') -----
+ fullArgs
+ 	^fullArgs!

Item was changed:
  ----- Method: SmartSyntaxPluginTMethod>>handlePrimitiveDirective:on: (in category 'specifying primitives') -----
  handlePrimitiveDirective: aStmt on: sStream
  	| needsCheckSuccessExpr loadExpressionSource |
  	isPrimitive := true.
  	fullArgs := args.
  	locals addAll: args.
  	args := OrderedCollection new.
  	fullArgs with: parmSpecs do:
  		[:argName :spec |
  		self declarationAt: argName
+ 			put: (self var: argName declareCForSpecClass: spec)].
- 			put: (spec ccgDeclareCForVar: argName)].
  	needsCheckSuccessExpr := false.
  	aStmt isAssignment ifTrue:
+ 		[receiver := aStmt variable name.
+ 		 self declarationAt: receiver
+ 			put: (self var: receiver declareCForSpecClass: rcvrSpec).
- 		[self declarationAt: aStmt variable name
- 			put: (rcvrSpec ccgDeclareCForVar: aStmt variable name).
  		 loadExpressionSource := rcvrSpec
  									ccg:	SmartSyntaxPluginCodeGenerator new
+ 									prolog:  [:expr | receiver, ' := ', expr]
+ 									expr: 	receiver
- 									prolog:  [:expr | aStmt variable name, ' := ', expr]
- 									expr: 	aStmt variable name
  									index: 	fullArgs size.
  		 needsCheckSuccessExpr := (loadExpressionSource includesSubstring: ' success:')
  									or: [InterpreterProxy checkingStackLoads anySatisfy:
  											[:checkingSelector|
  											loadExpressionSource includesSubstring: checkingSelector]].
  		 sStream nextPutAll: (self statementsFor: loadExpressionSource varName: '')].
  
  	"only add the failure guard if required"
  	needsCheckSuccessExpr ifTrue:
  		[sStream nextPutAll: self checkSuccessExpr].
  	^true!

Item was added:
+ ----- Method: SmartSyntaxPluginTMethod>>pluginClass: (in category 'accessing') -----
+ pluginClass: actualPluginClass
+ 	pluginClass := actualPluginClass!

Item was added:
+ ----- Method: SmartSyntaxPluginTMethod>>receiver (in category 'accessing-simulation') -----
+ receiver
+ 	^receiver!

Item was changed:
  ----- Method: SmartSyntaxPluginTMethod>>recordDeclarationsIn: (in category 'transforming') -----
  recordDeclarationsIn: aCCodeGen
  	"Record C type declarations of the forms
  		<returnTypeC: 'float'>
  		<var: #foo declareC: 'float foo'>
  		<var: #foo type:'float'>
  		<var: #foo as: Class>
  	 or the older, obsolete
  		self returnTypeC: 'float'.
  		self var: #foo declareC: 'float foo'
  		self var: #foo type:'float'.
  		self var: #foo as: Class
  	 and remove the declarations from the method body."
  
  	| newStatements |
  	properties pragmas notEmpty ifTrue:
  		[properties pragmas do:
  			[:pragma|
  			pragma keyword == #var:declareC: ifTrue:
  				[self checkedDeclarationAt: pragma arguments first asString
  					put: pragma arguments last
  					in: aCCodeGen].
  			pragma keyword == #var:type: ifTrue:
  				[| varName varType |
  				varName := pragma arguments first asString.
  				varType := aCCodeGen conventionalTypeForType: pragma arguments last.
  				varType last == $* ifFalse: [varType := varType, ' '].
  				self checkedDeclarationAt: varName
  					put: varType, varName
  					in: aCCodeGen].
  			 pragma keyword == #var:as: ifTrue:
  				[| theClass |
  				 theClass := Smalltalk at: pragma arguments last name asSymbol ifAbsent: [nil].
  				 theClass isBehavior ifFalse:
  					[^self error: 'declarator must be a Behavior'].
  				 self checkedDeclarationAt: pragma arguments first value asString 
+ 					put: (self var: pragma arguments first asString declareCForSpecClass: theClass)
- 					put: (theClass ccgDeclareCForVar: pragma arguments first asString)
  					in: aCCodeGen].
  			pragma keyword == #returnTypeC: ifTrue:
  				[self returnType: pragma arguments last].
  			pragma keyword = #doNotGenerate: ifTrue:
  				[locals removeKey: pragma arguments last]].
  		^self].
  	newStatements := OrderedCollection new: parseTree statements size.
  	parseTree statements do: 
  		[:stmt | | isDeclaration |
  		 isDeclaration := false.
  		 stmt isSend ifTrue: 
  			[stmt selector == #var:declareC: ifTrue:
  				[isDeclaration := true.
  				self declarationAt: stmt args first value asString put: stmt args last value].
  			stmt selector = #var:type: ifTrue:
  				[| varName varType |
  				isDeclaration := true.
  				varName := stmt args first value asString.
  				varType := aCCodeGen conventionalTypeForType: stmt args last value.
  				varType last == $* ifFalse: [varType := varType, ' '].
  				self declarationAt: varName put: varType, varName].
  			 stmt selector == #var:as: ifTrue:
  				[| theClass |
  				 isDeclaration := true.
  				 theClass := Smalltalk  at: stmt args last name asSymbol ifAbsent: [nil].
  				 theClass isBehavior ifFalse:
  					[^self error: 'declarator must be a Behavior'].
  				 self declarationAt: stmt args first value asString 
+ 					put: (self var: stmt args first value asString declareCForSpecClass: theClass)].
- 					put: (theClass ccgDeclareCForVar: stmt args first value asString)].
  			 stmt selector == #returnTypeC: ifTrue: 
  				[isDeclaration := true.
  				 returnType := stmt args last value]].
  		 isDeclaration ifFalse: [newStatements add: stmt]].
  	parseTree setStatements: newStatements asArray!

Item was added:
+ ----- Method: SmartSyntaxPluginTMethod>>var:declareCForSpecClass: (in category 'primitive compilation') -----
+ var: variableName declareCForSpecClass: aSignatureTypeClass
+ 	| type |
+ 	type := pluginClass typeForSpecClass: aSignatureTypeClass.
+ 	^type last = $*
+ 		ifTrue: [type, variableName]
+ 		ifFalse: [type, ' ', variableName]!

Item was removed:
- ----- Method: SmartSyntaxPluginValidationCodeGenerator>>ccgLoad:expr:asCharPtrFrom:andThen: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asCharPtrFrom: stackIndex andThen: validationString
- 	^stackIndex
- 		ifNil: [validationString]
- 		ifNotNil: [validationString, (self stackAccessorFor: stackIndex)]!

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

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

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

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

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

Item was removed:
- ----- Method: SmartSyntaxPluginValidationCodeGenerator>>ccgLoad:expr:asWBCharPtrFrom: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asWBCharPtrFrom: stackIndex
- 	^self loadAs: #isWordsOrBytes: from: stackIndex!

Item was removed:
- ----- Method: SmartSyntaxPluginValidationCodeGenerator>>ccgLoad:expr:asWBFloatPtrFrom: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asWBFloatPtrFrom: stackIndex
- 	^self loadAs: #isWordsOrBytes: from: stackIndex!

Item was removed:
- ----- Method: SmartSyntaxPluginValidationCodeGenerator>>ccgLoad:expr:asWBIntPtrFrom: (in category 'coercing') -----
- ccgLoad: aBlock expr: aString asWBIntPtrFrom: stackIndex
- 	^self loadAs: #isWordsOrBytes: from: stackIndex!

Item was changed:
  ----- Method: SmartSyntaxPluginValidationCodeGenerator>>ccgValBlock: (in category 'coercing support') -----
+ ccgValBlock: anInterpreterProxyValidationSelector
+ 	^'interpreterProxy ', anInterpreterProxyValidationSelector!
- ccgValBlock: aString
- 	^'interpreterProxy ', (aString, ': ')!

Item was added:
+ ----- Method: String class>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#'char *'!

Item was changed:
  ----- Method: String class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
  	^cg 
+ 		ccgLoad: aBlockOrCTypeStringOrNil 
- 		ccgLoad: aBlock 
  		expr: aString 
+ 		asPtrFrom: stackIndexOrNil
+ 		andThen: (cg ccgValBlock: #isBytes:)!
- 		asCharPtrFrom: anInteger
- 		andThen: (cg ccgValBlock: 'isBytes')!

Item was removed:
- ----- Method: String class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#'char *', aSymbolOrString!

Item was added:
+ ----- Method: TMethod>>pluginClass: (in category 'accessing') -----
+ pluginClass: actualPluginClass
+ 	"ignored; here for SmartSyntaxPluginTMethod to override, which needs the pluginClass to derive variable types."!

Item was changed:
  ----- Method: TSendNode>>printParenthetically:on:level: (in category 'printing') -----
  printParenthetically: node on: aStream level: level
  	node
  		ifNil: [aStream print: node]
  		ifNotNil: 
+ 			[(node isAssignment
+ 			  or: [node isSend and: [node selector precedence >= 3]])
- 			[(node isSend
- 			  and: [node selector precedence >= 3])
  				ifTrue:
  					[aStream nextPut: $(.
  					 node printOn: aStream level: level.
  					 aStream nextPut: $)]
  				ifFalse: [node printOn: aStream level: level]]!

Item was added:
+ ----- Method: Unsigned class>>cType (in category 'plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^ #'usqIntptr_t'!

Item was changed:
  ----- Method: Unsigned class>>ccg:prolog:expr:index: (in category 'plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asUnsignedValueFrom: stackIndexOrNil!
- 	^cg ccgLoad: aBlock expr: aString asUnsignedValueFrom: anInteger!

Item was removed:
- ----- Method: Unsigned class>>ccgDeclareCForVar: (in category 'plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^ #'usqIntptr_t', ' ', aSymbolOrString!

Item was added:
+ ----- Method: Unsigned32 class>>cType (in category 'plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^ #'unsigned int'!

Item was changed:
  ----- Method: Unsigned32 class>>ccg:prolog:expr:index: (in category 'plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
+ 	^cg ccgLoad: aBlockOrCTypeStringOrNil expr: aString asUnsigned32BitValueFrom: stackIndexOrNil andThen: 'interpreterProxy failed not'!
- 	^cg ccgLoad: aBlock expr: aString asUnsigned32BitValueFrom: anInteger andThen: 'interpreterProxy failed not'!

Item was removed:
- ----- Method: Unsigned32 class>>ccgDeclareCForVar: (in category 'plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^ #'unsigned int', ' ', aSymbolOrString!

Item was added:
+ ----- Method: WordArray class>>cType (in category '*VMMaker-plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 	"Address of an unsigned 32 bit value, regardless of Smalltalk wordSize"
+ 
+ 	^#'unsigned *'!

Item was changed:
  ----- Method: WordArray class>>ccg:prolog:expr:index: (in category '*VMMaker-plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
  	^cg 
+ 		ccgLoad: aBlockOrCTypeStringOrNil 
- 		ccgLoad: aBlock 
  		expr: aString 
+ 		asPtrFrom: stackIndexOrNil
+ 		andThen: (cg ccgValBlock: #isWords:)!
- 		asUnsignedPtrFrom: anInteger
- 		andThen: (cg ccgValBlock: 'isWords')!

Item was removed:
- ----- Method: WordArray class>>ccgDeclareCForVar: (in category '*VMMaker-plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 	"Address of an unsigned 32 bit value, regardless of Smalltalk wordSize"
- 
- 	^#'unsigned *', aSymbolOrString!

Item was added:
+ ----- Method: WordsOrBytes class>>cType (in category 'plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#'char *'!

Item was changed:
  ----- Method: WordsOrBytes class>>ccg:prolog:expr:index: (in category 'plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
  	^cg 
+ 		ccgLoad: aBlockOrCTypeStringOrNil 
- 		ccgLoad: aBlock 
  		expr: aString 
+ 		asPtrFrom: stackIndexOrNil
+ 		andThen: (cg ccgValBlock: #isWordsOrBytes:)!
- 		asCharPtrFrom: anInteger
- 		andThen: (cg ccgValBlock: 'isWordsOrBytes')!

Item was removed:
- ----- Method: WordsOrBytes class>>ccgDeclareCForVar: (in category 'plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#'char *', aSymbolOrString!

Item was added:
+ ----- Method: WordsOrNil class>>cType (in category 'plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#'void *'!

Item was changed:
  ----- Method: WordsOrNil class>>ccg:prolog:expr:index: (in category 'plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: index
- ccg: cg prolog: aBlock expr: aString index: index
  
  	^cg 
+ 		ccgLoad: aBlockOrCTypeStringOrNil 
- 		ccgLoad: aBlock 
  		expr: aString 
  		asPtrFrom: nil
+ 		andThen: (cg ccgValBlock: #nilObject or: #isWordsOrBytes:)!
- 		andThen: (cg ccgValBlock: #nilObject or: #isWordsOrBytes: index: index)!

Item was removed:
- ----- Method: WordsOrNil class>>ccgDeclareCForVar: (in category 'plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#'void *', aSymbolOrString!

Item was added:
+ ----- Method: WordsOrShorts class>>cType (in category 'plugin generation') -----
+ cType
+ 	"Answer the default type for a variable in a SmartSyntaxInterpreterPlugin method assigned an argument whose type spec is the receiver.
+ 	 Note the type is overridable by a given SmartSyntaxInterpreterPlugin if it overrides the class side typeForSpecClass: method."
+ 
+ 	^#'short *'!

Item was changed:
  ----- Method: WordsOrShorts class>>ccg:prolog:expr:index: (in category 'plugin generation') -----
+ ccg: cg prolog: aBlockOrCTypeStringOrNil expr: aString index: stackIndexOrNil
- ccg: cg prolog: aBlock expr: aString index: anInteger
  
  	^cg 
+ 		ccgLoad: aBlockOrCTypeStringOrNil 
- 		ccgLoad: aBlock 
  		expr: aString 
+ 		asPtrFrom: stackIndexOrNil
+ 		andThen: (cg ccgValBlock: #isWordsOrShorts:)!
- 		asShortPtrFrom: anInteger
- 		andThen: (cg ccgValBlock: 'isWordsOrShorts')!

Item was removed:
- ----- Method: WordsOrShorts class>>ccgDeclareCForVar: (in category 'plugin generation') -----
- ccgDeclareCForVar: aSymbolOrString
- 
- 	^#'short *', aSymbolOrString!



More information about the Vm-dev mailing list