Hi,

ContextPart print methods are extend to support debug informations,
they can print the arguments and temporaries names (and values too).
examineOn: is extended too to print those values.

Gwen

>From f8cf50a060589d417ec533a7f561b0f1a11c958d Mon Sep 17 00:00:00 2001
From: Gwenael Casaccio <mrg...@gmail.com>
Date: Wed, 21 Aug 2013 12:39:10 +0200
Subject: [PATCH] Print context args and temps names and their value while
 inspecting them and add a unit testing in kernel-tests.

---
 ChangeLog                                        |   4 +
 kernel/ContextPart.st                            | 111 +++++++++++++++++++++++
 packages/kernel-tests/ChangeLog                  |   4 +
 packages/kernel-tests/kernel/ContextPartTests.st |  22 +++++
 packages/kernel-tests/package.xml                |   2 +
 5 files changed, 143 insertions(+)
 create mode 100644 packages/kernel-tests/kernel/ContextPartTests.st

diff --git a/ChangeLog b/ChangeLog
index d4c410f..acdf5c0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-08-20  Gwenael Casaccio <gwenael.casac...@gmail.com>
+
+	* kernel/ContextPart.st: Print context args and temps names and their value while inspecting them.
+
 2013-08-10  Gwenael Casaccio <gwenael.casac...@gmail.com>
 
 	* kernel/BlkClosure.st: Add >>#method: setter.
diff --git a/kernel/ContextPart.st b/kernel/ContextPart.st
index e57cec3..3383526 100644
--- a/kernel/ContextPart.st
+++ b/kernel/ContextPart.st
@@ -77,6 +77,117 @@ methods that can be used in inspection or debugging.'>
 	
     ]
 
+
+    printContextState [
+        <category: 'printing'>
+
+        self printContextStateOn: Transcript spaces: 4
+    ]
+
+
+    printVariableKind: aString on: aStream spaces: anInteger [
+        <category: 'printing'>
+
+        aStream
+            space: anInteger;
+            nextPutAll: aString;
+            nextPutAll: ':';
+            nl.
+    ]
+
+    printVariable: anArray at: anIndex do: aBlock on: aStream spaces: anInteger [
+        <category: 'printing'>
+
+            aStream space: anInteger * 2.
+            anArray ifNil: [ aStream print: anIndex ] ifNotNil: [ aStream nextPutAll: (anArray at: anIndex) ].
+            aStream
+                nextPutAll: ' -> ';
+                print: aBlock value;
+                nl
+    ]
+
+    printArgumentsOn: aStream spaces: anInteger [
+        <category: 'printing'>
+
+        | variables |
+
+        self printVariableKind: 'args' on: aStream spaces: 2.
+
+        variables := self method arguments.
+        1 to: self numArgs do: [ :i |
+            self printVariable: variables at: i do: [ self at: i ] on: aStream spaces: anInteger ].
+    ]
+
+    printTemporariesOn: aStream spaces: anInteger [
+        <category: 'printing'>
+
+        | variables |
+
+        self printVariableKind: 'temps' on: aStream spaces: 2.
+
+        variables := self method temporaries.
+        1 to: self numTemps do: [ :i |
+            self printVariable: variables at: i do: [ self at: self numArgs + i ] on: aStream spaces: anInteger ].
+    ]
+
+    printContextStateOn: aStream spaces: anInteger [
+        <category: 'printing'>
+
+        self
+            printArgumentsOn: aStream spaces: 2;
+            printTemporariesOn: aStream spaces: 2.
+    ]
+
+    examineOn: aStream [
+	<category: 'printing'>
+
+	| instVars output object |
+	aStream
+	    nextPutAll: 'An instance of ';
+	    print: self class;
+	    nl.
+        instVars := self class allInstVarNames.
+        1 to: instVars size
+            do:
+                [:i |
+                object := self instVarAt: i.
+                output := [object printString] on: Error
+                            do:
+                                [:ex |
+                                ex
+                                    return: '%1 %2' %
+                                                {object class article.
+                                                object class name asString}].
+                aStream
+                    nextPutAll: '  ';
+                    nextPutAll: (instVars at: i);
+                    nextPutAll: ': ';
+                    nextPutAll: output;
+                    nl].
+        self printContextStateOn: aStream spaces: 2.
+        aStream
+            space: 2;
+            nextPutAll: 'stack: ';
+            nl.
+        self numArgs + self numTemps + 1 to: self validSize do: [ :i |
+                object := self at: i.
+                output := [object printString] on: Error
+                            do:
+                                [:ex |
+                                ex
+                                    return: '%1 %2' %
+                                                {object class article.
+                                                object class name asString}].
+                aStream
+                    space: 4;
+                    nextPutAll: '[';
+                    print: i;
+                    nextPutAll: ']: ';
+                    nextPutAll: output;
+                    nl].
+            
+    ]
+
     backtrace [
 	"Print a backtrace from the receiver to the bottom of the stack on the
 	 Transcript."
diff --git a/packages/kernel-tests/ChangeLog b/packages/kernel-tests/ChangeLog
index 5a716fb..5c573f4 100644
--- a/packages/kernel-tests/ChangeLog
+++ b/packages/kernel-tests/ChangeLog
@@ -1,3 +1,7 @@
+2013-08-20  Gwenael Casaccio <gwenael.casac...@gmail.com>
+
+	 * kernel/ContextParTests.st: Add tests for ContextPart
+
 2013-06-11  Gwenael Casaccio <gwenael.casac...@gmail.com>
 
 	 * kernel/CompiledMethodTests.st: Add tests for CompiledMethod
diff --git a/packages/kernel-tests/kernel/ContextPartTests.st b/packages/kernel-tests/kernel/ContextPartTests.st
new file mode 100644
index 0000000..29d4ded
--- /dev/null
+++ b/packages/kernel-tests/kernel/ContextPartTests.st
@@ -0,0 +1,22 @@
+TestCase subclass: TestContextPart [
+
+    testContextStatePrint [
+        <category: 'testing'>
+
+        | ctxt stream |
+        stream := WriteStream on: String new.
+        ctxt := [ : a : b : c | | d e f | d := 21. e := 22. f := 23. thisContext ] value: 1 value: 2 value: 3.
+        ctxt printContextStateOn: stream spaces: 2.
+        self assert: stream contents = 
+'  args:
+    a -> 1
+    b -> 2
+    c -> 3
+  temps:
+    d -> 21
+    e -> 22
+    f -> 23
+'.
+    ]
+
+]
diff --git a/packages/kernel-tests/package.xml b/packages/kernel-tests/package.xml
index 4dc8484..9c387e3 100644
--- a/packages/kernel-tests/package.xml
+++ b/packages/kernel-tests/package.xml
@@ -3,7 +3,9 @@
 
   <test>
    <sunit>TestCompiledMethod</sunit>
+   <sunit>TestContextPart</sunit>
    <filein>kernel/CompiledMethodTests.st</filein>
+   <filein>kernel/ContextPartTests.st</filein>
   </test>
 
   <file>ChangeLog</file>
-- 
1.8.1.2

_______________________________________________
help-smalltalk mailing list
help-smalltalk@gnu.org
https://lists.gnu.org/mailman/listinfo/help-smalltalk

Reply via email to