Author: Tobias Pape <[email protected]>
Branch:
Changeset: r19:4da7f6a039b9
Date: 2012-04-19 13:37 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/4da7f6a039b9/
Log: Re-import a FixedStack implementation
- fix deprecated overflowcheck w/ shift
- fix r_uints missing
diff --git a/spyvm/fixedstack.py b/spyvm/fixedstack.py
new file mode 100644
--- /dev/null
+++ b/spyvm/fixedstack.py
@@ -0,0 +1,65 @@
+"""
+A Fixed stack for SPy.
+"""
+
+import types
+
+from pypy.rlib.rarithmetic import r_uint
+
+class FixedStack(object):
+ _annspecialcase_ = "specialize:ctr_location" # polymorphic
+
+ def __init__(self):
+ pass
+
+ def setup(self, stacksize):
+ self.ptr = r_uint(0) # we point after the last element
+ self.items = [None] * stacksize
+
+ def clone(self):
+ # this is only needed if we support flow space
+ s = self.__class__()
+ s.setup(len(self.items))
+ for item in self.items[:self.ptr]:
+ try:
+ item = item.clone()
+ except AttributeError:
+ pass
+ s.push(item)
+ return s
+
+ def push(self, item):
+ ptr = self.ptr
+ self.items[ptr] = item
+ self.ptr = ptr + 1
+
+ def pop(self):
+ ptr = self.ptr - 1
+ ret = self.items[ptr] # you get OverflowError if the stack is empty
+ self.items[ptr] = None
+ self.ptr = ptr
+ return ret
+
+ def drop(self, n):
+ while n > 0:
+ n -= 1
+ self.ptr -= 1
+ self.items[self.ptr] = None
+
+ def top(self, position=0):
+ # for a fixed stack, we assume correct indices
+ rpos = r_uint(position)
+ return self.items[self.ptr + ~rpos]
+
+ def set_top(self, value, position=0):
+ # for a fixed stack, we assume correct indices
+ rpos = r_uint(position)
+ self.items[self.ptr + ~rpos] = value
+
+ def depth(self):
+ return self.ptr
+
+ def empty(self):
+ return not self.ptr
+
+
diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -424,7 +424,7 @@
return self.words[n]
def setword(self, n, word):
- self.words[n] = word
+ self.words[n] = r_uint(word)
def size(self):
return len(self.words)
diff --git a/spyvm/objspace.py b/spyvm/objspace.py
--- a/spyvm/objspace.py
+++ b/spyvm/objspace.py
@@ -217,7 +217,7 @@
val = w_value.value
if val < 0:
raise UnwrappingError("got negative integer")
- return w_value.value
+ return r_uint(w_value.value)
if isinstance(w_value, model.W_BytesObject):
# TODO: Completely untested! This failed translation bigtime...
# XXX Probably we want to allow all subclasses
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -202,7 +202,7 @@
# left shift, must fail if we lose bits beyond 32
if argument > 0:
try:
- shifted = rarithmetic.ovfcheck_lshift(receiver, argument)
+ shifted = rarithmetic.ovfcheck(receiver << argument)
except OverflowError:
raise PrimitiveFailedError()
return interp.space.wrap_int(shifted)
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -315,7 +315,7 @@
__metaclass__ = extendabletype
def __init__(self, space, w_self):
- from pypy.interpreter.miscutils import FixedStack
+ from spyvm.fixedstack import FixedStack
self._w_sender = space.w_nil
self._stack = FixedStack()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit