Hi Bert,
instead of all these hacks for cCode:inSmalltalk: why not add cCode:jsCode:inSmalltalk: ?
On Mon, Nov 3, 2014 at 3:48 AM, commits@source.squeak.org wrote:
Bert Freudenberg uploaded a new version of VMMakerJS to project VM Maker: http://source.squeak.org/VMMaker/VMMakerJS-bf.14.mcz
==================== Summary ====================
Name: VMMakerJS-bf.14 Author: bf Time: 3 November 2014, 12:38:30.528 pm UUID: 6a767eb3-c538-442f-91d0-c7d61c865651 Ancestors: VMMakerJS-bf.13
Fix exp() math call for Klatt
=============== Diff against VMMakerJS-bf.13 ===============
Item was removed:
- ----- Method: JSCodeGenerator>>generateAbs:on:indent: (in category 'JS
translation') -----
- generateAbs: msgNode on: aStream indent: level
"Generate the JS code for the negated message onto the given
stream."
aStream nextPutAll: 'Math.abs('.
self emitJSExpression: msgNode receiver on: aStream.
aStream nextPutAll: ')'.
- !
Item was removed:
- ----- Method: JSCodeGenerator>>generateCos:on:indent: (in category 'JS
translation') -----
- generateCos: msgNode on: aStream indent: level
"Generate the JS code for the message onto the given stream."
aStream nextPutAll: 'Math.cos('.
self emitJSExpression: msgNode receiver on: aStream.
aStream nextPutAll: ')'.
- !
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' 'exp'
'min' 'max' 'floor') anySatisfy: [:fn | fn,'(*)' match: cCode])
(#('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]]]]]]]) !
Item was added:
- ----- Method: JSCodeGenerator>>generateMath:on:indent: (in category 'JS
translation') -----
- generateMath: msgNode on: aStream indent: level
"Generate the JS code for the message onto the given stream."
aStream nextPutAll: 'Math.'; nextPutAll: msgNode selector;
nextPut: $(.
self emitJSExpression: msgNode receiver on: aStream.
aStream nextPut: $).
- !
Item was removed:
- ----- Method: JSCodeGenerator>>generateSin:on:indent: (in category 'JS
translation') -----
- generateSin: msgNode on: aStream indent: level
"Generate the JS code for the message onto the given stream."
aStream nextPutAll: 'Math.sin('.
self emitJSExpression: msgNode receiver on: aStream.
aStream nextPutAll: ')'.
- !
Item was removed:
- ----- Method: JSCodeGenerator>>generateSqrt:on:indent: (in category 'JS
translation') -----
- generateSqrt: msgNode on: aStream indent: level
"Generate the JS code for the message onto the given stream."
aStream nextPutAll: 'Math.sqrt('.
self emitJSExpression: msgNode receiver on: aStream.
aStream nextPutAll: ')'.
- !
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 #generateMath:on:indent:
#sqrt #generateMath:on:indent:
#sin #generateMath:on:indent:
#cos #generateMath:on:indent:
#tan #generateMath:on:indent:
#atan #generateMath:on:indent:
#exp #generateMath:on:indent:
#log #generateMath: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: #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' '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)]. !
On 03.11.2014, at 19:43, Eliot Miranda eliot.miranda@gmail.com wrote:
Hi Bert,
instead of all these hacks for cCode:inSmalltalk: why not add cCode:jsCode:inSmalltalk: ?
Well, I initially didn't want to touch any plugin code. And I don't want to burden plugin writers with yet another thing to keep in mind.
The Right Thing to do would be to eliminate the uses of literal C code in those plugins that do not link to external libraries (which are the ones I translated to JS).
- Bert -
vm-dev@lists.squeakfoundation.org