[Vm-dev] Re: A possible Cog bug (was: Re: [squeak-dev] Direct
implementation of shift/reset in Smalltalk)
Levente Uzonyi
leves at elte.hu
Tue Apr 26 23:55:46 UTC 2011
Hi Eliot,
On Tue, 26 Apr 2011, Eliot Miranda wrote:
> Hi Levente,
> try out the latest VMs. They don't fix the bugs, but do change the
> symptoms. e.g. in
>
> c := [ 3 + PartialContinuationNotification signal ]
> on: PartialContinuationNotification
> do: [ :not | not continuation ].
> c value: 4. "==> 7"
>
> there is now an MNU of #+ since 3 has been replaced by a MethodContext.
>
> So if I could ask you could dig in again, that would help.
the symptoms are much better now. The cause of the MNU seems to be that
the copied contexts have some "junk" at their indexable slots.
Implementing ContextPart >> #copyTo: as below solves (hides) the problem.
ContextPart >> copyTo: aContext
"Copy self and my sender chain down to, but not including, aContext. End of copied chain will have nil sender."
| copy |
self == aContext ifTrue: [ ^nil ].
copy := self copy.
"Cog doesn't copy the temps properly, so copy them here."
1 to: self size do: [ :i | copy at: i put: (self at: i) ].
sender ifNotNil: [ copy privSender: (sender copyTo: aContext) ].
^copy
To reproduce the "junk" copying bug, evaluate the following:
| context |
context := thisContext copy.
{ context. context copy } explore
The first context's first slot will be nil, while the second context's
first slot will point to the sender context. Actually the indexable slots
are filled with the values of the fixed slots, that's why the sender
context is at the first indexable slot of the second context. Here's an
example with more indexable slots:
| context a b c d e |
context := thisContext copy.
a := b := c := d := e := context.
{ context. context copy } explore.
{ a. b. c. d. e } "This is here to avoid compiler complaints."
Levente
>
> thanks!
>
> best,
> Eliot
More information about the Vm-dev
mailing list