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

Esteban Lorenzano estebanlm at gmail.com
Thu Feb 25 15:32:17 UTC 2016


Hi, 

yes, this seems to be working. This produces this code: 


static char _m[] = "SqueakFFIPrims";
void* IA32FFIPlugin_exports[][3] = {
	{(void*)_m, "ffiLogCallsTo", (void*)ffiLogCallsTo},
	...
	{NULL, NULL, NULL}
};


Now, I wonder… why not just to change (in #emitExportsNamed:pluginName:on:): 

	aStream cr; nextPutAll: 'void* '; nextPutAll: exportsNamePrefix; nextPutAll: '_exports[][3] = {'; cr.

with this: 

	aStream cr; nextPutAll: 'void* '; nextPutAll: pluginName; nextPutAll: '_exports[][3] = {'; cr.

and avoid the need of the #define?
(also, I think is less confusing than trust on the define...)

cheers!
Esteban

> On 24 Feb 2016, at 17:17, commits at source.squeak.org wrote:
> 
> 
> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
> http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1699.mcz
> 
> ==================== Summary ====================
> 
> Name: VMMaker.oscog-eem.1699
> Author: eem
> Time: 24 February 2016, 9:16:10.818176 am
> UUID: 186ebd51-28ef-4e7f-8411-96b61577b777
> Ancestors: VMMaker.oscog-eem.1698
> 
> Allow a plugin to override moduleName in generating its export table, via moduleExportsName.
> 
> To this end eliminate the pluginName variable from VMPluginCodeGenerator and use pluginClass moduleName instead.
> 
> Also use a shared variable to hold the moduleExportsName in the gnerated source.
> 
> =============== Diff against VMMaker.oscog-eem.1698 ===============
> 
> Item was changed:
>  ----- Method: CCodeGenerator>>emitExportsNamed:pluginName:on: (in category 'C code generator') -----
>  emitExportsNamed: exportsNamePrefix pluginName: pluginName on: aStream
>  	"Store all the exported primitives in the form used by the internal named prim system."
>  	| nilVMClass excludeDepth |
>  	(nilVMClass := vmClass isNil) ifTrue: "We need a vmClass temporarily to compute accessor depths."
>  		[vmClass := StackInterpreter].
>  	"Don't include the depth in the vm's named primitives if the vm is non-Spur."
>  	excludeDepth := exportsNamePrefix = 'vm'
>  					  and: [pluginName isEmpty
>  					  and: [vmClass objectMemoryClass hasSpurMemoryManagerAPI not]].
> + 	aStream cr; cr; nextPutAll: 'static char _m[] = "'; nextPutAll: pluginName; nextPutAll: '";'.
> + 	aStream cr; nextPutAll: 'void* '; nextPutAll: exportsNamePrefix; nextPutAll: '_exports[][3] = {'; cr.
> - 	aStream cr; cr; nextPutAll: 'void* '; nextPutAll: exportsNamePrefix; nextPutAll: '_exports[][3] = {'; cr.
>  	((methods select: [:m| m export]) asSortedCollection: [:a :b| a selector caseSensitiveLessOrEqual: b selector]) do:
>  		[:method| | compileTimeOptionPragmas primName |
>  		(compileTimeOptionPragmas := method compileTimeOptionPragmas) notEmpty ifTrue:
>  			[method outputConditionalDefineFor: compileTimeOptionPragmas on: aStream].
>  		 primName := self cFunctionNameFor: method selector.
> + 		 aStream tab; nextPutAll: '{(void*)_m, "'; nextPutAll: primName.
> - 		 aStream tab; nextPutAll: '{"'; nextPutAll: pluginName; nextPutAll: '", "'; nextPutAll: primName.
>  		 excludeDepth ifFalse:
>  			[(self accessorDepthForSelector: primName asSymbol) ifNotNil:
>  				[:depth| "store the accessor depth in a hidden byte immediately after the primName"
>  				self assert: depth < 128.
>  				aStream
>  					nextPutAll: '\000\';
>  					nextPutAll: ((depth bitAnd: 255) printStringBase: 8 nDigits: 3)]].
>  		 aStream nextPutAll: '", (void*)'; nextPutAll: primName; nextPutAll: '},'; cr.
>  		 method terminateConditionalDefineFor: compileTimeOptionPragmas on: aStream].
>  	aStream tab; nextPutAll: '{NULL, NULL, NULL}'; cr; nextPutAll: '};'; cr.
>  	nilVMClass ifTrue:
>  		[vmClass := nil]!
> 
> Item was added:
> + ----- Method: InterpreterPlugin class>>moduleExportsName (in category 'translation') -----
> + moduleExportsName
> + 	"Answer the name to include in receiver's internal plugin exports.
> + 	 This is the value of the module: argument in named primitives.
> + 	 By default answer the moduleName."
> + 
> + 	^self moduleName!
> 
> Item was changed:
>  ----- Method: SimulatorEventTransformer>>degenerateMouseEvent:for: (in category 'event transformation') -----
>  degenerateMouseEvent: aMorphicEvent for: aClient
>  	"Convert the mouse event into low-level events for the VM simulator (aClient).  Filter-out mouse moves,
>  	 and generate a fake mouse move before each button press.
>  	 See HandMorph>>generateMouseEvent"
>  	| translated |
>  	translated := aMorphicEvent position - aClient displayView bounds origin.
>  	modifiers := aMorphicEvent buttons >> 3. "Sad, but modifiers come in on mouse move events..."
> 
>  	aMorphicEvent type == #mouseMove
> + 		ifTrue: "filter-out mouse moves unless buttons are pressed, so simulation doesn't get window leave events when we leave its window"
> - 		ifTrue: "filter-out mouse moves unless buttons are pressed, so simulation doersn't get window leave events when we leave its window"
>  			[buttons = 0 ifTrue: [^nil]]
>  		ifFalse:"If the buttons are going down, make sure to add a mouse move event to the current position before the buttons are pressed."
>  			[((buttons bitAnd: 7) = 0 and: [(aMorphicEvent buttons bitAnd: 7) ~= 0]) ifTrue:
>  				[aClient queueForwardedEvent:
>  							{	1.
>  								aMorphicEvent timeStamp.
>  								translated x.
>  								translated y.
>  								0.
>  								buttons >> 3.     "Thanks dtl"
>  								0.
>  								self windowIndex }].
>  				 buttons := aMorphicEvent buttons].
>  	aClient queueForwardedEvent:
>  			{	1.
>  				aMorphicEvent timeStamp.
>  				translated x.
>  				translated y.
>  				buttons bitAnd: 7.  "thanks Ron T."
>  				buttons >> 3.     "Thanks dtl"
>  				0.
>  				self windowIndex }!
> 
> Item was added:
> + ----- Method: ThreadedFFIPlugin class>>moduleExportsName (in category 'translation') -----
> + moduleExportsName
> + 	"To make the inclusion of the platform-specific plugin to work it can't use
> + 	 its moduleName in the exports but must use the proper moduleName."
> + 
> + 	^ThreadedFFIPlugin moduleName!
> 
> Item was changed:
>  CCodeGenerator subclass: #VMPluginCodeGenerator
> + 	instanceVariableNames: 'pluginClass pluginFunctionsUsed inProgressSelectors inliningDone'
> - 	instanceVariableNames: 'pluginClass pluginName pluginFunctionsUsed inProgressSelectors inliningDone'
>  	classVariableNames: ''
>  	poolDictionaries: ''
>  	category: 'VMMaker-Translation to C'!
> 
>  !VMPluginCodeGenerator commentStamp: '<historical>' prior: 0!
>  I generate code that can be loaded dynamically from external libraries (e.g., DSOs on Unix or DLLs on Windows)!
> 
> Item was changed:
>  ----- Method: VMPluginCodeGenerator>>emitExportsOn: (in category 'C code generator') -----
>  emitExportsOn: aStream
>  	"Store all the exported primitives in the form used by the internal named prim system."
>  	aStream cr; cr; nextPutAll:'#ifdef SQUEAK_BUILTIN_PLUGIN'.
> + 	self emitExportsNamed: pluginClass moduleName
> + 		pluginName: pluginClass moduleExportsName
> + 		on: aStream.
> - 	self emitExportsNamed: pluginName pluginName: pluginName on: aStream.
>  	aStream cr; nextPutAll: '#else /* ifdef SQ_BUILTIN_PLUGIN */'; cr; cr.
>  	self emitAccessorDepthsOn: aStream.
>  	aStream cr; nextPutAll: '#endif /* ifdef SQ_BUILTIN_PLUGIN */'; cr!
> 
> Item was changed:
>  ----- Method: VMPluginCodeGenerator>>pluginClass: (in category 'public') -----
>  pluginClass: aPluginClass
>  	"Set the plugin class and name when generating plugins.
>  	 And for run-time use, answer the name string."
>  	| packageId |
>  	pluginClass := aPluginClass.
> - 	pluginName := pluginClass moduleName.
>  	packageId := self shortMonticelloDescriptionForClass: pluginClass.
>  	(packageId beginsWith: pluginClass name) ifTrue:
>  		[packageId := packageId allButFirst: pluginClass name size].
> + 	(packageId beginsWith: pluginClass moduleName) ifTrue:
> + 		[packageId := packageId allButFirst: pluginClass moduleName size].
> - 	(packageId beginsWith: pluginName) ifTrue:
> - 		[packageId := packageId allButFirst: pluginName size].
>  	^self declareModuleName: pluginClass moduleNameAndVersion, packageId!
> 
> Item was removed:
> - ----- Method: VMPluginCodeGenerator>>pluginName: (in category 'public') -----
> - pluginName: aString
> - "TPR - moved from CCodeGenerator"
> - 	"Set the plugin name when generating plugins."
> - 	pluginName := aString.!
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20160225/f2569bc8/attachment-0001.htm


More information about the Vm-dev mailing list