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