[pypy-commit] lang-smalltalk default: unify temp list and stack

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


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: 
Changeset: r71:f6a2cd506f60
Date: 2013-02-20 15:03 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/f6a2cd506f60/

Log:	unify temp list and stack

diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -473,26 +473,31 @@
     def settemp(self, index, w_value):
         self.s_home().settemp(index, w_value)
 
+    @jit.unroll_safe
+    def init_stack_and_temps(self):
+        stacksize = self.stackend() - self.stackstart()
+        tempsize = self.tempsize()
+        self._temps_and_stack = [None] * (stacksize + tempsize)
+        for i in range(tempsize):
+            self._temps_and_stack[i] = self.space.w_nil
+        self._stack_ptr = rarithmetic.r_uint(tempsize) # we point after the last element
+
     # ______________________________________________________________________
     # Stack Manipulation
-    def init_stack(self):
-        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._temps_and_stack[self.tempsize():self._stack_ptr]
 
     def pop(self):
         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
+        ret = self._temps_and_stack[ptr]   # you get OverflowError if the stack is empty
+        self._temps_and_stack[ptr] = None
         self._stack_ptr = ptr
         return ret
 
     def push(self, w_v):
         ptr = jit.promote(self._stack_ptr)
-        self._stack_items[ptr] = w_v
+        self._temps_and_stack[ptr] = w_v
         self._stack_ptr = ptr + 1
 
     def push_all(self, lst):
@@ -504,11 +509,11 @@
 
     def set_top(self, value, position=0):
         rpos = rarithmetic.r_uint(position)
-        self._stack_items[self._stack_ptr + ~rpos] = value
+        self._temps_and_stack[self._stack_ptr + ~rpos] = value
 
     def peek(self, idx):
         rpos = rarithmetic.r_uint(idx)
-        return self._stack_items[self._stack_ptr + ~rpos]
+        return self._temps_and_stack[self._stack_ptr + ~rpos]
 
     @jit.unroll_safe
     def pop_n(self, n):
@@ -516,10 +521,10 @@
         while n > 0:
             n -= 1
             self._stack_ptr -= 1
-            self._stack_items[self._stack_ptr] = None
+            self._temps_and_stack[self._stack_ptr] = None
 
     def stackdepth(self):
-        return rarithmetic.intmask(self._stack_ptr)
+        return rarithmetic.intmask(self._stack_ptr - self.tempsize())
 
     def pop_and_return_n(self, n):
         result = [self.peek(i) for i in range(n - 1, -1, -1)]
@@ -548,7 +553,7 @@
         s_result.store_initialip(initialip)
         s_result.store_w_home(w_home)
         s_result.store_pc(initialip)
-        s_result.init_stack()
+        s_result.init_stack_and_temps()
         return w_result
 
     def fetch(self, n0):
@@ -574,7 +579,7 @@
     def attach_shadow(self):
         # Make sure the home context is updated first
         self.copy_from_w_self(constants.BLKCTX_HOME_INDEX)
-        self.init_stack()
+        self.init_stack_and_temps()
         ContextPartShadow.attach_shadow(self)
 
     def unwrap_store_initialip(self, w_value):
@@ -649,10 +654,9 @@
             s_result.store_w_sender(w_sender)
         s_result.store_w_receiver(w_receiver)
         s_result.store_pc(0)
-        s_result._temps = [space.w_nil] * w_method.tempsize
+        s_result.init_stack_and_temps()
         for i in range(len(arguments)):
             s_result.settemp(i, arguments[i])
-        s_result.init_stack()
         return w_result
 
     def fetch(self, n0):
@@ -687,9 +691,7 @@
     def attach_shadow(self):
         # Make sure the method is updated first
         self.copy_from_w_self(constants.MTHDCTX_METHOD)
-        self.init_stack()
-        # And that there is space for the temps
-        self._temps = [self.space.w_nil] * self.tempsize()
+        self.init_stack_and_temps()
         ContextPartShadow.attach_shadow(self)
 
     def tempsize(self):
@@ -709,10 +711,10 @@
         self._w_receiver = w_receiver
 
     def gettemp(self, index0):
-        return self._temps[index0]
+        return self._temps_and_stack[index0]
 
     def settemp(self, index0, w_value):
-        self._temps[index0] = w_value
+        self._temps_and_stack[index0] = w_value
 
     def w_home(self):
         return self.w_self()
diff --git a/spyvm/test/test_primitives.py b/spyvm/test/test_primitives.py
--- a/spyvm/test/test_primitives.py
+++ b/spyvm/test/test_primitives.py
@@ -16,7 +16,7 @@
     def __init__(self, stack):
         self._vars = [None] * 6 + stack
         s_self = self.as_blockcontext_get_shadow()
-        s_self.init_stack()
+        s_self.init_stack_and_temps()
         s_self.reset_stack()
         s_self.push_all(stack)
         s_self.store_expected_argument_count(0)


More information about the pypy-commit mailing list