[Vm-dev] VM Maker: VMMaker.oscog- nice.2366.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Tue Apr 17 15:03:39 UTC 2018
2018-04-17 16:43 GMT+02:00 Nicolas Cellier <
nicolas.cellier.aka.nice at 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?
>
> 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/1c9497d4/attachment.html>
More information about the Vm-dev
mailing list