[Vm-dev] VM Maker: VMMakerJS-bf.14.mcz

Eliot Miranda eliot.miranda at gmail.com
Mon Nov 3 18:43:53 UTC 2014


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 at 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)].
>   !
>
>


-- 
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20141103/99815fff/attachment-0001.htm


More information about the Vm-dev mailing list