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

commits at source.squeak.org commits at source.squeak.org
Fri Oct 10 13:46:39 UTC 2014


Bert Freudenberg uploaded a new version of VMMakerJS to project VM Maker:
http://source.squeak.org/VMMaker/VMMakerJS-bf.8.mcz

==================== Summary ====================

Name: VMMakerJS-bf.8
Author: bf
Time: 7 October 2014, 4:05:05.372 pm
UUID: 4917973c-2d76-4738-9be7-505a2fcd3c53
Ancestors: VMMakerJS-bf.7

Translate a couple more plugins.

=============== Diff against VMMakerJS-bf.7 ===============

Item was changed:
  ----- Method: JSCodeGenerator>>generateCCoercion:on:indent: (in category 'JS translation') -----
  generateCCoercion: msgNode on: aStream indent: level
  	"Generate the JS code for this message onto the given stream."
  	| expr cType |.
  	expr := msgNode args first.
  	cType := msgNode args second value.
  	(expr isSend and: [expr receiver name = 'interpreterProxy' and: [expr selector = #firstIndexableField:]]) ifTrue: [
  		cType := msgNode args second value.
  		self emitJSExpression: expr args first on: aStream.
  		cType = 'unsigned char *' ifTrue: [^aStream nextPutAll: '.bytes'].
  		cType = 'unsigned int *' ifTrue: [^aStream nextPutAll: '.words'].
  		cType = 'int *' ifTrue: [^aStream nextPutAll: '.wordsAsInt32Array()'].
  		cType = 'short *' ifTrue: [^aStream nextPutAll: '.wordsAsInt16Array()'].
  		cType = 'float *' ifTrue: [^aStream nextPutAll: '.wordsAsFloat32Array()'].
  		cType = 'double *' ifTrue: [^aStream nextPutAll: '.wordsAsFloat64Array()'].
  		self halt.
  	] ifFalse: [
+ 		(#('int' 'unsigned int') includes: cType) ifTrue: [
+ 			aStream nextPutAll: '('.
+ 			self emitJSExpression: expr on: aStream.
+ 			^aStream nextPutAll: '|0)'].
  		((#('double' 'float') includes: cType) or: ['sqInt (*)(*)'match: cType])
  			ifFalse: [self halt].
  		self emitJSExpression: expr on: aStream.
  	]
  !

Item was changed:
  ----- Method: JSCodeGenerator>>generateFirstIndexableField:on:indent: (in category 'JS hacks') -----
  generateFirstIndexableField: msgNode on: aStream indent: level
  	| parent cType accessor |
  	self oneBasedArrays: false.
  	"HACK: detect cType from parent node"
  	parent := thisContext sender sender sender.
  	cType := parent method == (TAssignmentNode>>#emitJSCodeOn:level:generator:) 
  			ifTrue: [self typeOfVariable: parent receiver variable name] ifFalse: [
  		parent method == (TSendNode>>#emitJSCodeAsFunctionCallOn:level:generator:)
  			ifTrue: [self typeOfArgument: (parent receiver args indexOf: msgNode) in: parent receiver selector] ifFalse: [
  		msgNode asString = 'interpreterProxy firstIndexableField: mapOop'
  			ifTrue: ['unsigned int*'] ifFalse: [
+ 		msgNode asString = 'interpreterProxy firstIndexableField: blockOop'
+ 			ifTrue: ['int*'] ifFalse: [
+ 		self halt]]]].
- 		self halt]]].
  	cType ifNotNil: [
  		cType := cType copyReplaceAll: ' *' with: '* '.
  		accessor := (cType beginsWith: 'unsigned char*') ifTrue: ['.bytes']
  			ifFalse: [(cType beginsWith: 'unsigned int*') ifTrue: ['.words']
  			ifFalse: [(cType beginsWith: 'int*') ifTrue: ['.wordsAsInt32Array()']
  			ifFalse: [(cType beginsWith: 'char*') ifTrue: ['.bytes']
  			ifFalse: [(cType beginsWith: 'float*') ifTrue: ['.wordsAsFloat32Array()']
  			ifFalse: [self halt: 'need to handle ', cType]]]]].
  		accessor ifNotNil: [msgNode args first emitJSCodeOn: aStream level: level generator: self.
  			^aStream nextPutAll: accessor]].
  	"generic code below, not needed ever hopefully"
  	aStream nextPutAll: 'interpreterProxy.'.
  	^ msgNode emitJSCodeAsFunctionCallOn: aStream level: level generator: self!

Item was added:
+ ----- Method: JSCodeGenerator>>generateIsWords:on:indent: (in category 'JS hacks') -----
+ generateIsWords: msgNode on: aStream indent: level
+ 	msgNode args first emitJSCodeOn: aStream level: level generator: self.
+ 	aStream nextPutAll: '.isWords()'.
+ !

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' '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]]]]]]])
- 		self error: 'C: ' , cCode]]]]]])
  !

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			#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:
+ 	#isWords:							#generateIsWords:on:indent:
  	#isWordsOrBytes:					#generateIsWordsOrBytes: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'
- 		'sqrt(result)'												'Math.sqrt(result)'
- 		'sqrt(len)'													'Math.sqrt(len)'
- 		'atan2(dy,dx)'												'Math.atan2(dy, dx)'
  		'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)].
  !

Item was changed:
  ----- Method: JSPluginCodeGenerator>>ignoredMethods (in category 'public') -----
  ignoredMethods
+ 	pluginName = 'BitBltPlugin' ifTrue: [
- 	pluginName = 'BitBltSimulation' ifTrue: [
  		^#(dstLongAt: dstLongAt:put: srcLongAt:)].
  	pluginName = 'ScratchPlugin' ifTrue: [
  			^(ScratchPlugin organization listAtCategoryNamed: 'serial port'), 
  				(ScratchPlugin organization listAtCategoryNamed: 'os functions')].
+ 	^super ignoredMethods!
- !



More information about the Vm-dev mailing list