<div dir="ltr">Hi Bert,<div><br></div><div> instead of all these hacks for cCode:inSmalltalk: why not add cCode:jsCode:inSmalltalk: ?</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 3, 2014 at 3:48 AM, <span dir="ltr"><<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Bert Freudenberg uploaded a new version of VMMakerJS to project VM Maker:<br>
<a href="http://source.squeak.org/VMMaker/VMMakerJS-bf.14.mcz" target="_blank">http://source.squeak.org/VMMaker/VMMakerJS-bf.14.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: VMMakerJS-bf.14<br>
Author: bf<br>
Time: 3 November 2014, 12:38:30.528 pm<br>
UUID: 6a767eb3-c538-442f-91d0-c7d61c865651<br>
Ancestors: VMMakerJS-bf.13<br>
<br>
Fix exp() math call for Klatt<br>
<br>
=============== Diff against VMMakerJS-bf.13 ===============<br>
<br>
Item was removed:<br>
- ----- Method: JSCodeGenerator>>generateAbs:on:indent: (in category 'JS translation') -----<br>
- generateAbs: msgNode on: aStream indent: level<br>
- "Generate the JS code for the negated message onto the given stream."<br>
-<br>
- aStream nextPutAll: 'Math.abs('.<br>
- self emitJSExpression: msgNode receiver on: aStream.<br>
- aStream nextPutAll: ')'.<br>
- !<br>
<br>
Item was removed:<br>
- ----- Method: JSCodeGenerator>>generateCos:on:indent: (in category 'JS translation') -----<br>
- generateCos: msgNode on: aStream indent: level<br>
- "Generate the JS code for the message onto the given stream."<br>
-<br>
- aStream nextPutAll: 'Math.cos('.<br>
- self emitJSExpression: msgNode receiver on: aStream.<br>
- aStream nextPutAll: ')'.<br>
- !<br>
<br>
Item was changed:<br>
----- Method: JSCodeGenerator>>generateJSCodeForCcode:on:indent: (in category 'JS translation') -----<br>
generateJSCodeForCcode: cCode on: aStream indent: level<br>
cCode = '' ifTrue: [^self].<br>
aStream nextPutAll: (cCodeTranslationDict at: cCode ifAbsent: [<br>
+ (#('sqrt' 'sin' 'cos' 'tan' 'atan' 'atan2' 'log' 'exp' 'min' 'max' 'floor') anySatisfy: [:fn | fn,'(*)' match: cCode])<br>
- (#('sqrt' 'sin' 'cos' 'tan' 'atan' 'atan2' 'log' 'min' 'max' 'floor') anySatisfy: [:fn | fn,'(*)' match: cCode])<br>
ifTrue: ['Math.', cCode] ifFalse: [<br>
('opTable[*] = (void *)*' match: cCode)<br>
ifTrue: [cCode copyReplaceAll: '(void *)' with: ''] ifFalse: [<br>
('fn(*Handle, &*Pitch, *)' match: cCode)<br>
ifTrue: [(cCode copyReplaceAll: '&' with: 'function(p){') copyReplaceAll: 'Pitch' with: 'Pitch = p}'] ifFalse: [<br>
(' ((*)querySurfaceFn)*(handle, &destWidth, &destHeight, &destDepth, &destMSB)' match: cCode)<br>
ifTrue: [ 'querySurfaceFn(handle, function(w, h, d, m){destWidth = w; destHeight = h; destDepth = d; destMSB = m; })'] ifFalse: [<br>
(' ((*)querySurfaceFn)*(handle, &sourceWidth, &sourceHeight, &sourceDepth, &sourceMSB)' match: cCode)<br>
ifTrue: [ 'querySurfaceFn(handle, function(w, h, d, m){sourceWidth = w; sourceHeight = h; sourceDepth = d; sourceMSB = m; })'] ifFalse: [<br>
(#('fn(destHandle, affectedL, affectedT, affectedR-affectedL, affectedB-affectedT)',<br>
'fn(sourceHandle, 0, 0, 0, 0)') includes: cCode)<br>
ifTrue: [cCode] ifFalse: [<br>
"See initializeCTranslationDictionary"<br>
self error: 'C: ' , cCode]]]]]]])<br>
!<br>
<br>
Item was added:<br>
+ ----- Method: JSCodeGenerator>>generateMath:on:indent: (in category 'JS translation') -----<br>
+ generateMath: msgNode on: aStream indent: level<br>
+ "Generate the JS code for the message onto the given stream."<br>
+ aStream nextPutAll: 'Math.'; nextPutAll: msgNode selector; nextPut: $(.<br>
+ self emitJSExpression: msgNode receiver on: aStream.<br>
+ aStream nextPut: $).<br>
+ !<br>
<br>
Item was removed:<br>
- ----- Method: JSCodeGenerator>>generateSin:on:indent: (in category 'JS translation') -----<br>
- generateSin: msgNode on: aStream indent: level<br>
- "Generate the JS code for the message onto the given stream."<br>
-<br>
- aStream nextPutAll: 'Math.sin('.<br>
- self emitJSExpression: msgNode receiver on: aStream.<br>
- aStream nextPutAll: ')'.<br>
- !<br>
<br>
Item was removed:<br>
- ----- Method: JSCodeGenerator>>generateSqrt:on:indent: (in category 'JS translation') -----<br>
- generateSqrt: msgNode on: aStream indent: level<br>
- "Generate the JS code for the message onto the given stream."<br>
-<br>
- aStream nextPutAll: 'Math.sqrt('.<br>
- self emitJSExpression: msgNode receiver on: aStream.<br>
- aStream nextPutAll: ')'.<br>
- !<br>
<br>
Item was changed:<br>
----- Method: JSCodeGenerator>>initializeCTranslationDictionary (in category 'JS translation') -----<br>
initializeCTranslationDictionary<br>
"Initialize the dictionary mapping message names to actions for C code generation."<br>
<br>
| pairs |<br>
translationDict := Dictionary new: 200.<br>
pairs := #(<br>
#& #generateAnd:on:indent:<br>
#| #generateOr:on:indent:<br>
#and: #generateSequentialAnd:on:indent:<br>
#or: #generateSequentialOr:on:indent:<br>
#not #generateNot:on:indent:<br>
<br>
#+ #generatePlus:on:indent:<br>
#- #generateMinus:on:indent:<br>
#negated #generateNegated:on:indent:<br>
+ #abs #generateMath:on:indent:<br>
+ #sqrt #generateMath:on:indent:<br>
+ #sin #generateMath:on:indent:<br>
+ #cos #generateMath:on:indent:<br>
+ #tan #generateMath:on:indent:<br>
+ #atan #generateMath:on:indent:<br>
+ #exp #generateMath:on:indent:<br>
+ #log #generateMath:on:indent:<br>
- #abs #generateAbs:on:indent:<br>
- #sqrt #generateSqrt:on:indent:<br>
- #sin #generateSin:on:indent:<br>
- #cos #generateCos:on:indent:<br>
#* #generateTimes:on:indent:<br>
#/ #generateDivide:on:indent:<br>
#// #generateDivide:on:indent:<br>
#\\ #generateModulo:on:indent:<br>
#<< #generateShiftLeft:on:indent:<br>
#>> #generateShiftRight:on:indent:<br>
#min: #generateMin:on:indent:<br>
#max: #generateMax:on:indent:<br>
#between:and: #generateBetweenAnd:on:indent:<br>
<br>
#bitAnd: #generateBitAnd:on:indent:<br>
#bitOr: #generateBitOr:on:indent:<br>
#bitXor: #generateBitXor:on:indent:<br>
#bitShift: #generateBitShift:on:indent:<br>
#signedBitShift: #generateSignedBitShift:on:indent:<br>
#bitInvert32 #generateBitInvert32:on:indent:<br>
#bitClear: #generateBitClear:on:indent:<br>
<br>
#< #generateLessThan:on:indent:<br>
#<= #generateLessThanOrEqual:on:indent:<br>
#= #generateEqual:on:indent:<br>
#> #generateGreaterThan:on:indent:<br>
#>= #generateGreaterThanOrEqual:on:indent:<br>
#~= #generateNotEqual:on:indent:<br>
#== #generateEqual:on:indent:<br>
#~~ #generateNotEqual:on:indent:<br>
#isNil #generateIsNil:on:indent:<br>
#notNil #generateNotNil:on:indent:<br>
<br>
#whileTrue: #generateWhileTrue:on:indent:<br>
#whileFalse: #generateWhileFalse:on:indent:<br>
#whileTrue #generateDoWhileTrue:on:indent:<br>
#whileFalse #generateDoWhileFalse:on:indent:<br>
#to:do: #generateToDo:on:indent:<br>
#to:by:do: #generateToByDo:on:indent:<br>
#repeat #generateRepeat:on:indent:<br>
<br>
#ifTrue: #generateIfTrue:on:indent:<br>
#ifFalse: #generateIfFalse:on:indent:<br>
#ifTrue:ifFalse: #generateIfTrueIfFalse:on:indent:<br>
#ifFalse:ifTrue: #generateIfFalseIfTrue:on:indent:<br>
<br>
#at: #generateAt:on:indent:<br>
#at:put: #generateAtPut:on:indent:<br>
#basicAt: #generateAt:on:indent:<br>
#basicAt:put: #generateAtPut:on:indent:<br>
<br>
#integerValueOf: #generateIntegerValueOf:on:indent:<br>
#integerObjectOf: #generateIntegerObjectOf:on:indent:<br>
#isIntegerObject: #generateIsIntegerObject:on:indent:<br>
#cCode: #generateInlineCCode:on:indent:<br>
#cCode:inSmalltalk: #generateInlineCCode:on:indent:<br>
#cPreprocessorDirective: #generateInlineCPreprocessorDirective:on:indent:<br>
#preprocessorExpression: #generateInlineCppDirective:on:indent:<br>
#isDefined:inSmalltalk:comment:ifTrue: #generateInlineCppIfDef:on:indent:<br>
#isDefined:inSmalltalk:comment:ifTrue:ifFalse: #generateInlineCppIfDefElse:on:indent:<br>
#isDefinedTrueExpression:inSmalltalk:comment:ifTrue:ifFalse: #generateInlineCppIfElse:on:indent:<br>
#cCoerce:to: #generateCCoercion:on:indent:<br>
#cCoerceSimple:to: #generateCCoercion:on:indent:<br>
#addressOf: #generateAddressOf:on:indent:<br>
#signedIntFromLong #generateSignedIntFromLong:on:indent:<br>
#signedIntToLong #generateSignedIntToLong:on:indent:<br>
#signedIntFromShort #generateSignedIntFromShort:on:indent:<br>
#signedIntToShort #generateSignedIntToShort:on:indent:<br>
#preIncrement #generatePreIncrement:on:indent:<br>
#preDecrement #generatePreDecrement:on:indent:<br>
#inline: #generateInlineDirective:on:indent:<br>
#asFloat #generateAsFloat:on:indent:<br>
#asInteger #generateAsInteger:on:indent:<br>
#asUnsignedInteger #generateAsUnsignedInteger:on:indent:<br>
#asSymbol #generateAsSymbol:on:indent:<br>
#anyMask: #generateBitAnd:on:indent:<br>
#raisedTo: #generateRaisedTo:on:indent:<br>
#touch: #generateTouch:on:indent:<br>
#bytesPerWord #generateBytesPerWord:on:indent:<br>
#baseHeaderSize #generateBaseHeaderSize:on:indent:<br>
<br>
#sharedCodeNamed:inCase: #generateSharedCodeDirective:on:indent:<br>
<br>
#perform: #generatePerform:on:indent:<br>
#perform:with: #generatePerform:on:indent:<br>
#perform:with:with: #generatePerform:on:indent:<br>
#perform:with:with:with: #generatePerform:on:indent:<br>
#perform:with:with:with:with: #generatePerform:on:indent:<br>
#perform:with:with:with:with:with: #generatePerform:on:indent:<br>
<br>
#shouldNotImplement #generateSmalltalkMetaError:on:indent:<br>
#shouldBeImplemented #generateSmalltalkMetaError:on:indent:<br>
<br>
"optimized interpreterProxy calls"<br>
#firstIndexableField: #generateFirstIndexableField:on:indent:<br>
#slotSizeOf: #generateSlotSizeOf:on:indent:<br>
#stSizeOf: #generateSlotSizeOf:on:indent:<br>
#byteSizeOfBytes: #generateByteSizeOf:on:indent:<br>
#byteSizeOf: #generateByteSizeOf:on:indent:<br>
#fetchClassOf: #generateFetchClassOf:on:indent:<br>
#superclassOf: #generateSuperclassOf:on:indent:<br>
#instanceSizeOf: #generateInstanceSizeOf:on:indent:<br>
#is:KindOf: #generateIsKindOf:on:indent:<br>
#isFloatObject: #generateIsFloatObject:on:indent:<br>
#cDigitCopyFrom:to:len: #generateCDigitCopy:on:indent:<br>
#sizeOfSTArrayFromCPrimitive: #generateSizeOfSTArrayFromCPrimitive:on:indent:<br>
#asciiValue #generateIdentityUnary:on:indent:<br>
#primitiveFail #generateInterpreterProxyCall:on:indent:<br>
#intAtPointer: #generateIntAtPointer:on:indent:<br>
#byteAtPointer: #generateByteAtPointer:on:indent:<br>
#oopForPointer: #generateOopForPointer:on:indent:<br>
#long32At: #generateLong32At:on:indent:<br>
#srcLongAt: #generateSrcLongAt:on:indent:<br>
#dstLongAt: #generateDstLongAt:on:indent:<br>
#dstLongAt:put: #generateDstLongAtPut:on:indent:<br>
).<br>
<br>
1 to: pairs size by: 2 do: [:i |<br>
translationDict at: (pairs at: i) put: (pairs at: i + 1)].<br>
<br>
pairs := #(<br>
#ifTrue: #generateIfTrueAsArgument:on:indent:<br>
#ifFalse: #generateIfFalseAsArgument:on:indent:<br>
#ifTrue:ifFalse: #generateIfTrueIfFalseAsArgument:on:indent:<br>
#ifFalse:ifTrue: #generateIfFalseIfTrueAsArgument:on:indent:<br>
#cCode: #generateInlineCCodeAsArgument:on:indent:<br>
#cCode:inSmalltalk: #generateInlineCCodeAsArgument:on:indent:<br>
).<br>
<br>
asArgumentTranslationDict := Dictionary new: 8.<br>
1 to: pairs size by: 2 do: [:i |<br>
asArgumentTranslationDict at: (pairs at: i) put: (pairs at: i + 1)].<br>
<br>
cCodeTranslationDict := Dictionary new: 8.<br>
pairs := #(<br>
'fprintf(stderr, "\n%s: %s", moduleName, s)' 'console.log(moduleName + ": " + s)'<br>
'interpreterProxy->majorVersion() == VM_PROXY_MAJOR' 'interpreterProxy.majorVersion() == VM_PROXY_MAJOR'<br>
'interpreterProxy->minorVersion() >= VM_PROXY_MINOR' 'interpreterProxy.minorVersion() >= VM_PROXY_MINOR'<br>
'rand()' 'Math.random()'<br>
'*src++' 'src[_src++]'<br>
'*dst++ = max' 'dst[_dst++] = max'<br>
'src++' '_src++'<br>
'*dst++ = *src; src += 2' 'dst[_dst++] = src[_src]; _src += 2'<br>
'tX' 'tX'<br>
'tY' 'tY'<br>
).<br>
1 to: pairs size by: 2 do: [:i |<br>
cCodeTranslationDict at: (pairs at: i) put: (pairs at: i + 1)].<br>
!<br>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">best,<div>Eliot</div></div>
</div>