2013-10-07 Paolo Bonzini <bonz...@redhat.com> * 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 <bonz...@redhat.com> + + * kernel/BlkClosure.st: Fix off-by-one using the sp variable + of contexts. + * kernel/ContextPart.st: Likewise. + 2013-09-28 Holger Hans Peter Freyther <hol...@freyther.de> * 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 _______________________________________________ help-smalltalk mailing list help-smalltalk@gnu.org https://lists.gnu.org/mailman/listinfo/help-smalltalk