Hi Nicolai,

On Wed, Oct 7, 2015 at 2:13 PM, Nicolai Hess <nicolaihess@web.de> wrote:


2015-10-07 16:49 GMT+02:00 Marcus Denker <marcus.denker@inria.fr>:

> On 07 Oct 2015, at 15:49, Marco Naddeo <naddeo@di.unito.it> wrote:
>
> Hi,
>
> I have some problems with the large block at bottom:
>
> -sending the message argumentNames gives me an empty array #()
> -sending the message sourceNode gives me a strange result and not a RBBlockNode, as I would expect
>

This happens already with:

[�� :h :s :v |�� �� | min chroma hdash X red green blue | ] sourceNode

I will check��� it is a bug in the mapping pc -> AST.

That's interesting, the way the pc is mapped to the AST (ir instructionForPC: )
takes the "length" of the instruction bytecode into account and the length of a pushclosure includes
all bytes needed for the pushing the local temps (pushConstant nil. pushConstant nil ....)

But the startPC of a block context starts at the first push, not after, that means

self method sourceNodeForPC: self startpc - 1
starts the search after the push closure bytecode but before any push local temp byte code.

Either we don't include the bytecodes for the "pushConstant:nil" in the bytecode offset, or we start the search at

self method sourceNodeForPC: self startpc - 1 + self numLocalTemps

No, no, no, no, no :-).�� The PC in question is the pc of the block creation byte code.�� The startpc of a block is the first bytecode following the block creation byte code.�� That *includes* any pushConstant: nil byte codes establishing temps in the block.�� Instead, it is expected that "self method sourceNodeForPC: self startpc - 1" answers the same as "self method sourceNodeForPC: self blockCreationPC", where self blockCreationPC is the pc of the block's block creation��bytecode.

In Squeak we have
BlockClosure>>blockCreationPC
"Answer the pc for the bytecode that created the receuver."
| method |
method := self method.
^method encoderClass
pcOfBlockCreationBytecodeForBlockStartingAt: startpc
in: method
��
This is because we support (as you will soon enough) different byte code sets so it is wrong to assume the size of the block creation bytecode is 4.�� But for now you could use

self method sourceNodeForPC: self startpc - 4

and make sure that the compiler maps a block creation bytecode to the source node for the entire block.

The way to think about "self method sourceNodeForPC: self startpc - 1 + self numLocalTemps" not masking sense is that a pc inside the block must map to a statement inside the block, not the block itself.

HTH


��

�� �� �� �� Marcus









--
_,,,^..^,,,_
best,��Eliot