Thanks. Nice explanation. On Fri, Jul 15, 2011 at 09:52, Paolo Bonzini <[email protected]> wrote: > On 07/14/2011 08:25 PM, Ladislav Marek wrote: >> I have observe strange behavior of MethodContext>>printOn: and >> ContextPart>>currentLineInFile >> >> Eval [ >> thisContext print. >> 1. >> ] >> >> This code outputs: UndefinedObject>>executeStatements (test.st:3), >> line is incorrect, I think it should be 2. >> >> Eval [ >> thisContext currentLineInFile printNl. >> 1. >> ] >> >> This code outputs: 2, as expected. I look at the >> MethodContext>>printOn: method and there is >> ContextPart>>currentLineInFile called, so why it outputs different >> line number? > > It's an off-by-one error. This is the compiled bytecode for your first > example: > > 0: source line 2 > push Global Variable[0] = ContextPart > 2: send special message #thisContext > 4: send selector 1, 0 args = #printNl > 6: source line 2 > pop stack top > 8: push 1 > return stack top > > The instruction pointer when sending #printNl is already 6. The call to > #currentLineInFile prints erroneously takes the "source line" bytecode at > address 6 into account, and prints 2+2-1 = 3. > > This patch fixes it: > > diff --git a/kernel/ContextPart.st b/kernel/ContextPart.st > index bfcf8d5..dc11dd3 100644 > --- a/kernel/ContextPart.st > +++ b/kernel/ContextPart.st > @@ -125,7 +125,7 @@ methods that can be used in inspection or debugging.'> > thus making the implementation faster." > > <category: 'debugging'> > - ^self method sourceCodeMap at: self ip + 1 ifAbsent: [1] > + ^self method sourceCodeMap at: self ip - 1 ifAbsent: [1] > ] > > debugger [ > > Thanks for reporting it! > > Paolo >
_______________________________________________ help-smalltalk mailing list [email protected] https://lists.gnu.org/mailman/listinfo/help-smalltalk
