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!
vm-dev@lists.squeakfoundation.org