[Vm-dev] VM Maker: VMMaker.oscog- nice.2366.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Tue Apr 17 15:05:44 UTC 2018
2018-04-17 17:03 GMT+02:00 Nicolas Cellier <
nicolas.cellier.aka.nice at gmail.com>:
>
>
> 2018-04-17 16:43 GMT+02:00 Nicolas Cellier <nicolas.cellier.aka.nice@
> gmail.com>:
>
>> Hi Eliot,
>> First, sorry for multiple posting...
>> I've been fooled by repeated ConnectionTimedOut windows.
>>
>> Then, you must be right I've been away from VMMaker for too long...
>> Maybe we could use (self sizeof: sqintptr_t) or something like that?
>>
>
> Hmm, but I see several references to BytesPerWord from within
> ThreadedFFI...
> Are you sure that it won't work?
>
>
Ah, I think that I understand the confusion:
#num32BitUnitsOf: changes are completely unrelated.
I do not use them in FFI, but just corrected a copy/paste error in the
comment ;)
>> 2018-04-17 16:11 GMT+02:00 Eliot Miranda <eliot.miranda at gmail.com>:
>>
>>>
>>> Hi Nicolas,
>>>
>>> let's at least try and refactor so the validity checks are performed
>>> in methods with intention revealing selectors so we can more easily
>>> understand the code. Alas I think your approach below won't work because
>>> it adds to the sqVirtualMachine Interpreter proxy interface. Instead you
>>> could try implementing num32BitUnitsOf: in ThreadedFFIPlugin and use
>>> byteSizeOf:.
>>>
>>> _,,,^..^,,,_ (phone)
>>>
>>> > On Apr 17, 2018, at 5:38 AM, commits at source.squeak.org wrote:
>>> >
>>> >
>>> > Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
>>> > http://source.squeak.org/VMMaker/VMMaker.oscog- nice.2366.mcz
>>> >
>>> > ==================== Summary ====================
>>> >
>>> > Name: VMMaker.oscog- nice.2366
>>> > Author: nice
>>> > Time: 17 April 2018, 3:37:48.684079 pm
>>> > UUID: 6d9bd2fa-c381-5d4b-b31e-c6d21225c848
>>> > Ancestors: VMMaker.oscog-VB.2365
>>> >
>>> > Correct a 32bit-hardcoded pointer size in FFI
>>> > Correct two copy/paste typos in num32BitUnitsOf:
>>> >
>>> > Note: I don't like the FFI code that I just corrected. IMO, it does
>>> the wrong thing.
>>> >
>>> > if I have an argument spec is
>>> > MyLib>>foo: aFoo
>>> > <cdecl: void foo(Foo *)>
>>> > where Foo is some ExternalStructure subclass (Foo class>>fields ^#((x
>>> 'ushort') (y 'ushort')))
>>> >
>>> > and that I try to pass (MyLib new foo: Foo new), it seems to me that
>>> the Foo new getHandle will be (ByteArray new: 4).
>>> > What I understand form the code that I just corrected is that we are
>>> trying to pass the contents of the ByteArray re-interpreted as a void
>>> pointer. Scary and wrong...
>>> >
>>> > If I instead pass (MyLib new foo: Foo externalNew), it seems that we
>>> don't even bother to check if the (argSpec anyMask: FFIFlagPointer) and
>>> just force passing the structure by value (thru a memcpy on stack). Scary
>>> and wrong...
>>> >
>>> > In general, every one use <cdecl: void foo(void *)> to work around
>>> this ill-behavior, and thus bypass type checks...
>>> >
>>> > Also note that we can't even pass an ExternalData (think an Array of
>>> Foo), because ffiArgument:Spec:Class:in: insists on having actualArg class
>>> inheritsFrom: argType referentClass. ExternalData does not inherit from
>>> Foo, event if its type matches (ExternalType structTypeNamed: #Foo). That's
>>> crazy...
>>> > Another reason while people use <cdecl: void foo(void *)>
>>> >
>>> > It's high time to consider a rewrite IMO.
>>> >
>>> > =============== Diff against VMMaker.oscog-VB.2365 ===============
>>> >
>>> > Item was changed:
>>> > ----- Method: ObjectMemory>>num32BitUnitsOf: (in category 'object
>>> access') -----
>>> > num32BitUnitsOf: objOop
>>> > + "Answer the number of 32-bit units in the given non-immediate
>>> object.
>>> > - "Answer the number of 16-bit units in the given non-immediate
>>> object.
>>> > N..B. Rounds down 8-bit units, so a 7 byte object has 1 32-bit
>>> unit.
>>> > Does not adjust the size of contexts by stackPointer."
>>> > ^(self numBytesOf: objOop) >> 2!
>>> >
>>> > Item was changed:
>>> > ----- Method: SpurMemoryManager>>num32BitUnitsOf: (in category
>>> 'object access') -----
>>> > num32BitUnitsOf: objOop
>>> > + "Answer the number of 32-bit units in the given non-immediate
>>> object.
>>> > - "Answer the number of 16-bit units in the given non-immediate
>>> object.
>>> > N..B. Rounds down 8-bit units, so a 7 byte object has 1 32-bit
>>> unit.
>>> > Does not adjust the size of contexts by stackPointer."
>>> > ^(self numBytesOf: objOop) >> 2!
>>> >
>>> > Item was changed:
>>> > ----- Method: ThreadedFFIPlugin>>ffiPushStructureContentsOf:in: (in
>>> category 'callout support') -----
>>> > ffiPushStructureContentsOf: oop in: calloutState
>>> > <var: #calloutState type: #'CalloutState *'>
>>> > "Push the contents of the given external structure"
>>> > | ptrClass ptrAddress |
>>> > <inline: true>
>>> > ptrClass := interpreterProxy fetchClassOf: oop.
>>> > ptrClass = interpreterProxy classExternalAddress ifTrue:
>>> "ExternalAddress is bytes"
>>> > [ptrAddress := (interpreterProxy fetchPointer: 0 ofObject:
>>> oop) asVoidPointer.
>>> > "There is no way we can make sure the structure is valid.
>>> > But we can at least check for attempts to pass pointers to ST
>>> memory."
>>> > (interpreterProxy isInMemory: ptrAddress) ifTrue:
>>> > [^FFIErrorInvalidPointer].
>>> > ^self ffiPushStructure: ptrAddress
>>> > ofSize: (calloutState ffiArgHeader bitAnd:
>>> FFIStructSizeMask)
>>> > typeSpec: calloutState ffiArgSpec
>>> > ofLength: calloutState ffiArgSpecSize
>>> > in: calloutState].
>>> > ptrClass = interpreterProxy classByteArray ifTrue:
>>> > ["The following is a somewhat pessimistic test but I like
>>> being sure..."
>>> > (interpreterProxy byteSizeOf: oop) = (calloutState
>>> ffiArgHeader bitAnd: FFIStructSizeMask)
>>> > ifFalse:[^FFIErrorStructSize].
>>> > ptrAddress := interpreterProxy firstIndexableField: oop.
>>> > (calloutState ffiArgHeader anyMask: FFIFlagPointer) ifFalse:
>>> > "Since this involves passing the address of the first
>>> indexable field we need to fail
>>> > the call if it is threaded and the object is young,
>>> since it may move during the call."
>>> > [self cppIf: COGMTVM ifTrue:
>>> > [((calloutState callFlags anyMask: FFICallFlagThreaded)
>>> > and: [interpreterProxy isYoung: oop]) ifTrue:
>>> > [^PrimErrObjectMayMove negated]].
>>> > ^self ffiPushStructure: ptrAddress
>>> > ofSize: (calloutState ffiArgHeader bitAnd:
>>> FFIStructSizeMask)
>>> > typeSpec: calloutState ffiArgSpec
>>> > ofLength: calloutState ffiArgSpecSize
>>> > in: calloutState].
>>> > "If FFIFlagPointer + FFIFlagStructure is set use
>>> ffiPushPointer on the contents"
>>> > + (calloutState ffiArgHeader bitAnd: FFIStructSizeMask) =
>>> BytesPerWord ifFalse:
>>> > - (calloutState ffiArgHeader bitAnd: FFIStructSizeMask) = 4
>>> ifFalse:
>>> > [^FFIErrorStructSize].
>>> > ptrAddress := (interpreterProxy fetchPointer: 0 ofObject:
>>> oop) asVoidPointer.
>>> > (interpreterProxy isInMemory: ptrAddress) ifTrue:
>>> > [^FFIErrorInvalidPointer].
>>> > ^self ffiPushPointer: ptrAddress in: calloutState].
>>> > ^FFIErrorBadArg!
>>> >
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20180417/efdd29d2/attachment-0001.html>
More information about the Vm-dev
mailing list