> On 10 Oct 2014, at 10:57, Jan Kurš <[email protected]> wrote:
> 
> Hi All,
> 
> Thank you for the replies. I see it is not an easy bug to fix. Do you have 
> any idea, when this can be fixed? 
> 
I will try to fix it next week...

> Or can you suggest me some other way/workaround, how to get/generate the 
> source code of a block?
> 

The old compiler used a hack to decompile blocks for getting a textual 
representation… one could port
the code from Pharo2 to the Package OpalDecompiler in Pharo4. (but I actually 
like the current scheme of
using the byte code-offset-to-AST mapping more).

        Marcus

> Thank you very much!
> Cheers,
> Jan
> 
> BTW, the tests to execute:
> self assert: [ :ctx | [ ctx atEnd ] ifTrue: [  ] ] asString = '[ :ctx | [ ctx 
> atEnd ] ifTrue: [  ] ]'
> self assert: [ :ctx | [ ctx atEnd ] whileTrue: [ ] ] asString = '[ :ctx | [ 
> ctx atEnd ] whileTrue: [ ] ]'
> 
> 
> 
> On 8 October 2014 18:43, Marcus Denker <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>> On 08 Oct 2014, at 18:28, Camille Teruel <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> 
>> On 8 oct. 2014, at 17:49, Marcus Denker <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>>>> 
>>>> On 08 Oct 2014, at 16:46, Jan Kurš <[email protected] 
>>>> <mailto:[email protected]>> wrote:
>>>> 
>>>> Hi,
>>>> 
>>>> I need to extract a source code from a block closure and I found something 
>>>> strange:
>>>> 
>>>> [ :ctx | [ ctx atEnd ] ifTrue: [  ] ] .
>>>> [ :ctx | [ ctx atEnd ] whileTrue:[ ] ]. 
>>>> 
>>>> Print of the first line returns:
>>>> '[ :ctx | [ ctx atEnd ] ifTrue: [  ] ]'
>>>> 
>>>> Print of the second line returns:
>>>> '[ ctx atEnd ]'
>>>> 
>>>> And honestly, I have no idea why. This behaviour was observed in Pharo3 
>>>> and Pharo4.
>>>> 
>>>> Is there a way how to get a consistent result, i.e. '[ :ctx | [ ctx atEnd 
>>>> ] whileTrue:[ ] ]' for a second line?
>>> 
>>> 
>>> I think this is an example that exposes a bug that we still have in the 
>>> source mapping… on Context, see
>>> 
>>> sourceNode
>>>     "Return the source node of the method or the block corresponding to the 
>>> receiver"
>>>     ^ (method sourceNodeForPC: self neighborPCWithCorrectMapping) 
>>> enclosingMethodOrBlockNode
>>>     "Uncomment the following once the pc->AST mapping is fixed"
>>>     "^ (method sourceNodeForPC: (pc ifNil: [ self startpc ])) 
>>> enclosingMethodOrBlockNode"
>>> 
>>> #neighborPCWithCorrectMapping returns the inner send, which is wrong… this 
>>> method needs to be rethought.
>> 
>> Yes it should. But that's not easy with optimized loop messages like 
>> whileTrue: & co. 
>> Ideally, the source mapping needs to be fixed because that's the reason this 
>> method exists in the first place.
> 
> The first step is to record a range for the byte code that an IRNode creates…
> 
>> Or else we accepts that "1 to: 1 do: [ :i | ^ thisContext sourceNode ]" 
>> returns a method node instead of a block node and use a different 
>> implementation.
>> 
>>> 
>>>     Marcus
> 
> 

Reply via email to