[Newcompiler] Finding enough bytecodes for closures.
bryce at kampjes.demon.co.uk
bryce at kampjes.demon.co.uk
Tue May 1 19:43:17 UTC 2007
Right,
Thanks why I'm reasonably confident that environment creation is
not a problem. We'll lose a little by creating an extra object
but potentually save a lot by being able to recycle more contexts.
Bryce
Marcus Denker writes:
>
> On 01.05.2007, at 19:52, Klaus D. Witzel wrote:
>
> >>
> >> But there are many cases of BlockClosures that reference no external
> >> variables... e.g. along the example given by bryce:
> >>
> >> someDict at: #test ifAbsentPut: ['hello']
> >>
> >> here the block has no variables at all, thus is does not need to have
> >> an Environment.
> >
> > Sure (now repeated, how many times? :) There are cases where no
> > Env's are needed. But you cannot design+build the new compiler for
> > just the cases where no Env is needed?
> >
> No, of course not. But there might be designs without explicit
> environments as objects... at least one thing that could be done is
> to only put *shared* variables in an environment and
> have the others in the methodcontexts.
>
> >>>
> >>> Sure "only if needed" but otherwise nobody would need a new
> >>> compiler which handles full BlockClosures.
> >>>
> >>
> >> But they are not needed in *all* cases. ['I am a block'] does not
> >> need an environment for storing variables.
> >
> > *absolutely* *no* *problem* *and* *never* *seen* *as* *a* *problem*
> > *here* (apologies for the emphasis) but that cannot be taken as the
> > general case
>
> No. But it should pay to optimize this, because blocks with no
> external references are quite common.
>
> > (and just the latter is my point, nothing more). Instead, efficient
> > code needs to be generated for precisely the opposite case(s). Is
> > it possible we agree on this one?
>
> We need fast code for the general case, yes.
>
> >>>> Removing
> >>>> the closures is just creating extra kinds of block similar to the
> >>>> different kinds of context that Eliot added in VisualWorks
> >>>> 5i. Creating extra context types is probably not needed to equal
> >>>> or better
> >>>> the current code in most cases.
> >>>
> >>> Yes (extra context types probably not needed to equal or better),
> >>> me too thinks that's not really needed.
> >>
> >> It would be nice to make it simple and uniform.... the current
> >> BlockContext scheme preceeds the contex-recycling
> >> scheme...
> >
> > There's one particular reason why #pushActiveContextBytecode has to
> > cancel (as noted by Bryce in the other thread) the recycling
> > possibility of contexts: any piece of code could have stored the
> > context (MethodContext and BlockContext alike) behind the VM's
> > back, say for example into a slot of a longer living object (like
> > in an iVar). From then on recycling is impossible.
> >
> yes. As soon as you access thisContext.
>
> > Can we agree that this situation (cause+effect) cannot change,
> > regardless of using MethodContext, BlockContext, BlockClosures or
> > any replacement for the latter?
> >
>
> But what we can change is that we push thisContext to access the
> environment... it did something like:
>
> pushThisContext
> pushConstant: 5
> send: privGetInstVar:
>
> So the thisContext is never referenced (and stored in a ivar, moved
> around..) but only put on the stack to
> get the 5th instVar of it. If we do that in the bytecode like this:
>
> !Interpreter methodsFor: 'stack bytecodes' stamp: 'ms 4/24/2007 15:08'!
> pushClosureEnvironment
>
> self fetchNextBytecode.
> self internalPush: (self fetchPointer: 4 ofObject: activeContext).
> ! !
>
> !Interpreter methodsFor: 'stack bytecodes' stamp: 'ms 4/28/2007 11:12'!
> storeClosureEnvironment
> "Byte code for the closure environment"
> self fetchNextBytecode.
>
> self storePointer: 4 ofObject: activeContext withValue: self
> internalStackTop! !
>
>
> We never need to push the thisContext at all...
>
> Marcus
>
>
More information about the Newcompiler
mailing list