Author: Lars Wassermann <[email protected]>
Branch: 
Changeset: r79:5d56ed9018f7
Date: 2013-02-21 19:42 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/5d56ed9018f7/

Log:    added constants for the different field of MethodClosure patched
        some mocking methods to use them for block closure testing

diff --git a/spyvm/constants.py b/spyvm/constants.py
--- a/spyvm/constants.py
+++ b/spyvm/constants.py
@@ -38,12 +38,15 @@
 
 # MethodContext < ContextPart
 MTHDCTX_METHOD = 3
-MTHDCTX_RECEIVER_MAP = 4
+MTHDCTX_CLOSURE_OR_NIL = 4
 MTHDCTX_RECEIVER = 5
 MTHDCTX_TEMP_FRAME_START = 6
 
 # BlockClosure < Object
-BLOCKCLOSURE_SIZE = 3
+BLKCLSR_OUTER_CONTEXT = 0
+BLKCLSR_STARTPC = 1
+BLKCLSR_NUMARGS = 2
+BLKCLSR_SIZE = 3
 
 # ___________________________________________________________________________
 # Miscellaneous constants
diff --git a/spyvm/objspace.py b/spyvm/objspace.py
--- a/spyvm/objspace.py
+++ b/spyvm/objspace.py
@@ -112,7 +112,7 @@
         define_cls("w_BlockContext", "w_ContextPart",
                    instvarsize=constants.BLKCTX_STACK_START)
         define_cls("w_BlockClosure", "w_Object",
-                   instvarsize=constants.BLOCKCLOSURE_SIZE,
+                   instvarsize=constants.BLKCLSR_SIZE,
                    varsized=True)
         # make better accessors for classes that can be found in special object
         # table
@@ -255,7 +255,7 @@
     def unwrap_array(self, w_array):
         # Check that our argument has pointers format and the class:
         if not w_array.getclass(self).is_same_object(self.w_Array):
-            raise PrimitiveFailedError()
+            raise UnwrappingError()
         assert isinstance(w_array, model.W_PointersObject)
         
         return [w_array.at0(self, i) for i in range(w_array.size())]
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -633,7 +633,7 @@
 
 class MethodContextShadow(ContextPartShadow):
     def __init__(self, space, w_self):
-        self.w_receiver_map = space.w_nil
+        self.w_closure_or_nil = space.w_nil
         self._w_receiver = None
         ContextPartShadow.__init__(self, space, w_self)
 
@@ -651,6 +651,9 @@
         # XXX could hack some more to never have to create the _vars of 
w_result
         s_result = MethodContextShadow(space, w_result)
         w_result.store_shadow(s_result)
+        if closure is not None: 
+            s_result.w_closure_or_nil = closure._w_self
+        
         s_result.store_w_method(w_method)
         if w_sender:
             s_result.store_w_sender(w_sender)
@@ -664,12 +667,11 @@
     def fetch(self, n0):
         if n0 == constants.MTHDCTX_METHOD:
             return self.w_method()
-        if n0 == constants.MTHDCTX_RECEIVER_MAP:
-            return self.w_receiver_map
+        if n0 == constants.MTHDCTX_CLOSURE_OR_NIL:
+            return self.w_closure_or_nil
         if n0 == constants.MTHDCTX_RECEIVER:
             return self.w_receiver()
-        if (0 <= n0-constants.MTHDCTX_TEMP_FRAME_START <
-                 self.tempsize()):
+        if (0 <= n0-constants.MTHDCTX_TEMP_FRAME_START < self.tempsize()):
             return self.gettemp(n0-constants.MTHDCTX_TEMP_FRAME_START)
         else:
             return ContextPartShadow.fetch(self, n0)
@@ -677,8 +679,8 @@
     def store(self, n0, w_value):
         if n0 == constants.MTHDCTX_METHOD:
             return self.store_w_method(w_value)
-        if n0 == constants.MTHDCTX_RECEIVER_MAP:
-            self.w_receiver_map = w_value
+        if n0 == constants.MTHDCTX_CLOSURE_OR_NIL:
+            self.w_closure_or_nil = w_value
             return
         if n0 == constants.MTHDCTX_RECEIVER:
             self.store_w_receiver(w_value)
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
@@ -2,9 +2,7 @@
 import math
 from spyvm.primitives import prim_table, PrimitiveFailedError
 from spyvm import model, shadow, interpreter
-from spyvm import constants
-from spyvm import primitives
-from spyvm import objspace
+from spyvm import constants, primitives, objspace, wrapper
 
 from rpython.rlib.rfloat import INFINITY, NAN, isinf, isnan
 
@@ -20,6 +18,7 @@
         s_self.reset_stack()
         s_self.push_all(stack)
         s_self.store_expected_argument_count(0)
+    
     def as_blockcontext_get_shadow(self):
         self._shadow = shadow.BlockContextShadow(space, self)
         return self._shadow
@@ -33,15 +32,20 @@
     if isinstance(x, list): return space.wrap_list(x)
     raise NotImplementedError
     
-def mock(stack):
+def mock(stack, context = None):
     mapped_stack = [wrap(x) for x in stack]
-    frame = MockFrame(mapped_stack)
+    if context is None:
+        frame = MockFrame(mapped_stack)
+    else:
+        frame = context
+        for i in range(len(stack)):
+            frame.as_context_get_shadow(space).push(stack[i])
     interp = interpreter.Interpreter(space)
     interp.store_w_active_context(frame)
     return (interp, len(stack))
 
-def prim(code, stack):
-    interp, argument_count = mock(stack)
+def prim(code, stack, context = None):
+    interp, argument_count = mock(stack, context)
     prim_table[code](interp, argument_count-1)
     res = interp.s_active_context().pop()
     assert not interp.s_active_context().stackdepth() # check args are consumed
diff --git a/spyvm/test/test_shadow.py b/spyvm/test/test_shadow.py
--- a/spyvm/test/test_shadow.py
+++ b/spyvm/test/test_shadow.py
@@ -87,7 +87,7 @@
     w_object.store(space, constants.CTXPART_STACKP_INDEX, 
space.wrap_int(method.tempsize+stackpointer))
     w_object.store(space, constants.MTHDCTX_METHOD, method)
     # XXX
-    w_object.store(space, constants.MTHDCTX_RECEIVER_MAP, '???')
+    w_object.store(space, constants.MTHDCTX_CLOSURE_OR_NIL, space.w_nil)
     w_object.store(space, constants.MTHDCTX_RECEIVER, 'receiver')
 
     w_object.store(space, constants.MTHDCTX_TEMP_FRAME_START, 'el')
diff --git a/spyvm/wrapper.py b/spyvm/wrapper.py
--- a/spyvm/wrapper.py
+++ b/spyvm/wrapper.py
@@ -1,4 +1,4 @@
-from spyvm import model
+from spyvm import model, constants
 from spyvm.error import FatalError, WrapperException
 
 class Wrapper(object):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to