[Vm-dev] VM Maker: VMMaker.oscog-EstebanLorenzano.1725.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Mar 14 14:45:01 UTC 2016
Esteban Lorenzano uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-EstebanLorenzano.1725.mcz
==================== Summary ====================
Name: VMMaker.oscog-EstebanLorenzano.1725
Author: EstebanLorenzano
Time: 14 March 2016, 3:43:34.128098 pm
UUID: 565d98b6-020e-48f3-b2fe-171e8b09ee52
Ancestors: VMMaker.oscog-nice.1724
make FFI load symbol fail after (when find function fails).
In Pharo, we allow to load global functions (so we can control world windows through FFI).
This change should not affect other distributions (it wil just fail a bit after).
=============== Diff against VMMaker.oscog-nice.1724 ===============
Item was changed:
----- Method: ThreadedFFIPlugin>>primitiveLoadSymbolFromModule (in category 'primitives') -----
primitiveLoadSymbolFromModule
"Attempt to find the address of a symbol in a loaded library.
loadSymbol: aSymbol fromModule: moduleName
<primitive: 'primitiveLoadSymbolFromModule' error: errorCode module: 'SqueakFFIPrims'>
"
<export: true>
| symbol module moduleHandle address oop ptr |
<var: #address type: #'void *'>
<var: #ptr type: #'void **'>
interpreterProxy methodArgumentCount = 2 ifFalse:
[^interpreterProxy primitiveFailFor: PrimErrBadNumArgs].
module := interpreterProxy stackValue: 0.
symbol := interpreterProxy stackValue: 1.
+ module ~= interpreterProxy nilObject
+ ifTrue: [ moduleHandle := self ffiLoadCalloutModule: module ]
+ ifFalse: [ moduleHandle := nil ].
- moduleHandle := self ffiLoadCalloutModule: module.
interpreterProxy failed ifTrue:
[^interpreterProxy primitiveFailFor: PrimErrNotFound].
address := interpreterProxy
ioLoadSymbol: (self cCoerce: (interpreterProxy firstIndexableField: symbol) to: #sqInt)
OfLength: (interpreterProxy byteSizeOf: symbol)
FromModule: moduleHandle.
(interpreterProxy failed
or: [address = 0]) ifTrue:
[^interpreterProxy primitiveFailFor: PrimErrNotFound].
oop := interpreterProxy
instantiateClass: interpreterProxy classExternalAddress
indexableSize: (self sizeof: #'void *').
ptr := interpreterProxy firstIndexableField: oop.
ptr at: 0 put: address.
^interpreterProxy methodReturnValue: oop!
More information about the Vm-dev
mailing list