On 14 févr. 2014, at 00:45, Nicolai Hess <nicolaih...@web.de> wrote:

> Thank you camille,
> I still don't fully understand, why it is so hard to make it work for all use 
> cases.
> It looks like a simple thing, make a sourceNode for the current context!
> 
> So for me it looks like the main problem is to distinguish these cases: 
> Create a SourceNode for 
> a) Method or
> b) Block or
> c) MethodContext or
> d) BlockContext
> and at the moment we are mixing case c/d/b

It's easy for method and block.
For MethodContext, it's harder.
I would love if I could write:
MethodContext>>sourceNode
        ^ self isBlockContext ifTrue: [ closureOrNil sourceNode ] ifFalse: [ 
method sourceNode ].
but it doesn't work because inlined blocks don't create a new context:
1 to: 1 do: [ :i | ^ thisContext isBlockContext ] returns false.
So instead we have to rely on pc->IR nodes and IR nodes->AST nodes mappings.
But everything is not mapped as you would expect yet in these two mappings. I 
found that: 
- the (pushLiteral: nil) bytecodes used to mark the number of block temporaries 
have corresponding IR nodes but these node are mapped with the AST block node 
instead of the AST sequence node.
- the (pushTemp: n) bytecodes used to push the copied values of blocks don't 
have corresponding IR nodes so no AST node is associated with them.
- the block return bytecodes are mapped to the block node instead of the 
sequence. 

Fixing these mapping is not easy, and it's too big a change for Pharo 3.
So we have to deal with the current mapping for now.

> 
> Thank you ben, for finding/looking at the failing tests. 
> 
> (I wished we would have an improved debugger, showing
> sourcecode, AST, IR and bytecode linked together :-)
> 
> 
> 
> 2014-02-13 16:27 GMT+01:00 Camille Teruel <camille.ter...@gmail.com>:
> Hi Nicolai,
> 
> I opened the issue 12875 and committed a fix.
> Can you look at it?
> 
> 
> On 11 févr. 2014, at 11:54, Nicolai Hess <nicolaih...@web.de> wrote:
> 
> > Ben, Camille, can you take a look at this code
> > |a b|
> > a:='String'.
> > b:='t'.
> > a collectWithIndex:[:c :i | c < b]
> >
> > Debug this code and step over until you reach the
> > collectWithIndex: method, the context inspector will show
> > a,b,c,i even though only a and b are in the current scope.
> > And it'll show the wrong values
> > a->'String'
> > b->'String'
> > c->'String'
> > i->'t'
> >
> > (This does not happen with old compiler and it does not
> > happen in 307052)
> 
> 

Reply via email to