[pypy-commit] lang-smalltalk default: remove the fixedstack class and just put the functionality into ContextPartShadow

cfbolz noreply at buildbot.pypy.org
Wed Feb 20 15:57:24 CET 2013


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: 
Changeset: r70:4f3d226d130b
Date: 2013-02-19 18:20 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/4f3d226d130b/

Log:	remove the fixedstack class and just put the functionality into
	ContextPartShadow

diff --git a/spyvm/fixedstack.py b/spyvm/fixedstack.py
deleted file mode 100644
--- a/spyvm/fixedstack.py
+++ /dev/null
@@ -1,68 +0,0 @@
-"""
-A Fixed stack for SPy.
-"""
-
-import types
-
-from rpython.rlib import jit
-from rpython.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 = jit.promote(self.ptr)
-        self.items[ptr] = item
-        self.ptr = ptr + 1
-    
-    def pop(self):
-        ptr = jit.promote(self.ptr) - 1
-        ret = self.items[ptr]   # you get OverflowError if the stack is empty
-        self.items[ptr] = None
-        self.ptr = ptr
-        return ret
-
-    @jit.unroll_safe
-    def drop(self, n):
-        jit.promote(self.ptr)
-        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/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -317,10 +317,8 @@
     __metaclass__ = extendabletype
 
     def __init__(self, space, w_self):
-        from spyvm.fixedstack import FixedStack
 
         self._w_sender = space.w_nil
-        self._stack = FixedStack()
         self.currentBytecode = -1
         AbstractRedirectingShadow.__init__(self, space, w_self)
 
@@ -339,7 +337,7 @@
         if n0 == constants.CTXPART_STACKP_INDEX:
             return self.wrap_stackpointer()
         if self.stackstart() <= n0 < self.external_stackpointer():
-            return self._stack.top(self.stackdepth() - (n0-self.stackstart()) - 1)
+            return self.peek(self.stackdepth() - (n0-self.stackstart()) - 1)
         if self.external_stackpointer() <= n0 < self.stackend():
             return self.space.w_nil
         else:
@@ -354,7 +352,7 @@
         if n0 == constants.CTXPART_STACKP_INDEX:
             return self.unwrap_store_stackpointer(w_value)
         if self.stackstart() <= n0 < self.external_stackpointer():
-            return self._stack.set_top(w_value,
+            return self.set_top(w_value,
                                        self.stackdepth() - (n0-self.stackstart()) - 1)
             return
         if self.external_stackpointer() <= n0 < self.stackend():
@@ -375,10 +373,10 @@
         if size < depth:
             # TODO Warn back to user
             assert size >= 0
-            self._stack.drop(depth - size)
+            self.pop_n(depth - size)
         else:
             for i in range(depth, size):
-                self._stack.push(self.space.w_nil)
+                self.push(self.space.w_nil)
 
     def wrap_stackpointer(self):
         return self.space.wrap_int(self.stackdepth() + 
@@ -478,17 +476,24 @@
     # ______________________________________________________________________
     # Stack Manipulation
     def init_stack(self):
-        self._stack.setup(self.stackend() - self.stackstart())
+        self._stack_ptr = rarithmetic.r_uint(0) # we point after the last element
+        self._stack_items = [None] * (self.stackend() - self.stackstart())
 
     def stack(self):
         """NOT_RPYTHON""" # purely for testing
-        return self._stack.items[:self.stackdepth()]
+        return self._stack_items[:self.stackdepth()]
 
     def pop(self):
-        return self._stack.pop()
+        ptr = jit.promote(self._stack_ptr) - 1
+        ret = self._stack_items[ptr]   # you get OverflowError if the stack is empty
+        self._stack_items[ptr] = None
+        self._stack_ptr = ptr
+        return ret
 
     def push(self, w_v):
-        self._stack.push(w_v)
+        ptr = jit.promote(self._stack_ptr)
+        self._stack_items[ptr] = w_v
+        self._stack_ptr = ptr + 1
 
     def push_all(self, lst):
         for elt in lst:
@@ -496,18 +501,28 @@
 
     def top(self):
         return self.peek(0)
-        
+
+    def set_top(self, value, position=0):
+        rpos = rarithmetic.r_uint(position)
+        self._stack_items[self._stack_ptr + ~rpos] = value
+
     def peek(self, idx):
-        return self._stack.top(idx)
+        rpos = rarithmetic.r_uint(idx)
+        return self._stack_items[self._stack_ptr + ~rpos]
 
+    @jit.unroll_safe
     def pop_n(self, n):
-        self._stack.drop(n)
+        jit.promote(self._stack_ptr)
+        while n > 0:
+            n -= 1
+            self._stack_ptr -= 1
+            self._stack_items[self._stack_ptr] = None
 
     def stackdepth(self):
-        return rarithmetic.intmask(self._stack.depth())
+        return rarithmetic.intmask(self._stack_ptr)
 
     def pop_and_return_n(self, n):
-        result = [self._stack.top(i) for i in range(n - 1, -1, -1)]
+        result = [self.peek(i) for i in range(n - 1, -1, -1)]
         self.pop_n(n)
         return result
 


More information about the pypy-commit mailing list