[Vm-dev] VM Maker: VMMaker.oscog-eem.905.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Oct 18 18:50:47 UTC 2014


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.905.mcz

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

Name: VMMaker.oscog-eem.905
Author: eem
Time: 18 October 2014, 11:48:04.111 am
UUID: 1950998d-1b02-4101-b5ca-17c00dd41e86
Ancestors: VMMaker.oscog-eem.904

No longer parenthesize BaseHeaderSize (and soon
BytesPerOop and BytesPerWord) for upcoming 64-bit
changes.

Fix parenthesization bugs in validation code in some
Alien plugin primtiives.

=============== Diff against VMMaker.oscog-eem.904 ===============

Item was changed:
  ----- Method: CCodeGenerator>>emitBuiltinConstructAsArgumentFor:on:level: (in category 'utilities') -----
  emitBuiltinConstructAsArgumentFor: msgNode on: aStream level: level
  	"If the given selector is in the translation dictionary, translate it into a target code construct and return true. Otherwise, do nothing and return false."
  
  	| action |
+ 	(self shouldGenerateAsInterpreterProxySend: msgNode) ifTrue:
- 	(self messageReceiverIsInterpreterProxy: msgNode) ifTrue:
  		[^false].
  	action := asArgumentTranslationDict
  				at: msgNode selector
  				ifAbsent: [translationDict at: msgNode selector ifAbsent: [ ^false ]].
  	self perform: action with: msgNode with: aStream with: level.
  	^true!

Item was changed:
  ----- Method: CCodeGenerator>>emitBuiltinConstructFor:on:level: (in category 'utilities') -----
  emitBuiltinConstructFor: msgNode on: aStream level: level
  	"If the given selector is in the translation dictionary, translate it into a target code construct and return true. Otherwise, do nothing and return false."
  
  	| action |
+ 	(self shouldGenerateAsInterpreterProxySend: msgNode) ifTrue:
- 	(self messageReceiverIsInterpreterProxy: msgNode) ifTrue:
  		[^false].
  	action := translationDict at: msgNode selector ifAbsent: [ ^false ].
  	self perform: action with: msgNode with: aStream with: level.
  	^true!

Item was changed:
  ----- Method: CCodeGenerator>>emitCExpression:on:indent: (in category 'C code generator') -----
  emitCExpression: aParseNode on: aStream indent: level
  	"Emit C code for the expression described by the given parse node."
  
