[squeak-dev] Re: [Pharo-project] DNU with beMethodArg?

Stéphane Ducasse stephane.ducasse at inria.fr
Thu Jul 28 09:48:26 UTC 2011


Thanks I should digest that :)

Now resting on holidays... should not read mails for a real cure but I do not succeed yet.

Stef

On Jul 27, 2011, at 8:50 PM, Eliot Miranda wrote:

> Hi Steph,
> 
>     this is an interesting bug with Debugger doits inside Debugger doits.  So at the outer level one has some method m0 in the debugger:
> 
> nextEvent
> 	"Return the next event from the receiver."
> 	eventQueue == nil 
> 		ifTrue:[^self nextEventSynthesized]
> 		ifFalse:[^self nextEventFromQueue]
> 
> and in the right-hand context inspector one evaluates the following (which will cause a subscript bounds because there are no temps)
> 
> 	ThisContext namedTempAt: 1
> 
>  to create m1:
> 
> DoItIn: ThisContext 
> 	^ ThisContext namedTempAt: 1
> 
> If in the debugger on m1 I evaluate e.g. ThisContext I get the below error in the compiler as it is trying to create m2
> 
> The underlying bug is that in m2 ThisContext is ambiguous.  It can refer to the context for m1 or, as the programmer intends, the context for m0.  What the programmer means to achieve is an m2 that reads
> 
> DoItIn: ThisContext 
> 	^ (ThisContext tempAt: 0) namedTempAt: 1
> 
> where ThisContext tempAt: 0 accesses thisContext in m0.
> 
> The symptom is due to Encoder>>init:context:notifying: binding ThisContext twice in
> 
> 	aContext ~~ nil ifTrue:
> 		[| homeNode |
> 		 homeNode := self bindTemp: self doItInContextName.
> 		 "0th temp = aContext passed as arg"
> 		 aContext tempNames withIndexDo:
> 			[:variable :index|
> 			scopeTable
> 				at: variable
> 				put: (MessageAsTempNode new
> 						receiver: homeNode
> 						selector: #namedTempAt:
> 						arguments: (Array with: (self encodeLiteral: index))
> 						precedence: 3
> 						from: self)]].
> 
> since aContext tempNames includes 'ThisContext' which is also self doItInContextName.
> 
> I'm not sure how to fix this.  One way is for the above loop to encode 'ThisContext' as 'ThisContext tempAt: 0', but that only works one level deep.  Once one has an m3 it will access the wrong ThisContext, but it'll be better than the current situation as there will be no exception.
>     
> On Tue, Jul 26, 2011 at 7:02 AM, Stéphane Ducasse <Stephane.Ducasse at inria.fr> wrote:
> Hi guys
> 
> I was debugging some bug and I got the following
> 
> 
> DoItIn: ThisContext
>        ^ self
>                do: [:each | ((ThisContext namedTempAt: 1)
>                                        includes: each)
>                                ifFalse: [^ false]]
> 
> 
> I selected (ThisContext namedTempAt: 1
> 
> and I got MessageAsTempNode does not understand beMethodArg
> 
> method: doit context: ctxt
>        " pattern [ | temporaries ] block => MethodNode."
> 
>        | sap blk prim temps messageComment methodNode |
>        properties := AdditionalMethodState new.
>        sap := self pattern: doit inContext: ctxt.
>        "sap={selector, arguments, precedence}"
>        properties selector: (sap at: 1).
>        encoder selector: (sap at: 1).
>        (sap at: 2) do: [:argNode | argNode beMethodArg].
>                                                ^^^^
>        doit ifFalse: [self pragmaSequence].
>        temps := self temporaries.
>        messageComment := currentComment.
>        currentComment := nil.
>        doit ifFalse: [self pragmaSequence].
>        prim := self pragmaPrimitives.
>        self statements: #() innerBlock: doit.
>        blk := parseNode.
>        doit ifTrue: [blk returnLast]
>                ifFalse: [blk returnSelfIfNoOther: encoder].
>        hereType == #doIt ifFalse: [^self expected: 'Nothing more'].
>        self interactive ifTrue: [self removeUnusedTemps].
>        methodNode := self newMethodNode comment: messageComment.
>        ^methodNode
>                selector: (sap at: 1)
>                arguments: (sap at: 2)
>                precedence: (sap at: 3)
>                temporaries: temps
>                block: blk
>                encoder: encoder
>                primitive: prim
>                properties: properties
> 
> 
> argNode is a MessageAsTempNode and beMethodArg is only defined on TempVariableNode
> 
> 
> http://code.google.com/p/pharo/issues/detail?id=4551
> 
> Stef
> 
> 
> 
> 
> 
> -- 
> best,
> Eliot
> 




More information about the Squeak-dev mailing list