Author: Lars Wassermann <lars.wasserm...@gmail.com>
Branch: 
Changeset: r102:da73d196dd0a
Date: 2013-02-26 15:09 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/da73d196dd0a/

Log:    changed the two VALUE-bytecodes to call the correct primitive,
        according to their receiver class

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -128,6 +128,22 @@
         return self._sendSelfSelectorSpecial(selector, argcount, interp)
     return callPrimitive
 
+def make_call_primitive_bytecode_classbased(a_class_name, a_primitive, 
alternative_class_name, alternative_primitive, selector, argcount):
+    def callPrimitive(self, interp, current_bytecode):
+        rcvr = self.peek(argcount)
+        receiver_class = rcvr.getclass(self.space)
+        try:
+            if receiver_class is getattr(self.space, a_class_name):
+                func = primitives.prim_table[a_primitive]
+                return func(interp, self, argcount)
+            elif receiver_class is getattr(self.space, alternative_class_name):
+                func = primitives.prim_table[alternative_primitive]
+                return func(interp, self, argcount)
+        except primitives.PrimitiveFailedError:
+            pass
+        return self._sendSelfSelectorSpecial(selector, argcount, interp)
+    return callPrimitive
+
 # ___________________________________________________________________________
 # Bytecode Implementations:
 #
@@ -524,10 +540,9 @@
         # which cannot fail
         primitives.prim_table[primitives.CLASS](interp, self, 0)
 
-
     bytecodePrimBlockCopy = 
make_call_primitive_bytecode(primitives.BLOCK_COPY, "blockCopy:", 1)
-    bytecodePrimValue = make_call_primitive_bytecode(primitives.VALUE, 
"value", 0)
-    bytecodePrimValueWithArg = make_call_primitive_bytecode(primitives.VALUE, 
"value:", 1)
+    bytecodePrimValue = 
make_call_primitive_bytecode_classbased("w_BlockContext", primitives.VALUE, 
"w_BlockClosure", primitives.CLOSURE_VALUE, "value", 0)
+    bytecodePrimValueWithArg = 
make_call_primitive_bytecode_classbased("w_BlockContext", primitives.VALUE, 
"w_BlockClosure", primitives.CLOSURE_VALUE_, "value:", 1)
 
     def bytecodePrimDo(self, interp, current_bytecode):
         return self._sendSelfSelectorSpecial("do:", 1, interp)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to