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