On 17/10/2013 01:22, Paolo Bonzini wrote:
Il 16/10/2013 20:45, Gwenaël Casaccio ha scritto:
Hi,

while debugging the expression 1 printNl. I've seen some
unexpected behavior with the current line number. It returns
the line 0 which means that the IP is not correct.

Here is a patch that should I hope fix that issue.
Looks good.  Thanks!

Paolo

Here is an updated version with an error message and a missing
DebugTools file

Gwen

>From c1d8920083202bff2a3e39eaea55460c6446dabe Mon Sep 17 00:00:00 2001
From: Gwenael Casaccio <[email protected]>
Date: Wed, 16 Oct 2013 20:43:00 +0200
Subject: [PATCH] Fix an issue in the current line number

---
 ChangeLog                    | 10 ++++++++++
 kernel/CompildCode.st        | 39 ++++++++++++++++++++------------------
 kernel/ContextPart.st        | 15 +++++++++------
 packages/debug/ChangeLog     |  4 ++++
 packages/debug/DebugTools.st | 19 +++++++++++--------
 packages/debug/debugtests.st | 45 ++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 100 insertions(+), 32 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index cd33f5d..23791f7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2013-10-15  Gwenael Casaccio <[email protected]>
+
+	* kernel/ContextPart.st: Fix >>#currentLine the previous 
+	implementation had a bad ip index and diddn't raise an exception
+	if the instruction pointer was incorrect.
+	* kernel/CompildCode.st: Fix >>#sourceCodeMap since ip points to
+	the next bytecode which could be a line number, there could be a off
+	by one error. Thus when the line number bytecode is met it's stored on
+	the next bytecode.
+
 2013-10-07  Paolo Bonzini  <[email protected]>
 
 	* kernel/BlkClosure.st: Fix off-by-one using the sp variable
