[Vm-dev] StackInterp/Cog>>transferTo: - assertValidExecutionPointe:r:s differences
Eliot Miranda
eliot.miranda at gmail.com
Sun May 6 14:19:31 UTC 2018
Hi Ben,
> On May 6, 2018, at 1:58 AM, Ben Coman <btc at openinworld.com> wrote:
>
>
>
>> On 6 May 2018 at 16:56, Ben Coman <btc at openinworld.com> wrote:
>>
>>
>>> On 10 June 2016 at 20:17, Eliot Miranda <eliot.miranda at gmail.com> wrote:
>>>
>>> Hi Ben,
>>>
>>> this time I'll try and answer your question rather than my brain fart...
>>>
>>> > On Jun 9, 2016, at 6:46 PM, Ben Coman <btc at openinworld.com> wrote:
>>> >
>>> >
>>> > Just curious about the difference in instructionPointer between these two...
>>> >
>>> > StackInterpreter>>transferTo:
>>> > self assertValidExecutionPointe: instructionPointer + 1 r:
>>> > framePointer s: stackPointer.
>>> >
>>> >
>>> > CoIntepreter>>transferTo:from:
>>> > self assertValidExecutionPointe: instructionPointer r:
>>> > framePointer s: stackPointer.
>>>
>>> In the StackInterpreter, as in the context Interpreter the next bytecode is fetched by pre-incrementing the instructionPointer and then fetching the byte it points to. Hence it may point to before the first bytecode and hence the + 1 above. 1 is subtracted from a context's pc (2 actually cuz pc is 1-relative and instructionPointer is 0-relative) to derive instructionPointer.
>>>
>>> In the Cog VM instructionPointer may also be a machine code pc. So rather than add one, which only makes sense for interpreted methods, the CoInterpreter's assertValidExecutionPointer:s: allows for the - 1 if a frame us interpreted. The StackInterpreter's method predates the CoInterpreter.
>>
>>
>> I was just wandering in the vicinity of this again, and had a new query...
>>
>> What is the semantic difference in the naming of the arguments (i.e. lsp<=> lisp and lfp<=>lifp)
>> between.... ?
>> StackInterpreter >> assertValidExecutionPointe: lip r: lfp s: lsp imbar: inInterpreter line: ln
>> CoInterpreter >> assertValidExecutionPointe: lip r: lifp s: lisp imbar: inInterpreter line: ln
>>
>> because search/replacing makes it easier to diff the two methods...
>> https://www.diffchecker.com/CL32EXql
>>
>> This shows the StackInterpreter method refactored slightly to extract "methodField" variable similar to the CoInterpreter
>> making it easier to compare the two, i.e. red-line-16 and green-line-18 are identical,
>> but red-line-13 and green-line-14 set "methodField" using different messages, which however have identical definitions.
>>
>> StackInterpreter >> frameMethod: theFP
>> <inline: true>
>> <var: #theFP type: #'char *'>
>> ^stackPages longAt: theFP + FoxMethod
>>
>> CoInterpreter >> frameMethodField: theFP
>> <inline: true>
>> <var: #theFP type: #'char *'>
>> ^stackPages longAt: theFP + FoxMethod
>>
>> Would it be reasonable to change red-line-13 to send #frameMethodField:
>> instead? Hopefully my slight rearrangement of the asserts in red okay.
>
>
> ========================
> I found it a bit convoluted following where CoInterpreter overrides StackInterpreter >> frameIsBlockActivation:
>
> StackInterpreter >> frameIsBlockActivation: theFP "<Integer>"
> <inline: true>
> <var: #theFP type: #'char *'>
> ^(stackPages byteAt: theFP + FoxFrameFlags + 3) ~= 0
>
> CoInterpreter >> frameIsBlockActivation: theFP "<Integer>"
> <inline: true>
> <var: #theFP type: #'char *'>
> ^(self isMachineCodeFrame: theFP)
> ifTrue: [self mframeIsBlockActivation: theFP]
> ifFalse: [self iframeIsBlockActivation: theFP]
>
>
> But I notice StackInterpreter >> frameIsBlockActivation:
> is identical to...
> CoInterpreter >> iframeIsBlockActivation: theFP "<Integer>"
> <inline: true>
> <var: #theFP type: #'char *'>
> ^(stackPages byteAt: theFP + FoxIFrameFlags + 3) ~= 0
>
> while...
> StackInterpreter >> iframeIsBlockActivation: theFP "<Integer>"
> ^self frameIsBlockActivation: theFP
>
> So reversing StackInterpreter's definitions of these two methods thus...
> StackInterpreter >> iframeIsBlockActivation: theFP "<Integer>"
> <inline: true>
> <var: #theFP type: #'char *'>
> ^(stackPages byteAt: theFP + FoxFrameFlags + 3) ~= 0
>
> StackInterpreter >> frameIsBlockActivation: theFP "<Integer>"
> ^self iframeIsBlockActivation: theFP
>
> makes the existing CoInterpreter override clearer...
> CoInterpreter >> frameIsBlockActivation: theFP "<Integer>"
> <inline: true>
> <var: #theFP type: #'char *'>
> ^(self isMachineCodeFrame: theFP)
> ifTrue: [self mframeIsBlockActivation: theFP]
> ifFalse: [self iframeIsBlockActivation: theFP]
>
> and also CoInterpreter >> iframeIsBlockActivation becomes redundant.
>
> Can I submit a changeset for these?
Thank you, that would be most welcome. And feel free to include a version of the assert routine that renames lisp & lifp (simple puns) to lsp & lfp or vice verse, as you see fit.
>
> cheers -ben
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20180506/9258c697/attachment.html>
More information about the Vm-dev
mailing list