help-smalltalk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-smalltalk] [PATCH 2/4] fix off-by-one using ContextPart's sp insta


From: Paolo Bonzini
Subject: [Help-smalltalk] [PATCH 2/4] fix off-by-one using ContextPart's sp instance variable
Date: Mon, 7 Oct 2013 10:17:46 +0200

2013-10-07  Paolo Bonzini  <address@hidden>

        * kernel/BlkClosure.st: Fix off-by-one using the sp variable
        of contexts.
        * kernel/ContextPart.st: Likewise.
---
 ChangeLog             |  6 ++++++
 kernel/BlkClosure.st  |  9 ++++++---
 kernel/ContextPart.st | 10 ++++++----
 3 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 907cd71..cd33f5d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-10-07  Paolo Bonzini  <address@hidden>
+
+       * kernel/BlkClosure.st: Fix off-by-one using the sp variable
+       of contexts.
+       * kernel/ContextPart.st: Likewise.
+
 2013-09-28  Holger Hans Peter Freyther  <address@hidden>
 
        * kernel/DirPackage.st: Add PackageLoader>>#insertPackage:
diff --git a/kernel/BlkClosure.st b/kernel/BlkClosure.st
index af85fbc..7f79ab4 100644
--- a/kernel/BlkClosure.st
+++ b/kernel/BlkClosure.st
@@ -173,9 +173,12 @@ creation of Processes from blocks.'>
                top := parent isNil
                    ifTrue: [nil]
                    ifFalse: [
-                       parent sp == 0 
-                           ifTrue: [parent receiver]
-                           ifFalse: [parent at: parent sp]].
+                        "This is really ugly.  The right solution would be
+                         to move the receiver into the first stack slot,
+                         so that sp is guaranteed to be non-negative."
+                       parent sp == -1
+                           ifTrue: [parent instVarAt: parent class instSize]
+                           ifFalse: [parent at: parent sp + 1]].
                self value. top]
            parent: parent.
     ]
diff --git a/kernel/ContextPart.st b/kernel/ContextPart.st
index e8a160c..2c6d5e8 100644
--- a/kernel/ContextPart.st
+++ b/kernel/ContextPart.st
@@ -435,7 +435,8 @@ methods that can be used in inspection or debugging.'>
     ]
 
     sp [
-       "Answer the current stack pointer into the receiver"
+       "Answer the current stack pointer into the receiver.  Note that the
+        sp value is zero-based."
 
        "This funny implementation thwarts the interpreter's optimizing effort"
 
@@ -471,9 +472,9 @@ methods that can be used in inspection or debugging.'>
         makes them valid *before* they become accessible."
 
        <category: 'accessing'>
-       self at: sp + 1 put: nil.
+       self at: self size + 1 put: nil.
        sp := sp + 1.
-       self at: sp put: anObject.
+       self at: self size put: anObject.
     ]
 
     sp: newSP [
@@ -487,7 +488,8 @@ methods that can be used in inspection or debugging.'>
        <category: 'accessing'>
        newSP isSmallInteger 
            ifFalse: [^SystemExceptions.WrongClass signalOn: newSP mustBe: 
SmallInteger].
-       newSP > sp ifTrue: [sp + 1 to: newSP do: [:i | self at: i put: nil]].
+       newSP > sp ifTrue: [
+           self size + 1 to: newSP + 1 do: [:i | self at: i put: nil]].
        sp := newSP
     ]
 
-- 
1.8.3.1





reply via email to

[Prev in Thread] Current Thread [Next in Thread]