diff --git a/kernel/CompildCode.st b/kernel/CompildCode.st
index f42034f..fd3f1b8 100644
--- a/kernel/CompildCode.st
+++ b/kernel/CompildCode.st
@@ -458,24 +458,27 @@ superclass for blocks and methods'>
     ]
 
     sourceCodeMap [
-	"Answer an array which maps bytecode indices to source code
-	 line numbers.  0 values represent invalid instruction
-	 pointer indices."
-
-	<category: 'testing accesses'>
-	| map line first |
-	map := ByteArray new: self size.
-	line := 1.
-	first := true.
-	self allByteCodeIndicesDo: 
-		[:each :byte :operand | 
-		(self class bytecodeInfoTable at: byte * 4 + 4) >= 128 
-		    ifTrue: 
-			[first ifFalse: [line := operand].
-			first := false.
-			operand > 255 ifTrue: [map := map asArray]].
-		map at: each put: line].
-	^map
+        "Answer an array which maps bytecode indices to source code
+         line numbers.  0 values represent invalid instruction
+         pointer indices."
+
+        <category: 'testing accesses'>
+        | map line first next |
+        map := ByteArray new: self size.
+        next := -1.
+        line := 1.
+        first := true.
+        self allByteCodeIndicesDo:
+            [ :each :byte :operand |
+                (self class bytecodeInfoTable at: byte * 4 + 4) >= 128
+                    ifTrue:
+                        [ first ifFalse: [ next := operand ].
+                          first := false.
+                          operand > 255 ifTrue: [ map := map asArray ] ].
+                map at: each put: line.
+                next = -1 ifFalse: [ line := next.
+                                     next := -1. ] ].
+        ^ map
     ]
 
     jumpDestinationAt: anIndex forward: aBoolean [
diff --git a/kernel/ContextPart.st b/kernel/ContextPart.st
index 2c6d5e8..55411c6 100644
--- a/kernel/ContextPart.st
+++ b/kernel/ContextPart.st
@@ -244,12 +244,15 @@ methods that can be used in inspection or debugging.'>
     ]
 
     currentLine [
-	"Answer the 1-based number of the line that is pointed to by the receiver's
-	 instruction pointer.  The DebugTools package caches information,
-	 thus making the implementation faster."
-
-	<category: 'debugging'>
-	^self method sourceCodeMap at: (self ip - 1 max: 1) ifAbsent: [1]
+        "Answer the 1-based number of the line that is pointed to by the receiver's
+         instruction pointer.  The DebugTools package caches information,
+         thus making the implementation faster."
+
+        <category: 'debugging'>
+        | res |
+        res := self method sourceCodeMap at: self ip + 1.
+        ^ res = 0 ifTrue: [ self error: 'IP is not correct' ]
+                  ifFalse: [ res ]
     ]
 
     debugger [
diff --git a/packages/debug/ChangeLog b/packages/debug/ChangeLog
index e91de3f..b660c9a 100644
--- a/packages/debug/ChangeLog
+++ b/packages/debug/ChangeLog
@@ -1,3 +1,7 @@
+2013-10-15  Gwenael Casaccio  <[email protected]>
+
+	* debugtests.st: Add test for currentLineInFile.
+
 2013-06-18  Gwenael Casaccio  <[email protected]>
 
 	* DebugTools.st: Add >>#receiver for VisualGST.
diff --git a/packages/debug/DebugTools.st b/packages/debug/DebugTools.st
index b7d4b78..b2c7b65 100644
--- a/packages/debug/DebugTools.st
+++ b/packages/debug/DebugTools.st
@@ -41,14 +41,17 @@ pointer bytecodes to line numbers.'>
     MethodLineMapCache := nil.
 
     Debugger class >> currentLineIn: aContext [
-	<category: 'source code'>
-	| lineMap method |
-	method := aContext method.
-	MethodLineMapCache isNil 
-	    ifTrue: [MethodLineMapCache := WeakKeyIdentityDictionary new].
-	lineMap := MethodLineMapCache at: method
-		    ifAbsentPut: [method sourceCodeMap].
-	^lineMap at: (aContext ip - 1 max: 1) ifAbsent: [1]
+        <category: 'source code'>
+        | lineMap method res |
+        method := aContext method.
+        MethodLineMapCache isNil
+            ifTrue: [MethodLineMapCache := WeakKeyIdentityDictionary new].
+        lineMap := MethodLineMapCache at: method
+                    ifAbsentPut: [method sourceCodeMap].
+        res := lineMap at: (aContext ip + 1).
+        ^ res = 0
+            ifTrue: [ self error: 'IP is not correct' ]
+            ifFalse: [ res ]
     ]
 
     Debugger class >> on: aProcess [
diff --git a/packages/debug/debugtests.st b/packages/debug/debugtests.st
index c1d142a..c306047 100644
--- a/packages/debug/debugtests.st
+++ b/packages/debug/debugtests.st
@@ -29,6 +29,38 @@
 
 
 
+SmallInteger extend [
+
+    dbgPrintNl [
+        <category: '*DebugTools'>
+        ^ self dbgPrintString
+    ]
+
+    dbgPrintString [
+        "Return the base 10 representation of the receiver"
+
+        <category: '*DebugTools'>
+        ^self dbgPrintString: 10
+    ]
+
+    dbgPrintString: baseInteger [
+        "Return the base baseInteger representation of the receiver"
+
+        <category: '*DebugTools'>
+        | num string |
+        ^self < self zero
+            ifFalse:
+                [string := String new: (self floorLog: baseInteger) + 1.
+                self replace: string withStringBase: baseInteger]
+            ifTrue:
+                [num := self negated.
+                string := String new: (num floorLog: baseInteger) + 2.
+                string at: 1 put: $-.
+                num replace: string withStringBase: baseInteger]
+    ]
+]
+
+^L
 TestCase subclass: DebuggerTest [
     
     <comment: nil>
@@ -264,6 +296,19 @@ TestCase subclass: DebuggerTest [
 	self deny: notReached
     ]
 
+    testRegressionCurrentLine [
+        <category: 'testing'>
+
+        | debugger |
+        debugger := self debuggerOn: [ 1 dbgPrintNl ].
+        debugger step.
+
+        #(34 36 39 43 46 51 53) doWithIndex: [ :each :i |
+            self assert: debugger suspendedContext currentLineInFile == each.
+            debugger step.
+        ]
+    ]
+
     w [
 	<category: 'support'>
 	self x: [:foo | ^foo]
-- 
1.8.1.2

_______________________________________________
help-smalltalk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-smalltalk

Reply via email to