[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