<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">&lt;<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>&gt;</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&gt;&gt;generateAbs:on:indent: (in category &#39;JS translation&#39;) -----<br>
- generateAbs: msgNode on: aStream indent: level<br>
-       &quot;Generate the JS code for the negated message onto the given stream.&quot;<br>
-<br>
-       aStream nextPutAll: &#39;Math.abs(&#39;.<br>
-       self emitJSExpression: msgNode receiver on: aStream.<br>
-       aStream nextPutAll: &#39;)&#39;.<br>
- !<br>
<br>
Item was removed:<br>
- ----- Method: JSCodeGenerator&gt;&gt;generateCos:on:indent: (in category &#39;JS translation&#39;) -----<br>
- generateCos: msgNode on: aStream indent: level<br>
-       &quot;Generate the JS code for the message onto the given stream.&quot;<br>
-<br>
-       aStream nextPutAll: &#39;Math.cos(&#39;.<br>
-       self emitJSExpression: msgNode receiver on: aStream.<br>
-       aStream nextPutAll: &#39;)&#39;.<br>
- !<br>
<br>
Item was changed:<br>
  ----- Method: JSCodeGenerator&gt;&gt;generateJSCodeForCcode:on:indent: (in category &#39;JS translation&#39;) -----<br>
  generateJSCodeForCcode: cCode on: aStream indent: level<br>
        cCode = &#39;&#39; ifTrue: [^self].<br>
        aStream nextPutAll: (cCodeTranslationDict at: cCode ifAbsent: [<br>
+               (#(&#39;sqrt&#39; &#39;sin&#39; &#39;cos&#39; &#39;tan&#39; &#39;atan&#39; &#39;atan2&#39; &#39;log&#39; &#39;exp&#39; &#39;min&#39; &#39;max&#39; &#39;floor&#39;) anySatisfy: [:fn | fn,&#39;(*)&#39; match: cCode])<br>
-               (#(&#39;sqrt&#39; &#39;sin&#39; &#39;cos&#39; &#39;tan&#39; &#39;atan&#39; &#39;atan2&#39; &#39;log&#39; &#39;min&#39; &#39;max&#39; &#39;floor&#39;) anySatisfy: [:fn | fn,&#39;(*)&#39; match: cCode])<br>
                        ifTrue: [&#39;Math.&#39;, cCode] ifFalse: [<br>
                (&#39;opTable[*] = (void *)*&#39; match: cCode)<br>
                        ifTrue: [cCode copyReplaceAll: &#39;(void *)&#39; with: &#39;&#39;] ifFalse: [<br>
                (&#39;fn(*Handle, &amp;*Pitch, *)&#39; match: cCode)<br>
                        ifTrue: [(cCode copyReplaceAll: &#39;&amp;&#39; with: &#39;function(p){&#39;) copyReplaceAll: &#39;Pitch&#39; with: &#39;Pitch = p}&#39;] ifFalse: [<br>
                (&#39; ((*)querySurfaceFn)*(handle, &amp;destWidth, &amp;destHeight, &amp;destDepth, &amp;destMSB)&#39; match: cCode)<br>
                        ifTrue: [ &#39;querySurfaceFn(handle, function(w, h, d, m){destWidth = w; destHeight = h; destDepth = d; destMSB = m; })&#39;] ifFalse: [<br>
                (&#39; ((*)querySurfaceFn)*(handle, &amp;sourceWidth, &amp;sourceHeight, &amp;sourceDepth, &amp;sourceMSB)&#39; match: cCode)<br>
                        ifTrue: [ &#39;querySurfaceFn(handle, function(w, h, d, m){sourceWidth = w; sourceHeight = h; sourceDepth = d; sourceMSB = m; })&#39;] ifFalse: [<br>
                (#(&#39;fn(destHandle, affectedL, affectedT, affectedR-affectedL, affectedB-affectedT)&#39;,<br>
                        &#39;fn(sourceHandle, 0, 0, 0, 0)&#39;) includes: cCode)<br>
                        ifTrue: [cCode] ifFalse: [<br>
                &quot;See initializeCTranslationDictionary&quot;<br>
                self error: &#39;C: &#39; , cCode]]]]]]])<br>
  !<br>
<br>
Item was added:<br>
+ ----- Method: JSCodeGenerator&gt;&gt;generateMath:on:indent: (in category &#39;JS translation&#39;) -----<br>
+ generateMath: msgNode on: aStream indent: level<br>
+       &quot;Generate the JS code for the message onto the given stream.&quot;<br>
+       aStream nextPutAll: &#39;Math.&#39;; nextPutAll: msgNode selector; nextPut: $(.<br>
+       self emitJSExpression: msgNode receiver on: aStream.<br>
+       aStream nextPut: $).<br>
+ !<br>
<br>
Item was removed:<br>
- ----- Method: JSCodeGenerator&gt;&gt;generateSin:on:indent: (in category &#39;JS translation&#39;) -----<br>
- generateSin: msgNode on: aStream indent: level<br>
-       &quot;Generate the JS code for the message onto the given stream.&quot;<br>
-<br>
-       aStream nextPutAll: &#39;Math.sin(&#39;.<br>
-       self emitJSExpression: msgNode receiver on: aStream.<br>
-       aStream nextPutAll: &#39;)&#39;.<br>
- !<br>
<br>
Item was removed:<br>
- ----- Method: JSCodeGenerator&gt;&gt;generateSqrt:on:indent: (in category &#39;JS translation&#39;) -----<br>
- generateSqrt: msgNode on: aStream indent: level<br>
-       &quot;Generate the JS code for the message onto the given stream.&quot;<br>
-<br>
-       aStream nextPutAll: &#39;Math.sqrt(&#39;.<br>
-       self emitJSExpression: msgNode receiver on: aStream.<br>
-       aStream nextPutAll: &#39;)&#39;.<br>
- !<br>
<br>
Item was changed:<br>
  ----- Method: JSCodeGenerator&gt;&gt;initializeCTranslationDictionary (in category &#39;JS translation&#39;) -----<br>
  initializeCTranslationDictionary<br>
        &quot;Initialize the dictionary mapping message names to actions for C code generation.&quot;<br>
<br>
        | pairs |<br>
        translationDict := Dictionary new: 200.<br>
        pairs := #(<br>
        #&amp;                              #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>
        #&lt;&lt;                     #generateShiftLeft:on:indent:<br>
        #&gt;&gt;                     #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>
        #&lt;                              #generateLessThan:on:indent:<br>
        #&lt;=                     #generateLessThanOrEqual:on:indent:<br>
        #=                              #generateEqual:on:indent:<br>
        #&gt;                              #generateGreaterThan:on:indent:<br>
        #&gt;=                     #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>
        &quot;optimized interpreterProxy calls&quot;<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>
                &#39;fprintf(stderr, &quot;\n%s: %s&quot;, moduleName, s)&#39;                                    &#39;console.log(moduleName + &quot;: &quot; + s)&#39;<br>
                &#39;interpreterProxy-&gt;majorVersion() == VM_PROXY_MAJOR&#39;    &#39;interpreterProxy.majorVersion() == VM_PROXY_MAJOR&#39;<br>
                &#39;interpreterProxy-&gt;minorVersion() &gt;= VM_PROXY_MINOR&#39;    &#39;interpreterProxy.minorVersion() &gt;= VM_PROXY_MINOR&#39;<br>
                &#39;rand()&#39;                                                                                                                &#39;Math.random()&#39;<br>
                &#39;*src++&#39;                                                                                                        &#39;src[_src++]&#39;<br>
                &#39;*dst++ = max&#39;                                                                                          &#39;dst[_dst++] = max&#39;<br>
                &#39;src++&#39;                                                                                                         &#39;_src++&#39;<br>
                &#39;*dst++ = *src; src += 2&#39;                                                                       &#39;dst[_dst++] = src[_src]; _src += 2&#39;<br>
                &#39;tX&#39;                                                                                                                    &#39;tX&#39;<br>
                &#39;tY&#39;                                                                                                                    &#39;tY&#39;<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>