+ 	(aParseNode isLeaf
+ 	 or: [aParseNode isSend
+ 		 and: [#(bytesPerOop bytesPerWord baseHeaderSize) includes: aParseNode selector]])
- 	aParseNode isLeaf 
  		ifTrue: 
  			["omit parens"
  			 aParseNode emitCCodeAsExpressionOn: aStream level: level generator: self]
  		ifFalse: 
  			[aStream nextPut: $(.
  			 aParseNode emitCCodeAsExpressionOn: aStream level: level generator: self.
  			 aStream nextPut: $)]!

Item was added:
+ ----- Method: CCodeGenerator>>generateBytesPerOop:on:indent: (in category 'C translation') -----
+ generateBytesPerOop: msgNode on: aStream indent: level
+ 	"Generate the C code for this message onto the given stream.
+ 	 Would prefer to use OopSize than BytesPerOop (shorter)."
+ 
+ 	aStream nextPutAll: 'BytesPerOop'!

Item was changed:
  ----- Method: CCodeGenerator>>initializeCTranslationDictionary (in category 'C 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:
  	#*				#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:
  	#truncateTo:		#generateTruncateTo:on:indent:
  	#rounded			#generateRounded: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:
  
  	#ifNotNil:		#generateIfNotNil:on:indent:
  	#ifNil:			#generateIfNil:on:indent:
  	#ifNotNil:ifNil:	#generateIfNotNilIfNil:on:indent:
  	#ifNil:ifNotNil:	#generateIfNilIfNotNil: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:
  	#cppIf:ifTrue:ifFalse:		#generateInlineCppIfElse:on:indent:
  	#cppIf:ifTrue:				#generateInlineCppIfElse:on:indent:
  	#cCoerce:to:				#generateCCoercion:on:indent:
  	#cCoerceSimple:to:			#generateCCoercion:on:indent:
  	#addressOf:				#generateAddressOf:on:indent:
  	#addressOf:put:			#generateAddressOf:on:indent:
  	#asAddress:put:			#generateAsAddress: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:
  	#asLong					#generateAsLong:on:indent:
  	#asUnsignedLong			#generateAsUnsignedLong:on:indent:
  	#asVoidPointer				#generateAsVoidPointer:on:indent:
  	#asSymbol					#generateAsSymbol:on:indent:
  	#flag:						#generateFlag:on:indent:
  	#anyMask:					#generateBitAnd:on:indent:
  	#noMask:					#generateNoMask:on:indent:
  	#raisedTo:					#generateRaisedTo:on:indent:
  	#touch:						#generateTouch:on:indent:
  
+ 	#bytesPerOop 				#generateBytesPerOop: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:
  
  	#value								#generateValue:on:indent:
  	#value:								#generateValue:on:indent:
  	#value:value:						#generateValue:on:indent:
  	#value:value:value:					#generateValue:on:indent:
  
  	#deny:								#generateDeny:on:indent:
  
  	#shouldNotImplement				#generateSmalltalkMetaError:on:indent:
  	#shouldBeImplemented			#generateSmalltalkMetaError:on:indent:
  	#subclassResponsibility			#generateSmalltalkMetaError: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:
  	#ifNotNil:				#generateIfNotNilAsArgument:on:indent:	
  	#ifNil:					#generateIfNilAsArgument:on:indent:
  	#ifNotNil:ifNil:			#generateIfNotNilIfNilAsArgument:on:indent:
  	#ifNil:ifNotNil:			#generateIfNilIfNotNilAsArgument:on:indent:
  	#cCode:				#generateInlineCCodeAsArgument:on:indent:
  	#cCode:inSmalltalk:		#generateInlineCCodeAsArgument:on:indent:
  	#cppIf:ifTrue:ifFalse:	#generateInlineCppIfElseAsArgument:on:indent:
  	#cppIf:ifTrue:			#generateInlineCppIfElseAsArgument:on:indent:
  
  	#value					#generateValueAsArgument:on:indent:
  	#value:					#generateValueAsArgument:on:indent:
  	#value:value:			#generateValueAsArgument:on:indent:
  	).
  
  	asArgumentTranslationDict := Dictionary new: 8.
  	1 to: pairs size by: 2 do: [:i |
  		asArgumentTranslationDict at: (pairs at: i) put: (pairs at: i + 1)].
  !

Item was added:
+ ----- Method: CCodeGenerator>>mostBasicConstantSelectors (in category 'accessing') -----
+ mostBasicConstantSelectors
+ 	"c.f. VMBasicConstants class>>#mostBasicConstantNames"
+ 	^#(baseHeaderSize bytesPerOop bytesPerWord)!

Item was added:
+ ----- Method: CCodeGenerator>>shouldGenerateAsInterpreterProxySend: (in category 'utilities') -----
+ shouldGenerateAsInterpreterProxySend: aSendNode
+ 	^(self messageReceiverIsInterpreterProxy: aSendNode)
+ 	  and: [(self mostBasicConstantSelectors includes: aSendNode selector) not]!

Item was changed:
  ----- Method: IA32ABIPlugin>>primBoxedFree (in category 'primitives-memory management') -----
  primBoxedFree
  	"Free the memory referenced by the receiver, an Alien."
  	"proxy <Alien> primFree ^<Alien>
  		<primitive: 'primBoxedFree' error: errorCode module: 'IA32ABI'>"
  	| addr rcvr ptr sizeField |
  	<export: true>
  	<var: #ptr type: 'sqInt *'>
  	<var: #sizeField type: 'long'>
  
  	rcvr := interpreterProxy stackObjectValue: 0.
+ 	(interpreterProxy byteSizeOf: rcvr) >= (2 * interpreterProxy bytesPerOop) ifFalse:
- 	(interpreterProxy byteSizeOf: rcvr) >= 2 * BytesPerOop ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
  	ptr := interpreterProxy firstIndexableField: rcvr.
  	sizeField := ptr at: 0.
  	addr := ptr at: 1.
  	"Don't you dare to free Squeak's memory!!"
  	(sizeField >= 0 or: [addr = 0 or: [interpreterProxy isInMemory: addr]]) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrInappropriate].
  	self cCode: 'free((void *)addr)'
  		inSmalltalk: [self Cfree: addr].
  	ptr
  		at: 0 put: 0;
  		at: 1 put: 0 "cleanup"!

Item was changed:
  ----- Method: IA32ABIPlugin>>primInLibraryFindSymbol (in category 'primitives-library loading') -----
  primInLibraryFindSymbol
  	"Attempt to find the address of a symbol in a loaded library.
  	 The primitive can have a signature  either of the form:
  		<Anywhere> primInLibrary: libraryHandle <Alien> findSymbol: symbolName <String> ^<Integer>
  			<primitive: 'primInLibraryFindSymbol' error: errorCode module: 'IA32ABI'>
  	 or:
  		libraryHandle <Alien>  primFindSymbol: symbolName <String> ^<Integer>
  			<primitive: 'primInLibraryFindSymbol' error: errorCode module: 'IA32ABI'>"
  	<export: true>
  	| functionName libraryProxy address |
  	<var: #address type: #'void *'>
  	functionName := interpreterProxy stackValue: 0.
  	libraryProxy := interpreterProxy stackValue: 1.
  	((self isAlien: libraryProxy)
+ 	 and: [(interpreterProxy byteSizeOf: libraryProxy) >= (2 * interpreterProxy bytesPerOop)
- 	 and: [(interpreterProxy byteSizeOf: libraryProxy) >= 2 * BytesPerOop
  	 and: [interpreterProxy isBytes: functionName]]) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	address := interpreterProxy
  					ioLoadSymbol: (self cCoerce: (interpreterProxy firstIndexableField: functionName)
  										to: #sqInt)
  					OfLength: (interpreterProxy byteSizeOf: functionName)
+ 					FromModule: (self longAt: libraryProxy + interpreterProxy baseHeaderSize + interpreterProxy bytesPerOop).
- 					FromModule: (self longAt: libraryProxy + BaseHeaderSize + BytesPerOop).
  	(interpreterProxy failed
  	 or: [address = 0]) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrNotFound].
  	interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: address asUnsignedInteger)!

Item was changed:
  ----- Method: NewsqueakIA32ABIPlugin>>primBoxedFree (in category 'primitives-memory management') -----
  primBoxedFree
  	"Free the memory referenced by the receiver, an Alien."
  	"proxy <Alien> primFree ^<Alien>
  		<primitive: 'primBoxedFree' error: errorCode module: 'IA32ABI'>"
  	| addr rcvr ptr sizeField |
  	<export: true>
  	<var: #ptr type: 'sqInt *'>
  	<var: #sizeField type: 'long'>
  
  	rcvr := interpreterProxy stackObjectValue: 0.
+ 	(interpreterProxy byteSizeOf: rcvr) >= (2 * interpreterProxy bytesPerOop) ifFalse:
- 	(interpreterProxy byteSizeOf: rcvr) >= 2 * BytesPerOop ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
  	ptr := interpreterProxy firstIndexableField: rcvr.
  	sizeField := ptr at: 0.
  	addr := ptr at: 1.
  	"Don't you dare to free Squeak's memory!!"
  	(sizeField >= 0 or: [addr = 0 or: [interpreterProxy isInMemory: addr]]) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrInappropriate].
  	self cCode: 'free((void *)addr)'
  		inSmalltalk: [self Cfree: addr].
  	ptr
  		at: 0 put: 0;
  		at: 1 put: 0 "cleanup"!

Item was changed:
  ----- Method: NewsqueakIA32ABIPlugin>>primInLibraryFindSymbol (in category 'primitives-library loading') -----
  primInLibraryFindSymbol
  	"Attempt to find the address of a symbol in a loaded library.
  	 The primitive can have a signature  either of the form:
  		<Anywhere> primInLibrary: libraryHandle <Alien> findSymbol: symbolName <String> ^<Integer>
  			<primitive: 'primInLibraryFindSymbol' error: errorCode module: 'IA32ABI'>
  	 or:
  		libraryHandle <Alien>  primFindSymbol: symbolName <String> ^<Integer>
  			<primitive: 'primInLibraryFindSymbol' error: errorCode module: 'IA32ABI'>"
  	<export: true>
  	| functionName libraryProxy address |
  	<var: #address type: #'void *'>
  	functionName := interpreterProxy stackValue: 0.
  	libraryProxy := interpreterProxy stackValue: 1.
  	((self isAlien: libraryProxy)
+ 	 and: [(interpreterProxy byteSizeOf: libraryProxy) >= (2 * interpreterProxy bytesPerOop)
- 	 and: [(interpreterProxy byteSizeOf: libraryProxy) >= 2 * BytesPerOop
  	 and: [interpreterProxy isBytes: functionName]]) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	address := interpreterProxy
  					ioLoadSymbol: (self cCoerce: (interpreterProxy firstIndexableField: functionName)
  										to: #sqInt)
  					OfLength: (interpreterProxy byteSizeOf: functionName)
+ 					FromModule: (self longAt: libraryProxy + interpreterProxy baseHeaderSize + interpreterProxy bytesPerOop).
- 					FromModule: (self longAt: libraryProxy + BaseHeaderSize + BytesPerOop).
  	(interpreterProxy failed
  	 or: [address = 0]) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrNotFound].
  	interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: address asUnsignedInteger)!

Item was changed:
  ----- Method: TSendNode>>emitCCodeAsFunctionCallOn:level:generator: (in category 'C code generation') -----
  emitCCodeAsFunctionCallOn: aStream level: level generator: aCodeGen
  
  	"Translate this message send into a C function call"
  	"Special case for pluggable modules. Replace messages to interpreterProxy
  	 by interpreterProxy->message(..) if the message is not builtin"
+ 	(aCodeGen shouldGenerateAsInterpreterProxySend: self) ifTrue:
- 	(aCodeGen messageReceiverIsInterpreterProxy: self) ifTrue:
  		[(aCodeGen noteUsedPluginFunction: selector) ifTrue:
  			[aStream nextPutAll: 'interpreterProxy->']].
  
  	"Translate this message send into a C function call."
  	aStream nextPutAll: (aCodeGen cFunctionNameFor: selector); nextPut: $(.
  	"Only include the receiver as the first argument in certain cases.
  	 The receiver is always included if it is an expression.
  	 If it is a variable:
  		 If the vmClass says it is an implicit variable, don't include it.
  		 If the variable is 'self' and the method being called is not in
  		 the method set (i.e. it is some external code), don't include it."
  	(self shouldExcludeReceiverAsFirstArgument: aCodeGen) ifFalse:
  		[(receiver structTargetKindIn: aCodeGen) == #struct ifTrue:
  			[aStream nextPut: $&].
  		 receiver emitCCodeOn: aStream level: level generator: aCodeGen.
  		 arguments isEmpty ifFalse:
  			[aStream nextPutAll: ', ']].
  	arguments
  		do: [ :arg| arg emitCCodeAsArgumentOn: aStream level: level generator: aCodeGen]
  		separatedBy: [aStream nextPut: $,; space].
  	aStream nextPut: $)!

Item was changed:
  ----- Method: VMBasicConstants class>>mostBasicConstantNames (in category 'accessing') -----
  mostBasicConstantNames
+ 	"c.f. CCodeGenerator class>>#mostBasicConstantSelectors"
  	^#(BaseHeaderSize BytesPerWord BytesPerOop)!



More information about the Vm-dev mailing list