[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