[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