[Vm-dev] VM Maker: VMMakerJS-bf.8.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Oct 10 13:46:39 UTC 2014
Bert Freudenberg uploaded a new version of VMMakerJS to project VM Maker:
http://source.squeak.org/VMMaker/VMMakerJS-bf.8.mcz
==================== Summary ====================
Name: VMMakerJS-bf.8
Author: bf
Time: 7 October 2014, 4:05:05.372 pm
UUID: 4917973c-2d76-4738-9be7-505a2fcd3c53
Ancestors: VMMakerJS-bf.7
Translate a couple more plugins.
=============== Diff against VMMakerJS-bf.7 ===============
Item was changed:
----- Method: JSCodeGenerator>>generateCCoercion:on:indent: (in category 'JS translation') -----
generateCCoercion: msgNode on: aStream indent: level
"Generate the JS code for this message onto the given stream."
| expr cType |.
expr := msgNode args first.
cType := msgNode args second value.
(expr isSend and: [expr receiver name = 'interpreterProxy' and: [expr selector = #firstIndexableField:]]) ifTrue: [
cType := msgNode args second value.
self emitJSExpression: expr args first on: aStream.
cType = 'unsigned char *' ifTrue: [^aStream nextPutAll: '.bytes'].
cType = 'unsigned int *' ifTrue: [^aStream nextPutAll: '.words'].
cType = 'int *' ifTrue: [^aStream nextPutAll: '.wordsAsInt32Array()'].
cType = 'short *' ifTrue: [^aStream nextPutAll: '.wordsAsInt16Array()'].
cType = 'float *' ifTrue: [^aStream nextPutAll: '.wordsAsFloat32Array()'].
cType = 'double *' ifTrue: [^aStream nextPutAll: '.wordsAsFloat64Array()'].
self halt.
] ifFalse: [
+ (#('int' 'unsigned int') includes: cType) ifTrue: [
+ aStream nextPutAll: '('.
+ self emitJSExpression: expr on: aStream.
+ ^aStream nextPutAll: '|0)'].
((#('double' 'float') includes: cType) or: ['sqInt (*)(*)'match: cType])
ifFalse: [self halt].
self emitJSExpression: expr on: aStream.
]
!
Item was changed:
----- Method: JSCodeGenerator>>generateFirstIndexableField:on:indent: (in category 'JS hacks') -----
generateFirstIndexableField: msgNode on: aStream indent: level
| parent cType accessor |
self oneBasedArrays: false.
"HACK: detect cType from parent node"
parent := thisContext sender sender sender.
cType := parent method == (TAssignmentNode>>#emitJSCodeOn:level:generator:)
ifTrue: [self typeOfVariable: parent receiver variable name] ifFalse: [
parent method == (TSendNode>>#emitJSCodeAsFunctionCallOn:level:generator:)
ifTrue: [self typeOfArgument: (parent receiver args indexOf: msgNode) in: parent receiver selector] ifFalse: [
msgNode asString = 'interpreterProxy firstIndexableField: mapOop'
ifTrue: ['unsigned int*'] ifFalse: [
+ msgNode asString = 'interpreterProxy firstIndexableField: blockOop'
+ ifTrue: ['int*'] ifFalse: [
+ self halt]]]].
- self halt]]].
cType ifNotNil: [
cType := cType copyReplaceAll: ' *' with: '* '.
accessor := (cType beginsWith: 'unsigned char*') ifTrue: ['.bytes']
ifFalse: [(cType beginsWith: 'unsigned int*') ifTrue: ['.words']
ifFalse: [(cType beginsWith: 'int*') ifTrue: ['.wordsAsInt32Array()']
ifFalse: [(cType beginsWith: 'char*') ifTrue: ['.bytes']
ifFalse: [(cType beginsWith: 'float*') ifTrue: ['.wordsAsFloat32Array()']
ifFalse: [self halt: 'need to handle ', cType]]]]].
accessor ifNotNil: [msgNode args first emitJSCodeOn: aStream level: level generator: self.
^aStream nextPutAll: accessor]].
"generic code below, not needed ever hopefully"
aStream nextPutAll: 'interpreterProxy.'.
^ msgNode emitJSCodeAsFunctionCallOn: aStream level: level generator: self!
Item was added:
+ ----- Method: JSCodeGenerator>>generateIsWords:on:indent: (in category 'JS hacks') -----
+ generateIsWords: msgNode on: aStream indent: level
+ msgNode args first emitJSCodeOn: aStream level: level generator: self.
+ aStream nextPutAll: '.isWords()'.
+ !
Item was changed:
----- Method: JSCodeGenerator>>generateJSCodeForCcode:on:indent: (in category 'JS translation') -----
generateJSCodeForCcode: cCode on: aStream indent: level
cCode = '' ifTrue: [^self].
aStream nextPutAll: (cCodeTranslationDict at: cCode ifAbsent: [
+ (#('sqrt' 'sin' 'cos' 'tan' 'atan' 'atan2' 'log' 'min' 'max' 'floor') anySatisfy: [:fn | fn,'(*)' match: cCode])
+ ifTrue: ['Math.', cCode] ifFalse: [
('opTable[*] = (void *)*' match: cCode)
ifTrue: [cCode copyReplaceAll: '(void *)' with: ''] ifFalse: [
('fn(*Handle, &*Pitch, *)' match: cCode)
ifTrue: [(cCode copyReplaceAll: '&' with: 'function(p){') copyReplaceAll: 'Pitch' with: 'Pitch = p}'] ifFalse: [
(' ((*)querySurfaceFn)*(handle, &destWidth, &destHeight, &destDepth, &destMSB)' match: cCode)
ifTrue: [ 'querySurfaceFn(handle, function(w, h, d, m){destWidth = w; destHeight = h; destDepth = d; destMSB = m; })'] ifFalse: [
(' ((*)querySurfaceFn)*(handle, &sourceWidth, &sourceHeight, &sourceDepth, &sourceMSB)' match: cCode)
ifTrue: [ 'querySurfaceFn(handle, function(w, h, d, m){sourceWidth = w; sourceHeight = h; sourceDepth = d; sourceMSB = m; })'] ifFalse: [
(#('fn(destHandle, affectedL, affectedT, affectedR-affectedL, affectedB-affectedT)',
'fn(sourceHandle, 0, 0, 0, 0)') includes: cCode)
ifTrue: [cCode] ifFalse: [
"See initializeCTranslationDictionary"
+ self error: 'C: ' , cCode]]]]]]])
- self error: 'C: ' , cCode]]]]]])
!
Item was changed:
----- Method: JSCodeGenerator>>initializeCTranslationDictionary (in category 'JS translation') -----
initializeCTranslationDictionary
"Initialize the dictionary mapping message names to actions for C code generation."
| pairs |
translationDict := Dictionary new: 200.
pairs := #(
#& #generateAnd:on:indent:
#| #generateOr:on:indent:
#and: #generateSequentialAnd:on:indent:
#or: #generateSequentialOr:on:indent:
#not #generateNot:on:indent:
#+ #generatePlus:on:indent:
#- #generateMinus:on:indent:
#negated #generateNegated:on:indent:
#abs #generateAbs:on:indent:
#sqrt #generateSqrt:on:indent:
#sin #generateSin:on:indent:
#cos #generateCos:on:indent:
#* #generateTimes:on:indent:
#/ #generateDivide:on:indent:
#// #generateDivide:on:indent:
#\\ #generateModulo:on:indent:
#<< #generateShiftLeft:on:indent:
#>> #generateShiftRight:on:indent:
#min: #generateMin:on:indent:
#max: #generateMax:on:indent:
#between:and: #generateBetweenAnd:on:indent:
#bitAnd: #generateBitAnd:on:indent:
#bitOr: #generateBitOr:on:indent:
#bitXor: #generateBitXor:on:indent:
#bitShift: #generateBitShift:on:indent:
#signedBitShift: #generateSignedBitShift:on:indent:
#bitInvert32 #generateBitInvert32:on:indent:
#bitClear: #generateBitClear:on:indent:
#< #generateLessThan:on:indent:
#<= #generateLessThanOrEqual:on:indent:
#= #generateEqual:on:indent:
#> #generateGreaterThan:on:indent:
#>= #generateGreaterThanOrEqual:on:indent:
#~= #generateNotEqual:on:indent:
#== #generateEqual:on:indent:
#~~ #generateNotEqual:on:indent:
#isNil #generateIsNil:on:indent:
#notNil #generateNotNil:on:indent:
#whileTrue: #generateWhileTrue:on:indent:
#whileFalse: #generateWhileFalse:on:indent:
#whileTrue #generateDoWhileTrue:on:indent:
#whileFalse #generateDoWhileFalse:on:indent:
#to:do: #generateToDo:on:indent:
#to:by:do: #generateToByDo:on:indent:
#repeat #generateRepeat:on:indent:
#ifTrue: #generateIfTrue:on:indent:
#ifFalse: #generateIfFalse:on:indent:
#ifTrue:ifFalse: #generateIfTrueIfFalse:on:indent:
#ifFalse:ifTrue: #generateIfFalseIfTrue:on:indent:
#at: #generateAt:on:indent:
#at:put: #generateAtPut:on:indent:
#basicAt: #generateAt:on:indent:
#basicAt:put: #generateAtPut:on:indent:
#integerValueOf: #generateIntegerValueOf:on:indent:
#integerObjectOf: #generateIntegerObjectOf:on:indent:
#isIntegerObject: #generateIsIntegerObject:on:indent:
#cCode: #generateInlineCCode:on:indent:
#cCode:inSmalltalk: #generateInlineCCode:on:indent:
#cPreprocessorDirective: #generateInlineCPreprocessorDirective:on:indent:
#preprocessorExpression: #generateInlineCppDirective:on:indent:
#isDefined:inSmalltalk:comment:ifTrue: #generateInlineCppIfDef:on:indent:
#isDefined:inSmalltalk:comment:ifTrue:ifFalse: #generateInlineCppIfDefElse:on:indent:
#isDefinedTrueExpression:inSmalltalk:comment:ifTrue:ifFalse: #generateInlineCppIfElse:on:indent:
#cCoerce:to: #generateCCoercion:on:indent:
#cCoerceSimple:to: #generateCCoercion:on:indent:
#addressOf: #generateAddressOf:on:indent:
#signedIntFromLong #generateSignedIntFromLong:on:indent:
#signedIntToLong #generateSignedIntToLong:on:indent:
#signedIntFromShort #generateSignedIntFromShort:on:indent:
#signedIntToShort #generateSignedIntToShort:on:indent:
#preIncrement #generatePreIncrement:on:indent:
#preDecrement #generatePreDecrement:on:indent:
#inline: #generateInlineDirective:on:indent:
#asFloat #generateAsFloat:on:indent:
#asInteger #generateAsInteger:on:indent:
#asUnsignedInteger #generateAsUnsignedInteger:on:indent:
#asSymbol #generateAsSymbol:on:indent:
#anyMask: #generateBitAnd:on:indent:
#raisedTo: #generateRaisedTo:on:indent:
#touch: #generateTouch:on:indent:
#bytesPerWord #generateBytesPerWord:on:indent:
#baseHeaderSize #generateBaseHeaderSize:on:indent:
#sharedCodeNamed:inCase: #generateSharedCodeDirective:on:indent:
#perform: #generatePerform:on:indent:
#perform:with: #generatePerform:on:indent:
#perform:with:with: #generatePerform:on:indent:
#perform:with:with:with: #generatePerform:on:indent:
#perform:with:with:with:with: #generatePerform:on:indent:
#perform:with:with:with:with:with: #generatePerform:on:indent:
#shouldNotImplement #generateSmalltalkMetaError:on:indent:
#shouldBeImplemented #generateSmalltalkMetaError:on:indent:
"optimized interpreterProxy calls"
#firstIndexableField: #generateFirstIndexableField:on:indent:
#slotSizeOf: #generateSlotSizeOf:on:indent:
#stSizeOf: #generateSlotSizeOf:on:indent:
#byteSizeOfBytes: #generateByteSizeOf:on:indent:
#byteSizeOf: #generateByteSizeOf:on:indent:
#fetchClassOf: #generateFetchClassOf:on:indent:
#superclassOf: #generateSuperclassOf:on:indent:
#instanceSizeOf: #generateInstanceSizeOf:on:indent:
#is:KindOf: #generateIsKindOf:on:indent:
#isFloatObject: #generateIsFloatObject:on:indent:
+ #isWords: #generateIsWords:on:indent:
#isWordsOrBytes: #generateIsWordsOrBytes:on:indent:
#cDigitCopyFrom:to:len: #generateCDigitCopy:on:indent:
#sizeOfSTArrayFromCPrimitive: #generateSizeOfSTArrayFromCPrimitive:on:indent:
#asciiValue #generateIdentityUnary:on:indent:
#primitiveFail #generateInterpreterProxyCall:on:indent:
#intAtPointer: #generateIntAtPointer:on:indent:
#byteAtPointer: #generateByteAtPointer:on:indent:
#oopForPointer: #generateOopForPointer:on:indent:
#long32At: #generateLong32At:on:indent:
#srcLongAt: #generateSrcLongAt:on:indent:
#dstLongAt: #generateDstLongAt:on:indent:
#dstLongAt:put: #generateDstLongAtPut:on:indent:
).
1 to: pairs size by: 2 do: [:i |
translationDict at: (pairs at: i) put: (pairs at: i + 1)].
pairs := #(
#ifTrue: #generateIfTrueAsArgument:on:indent:
#ifFalse: #generateIfFalseAsArgument:on:indent:
#ifTrue:ifFalse: #generateIfTrueIfFalseAsArgument:on:indent:
#ifFalse:ifTrue: #generateIfFalseIfTrueAsArgument:on:indent:
#cCode: #generateInlineCCodeAsArgument:on:indent:
#cCode:inSmalltalk: #generateInlineCCodeAsArgument:on:indent:
).
asArgumentTranslationDict := Dictionary new: 8.
1 to: pairs size by: 2 do: [:i |
asArgumentTranslationDict at: (pairs at: i) put: (pairs at: i + 1)].
cCodeTranslationDict := Dictionary new: 8.
pairs := #(
'fprintf(stderr, "\n%s: %s", moduleName, s)' 'console.log(moduleName + ": " + s)'
'interpreterProxy->majorVersion() == VM_PROXY_MAJOR' 'interpreterProxy.majorVersion() == VM_PROXY_MAJOR'
'interpreterProxy->minorVersion() >= VM_PROXY_MINOR' 'interpreterProxy.minorVersion() >= VM_PROXY_MINOR'
- 'sqrt(result)' 'Math.sqrt(result)'
- 'sqrt(len)' 'Math.sqrt(len)'
- 'atan2(dy,dx)' 'Math.atan2(dy, dx)'
'rand()' 'Math.random()'
'*src++' 'src[_src++]'
'*dst++ = max' 'dst[_dst++] = max'
'src++' '_src++'
'*dst++ = *src; src += 2' 'dst[_dst++] = src[_src]; _src += 2'
+ 'tX' 'tX'
+ 'tY' 'tY'
-
).
1 to: pairs size by: 2 do: [:i |
cCodeTranslationDict at: (pairs at: i) put: (pairs at: i + 1)].
!
Item was changed:
----- Method: JSPluginCodeGenerator>>ignoredMethods (in category 'public') -----
ignoredMethods
+ pluginName = 'BitBltPlugin' ifTrue: [
- pluginName = 'BitBltSimulation' ifTrue: [
^#(dstLongAt: dstLongAt:put: srcLongAt:)].
pluginName = 'ScratchPlugin' ifTrue: [
^(ScratchPlugin organization listAtCategoryNamed: 'serial port'),
(ScratchPlugin organization listAtCategoryNamed: 'os functions')].
+ ^super ignoredMethods!
- !
More information about the Vm-dev
mailing list