[pypy-svn] r47802 - in pypy/dist/pypy/lang/smalltalk: . test

tverwaes at codespeak.net tverwaes at codespeak.net
Wed Oct 24 11:21:50 CEST 2007


Author: tverwaes
Date: Wed Oct 24 11:21:49 2007
New Revision: 47802

Modified:
   pypy/dist/pypy/lang/smalltalk/interpreter.py
   pypy/dist/pypy/lang/smalltalk/test/test_interpreter.py
Log:
(toon) added singleExtendedSendBytecode


Modified: pypy/dist/pypy/lang/smalltalk/interpreter.py
==============================================================================
--- pypy/dist/pypy/lang/smalltalk/interpreter.py	(original)
+++ pypy/dist/pypy/lang/smalltalk/interpreter.py	Wed Oct 24 11:21:49 2007
@@ -196,7 +196,10 @@
         self.pop()
 
     def singleExtendedSendBytecode(self, interp):
-        raise MissingBytecode
+        descriptor = self.getByte()
+        selector = self.method.literals[descriptor & 31]
+        argcount = descriptor >> 5
+        self._sendSelector(selector, argcount, interp)
 
     def doubleExtendedDoAnythingBytecode(self, interp):
         raise MissingBytecode

Modified: pypy/dist/pypy/lang/smalltalk/test/test_interpreter.py
==============================================================================
--- pypy/dist/pypy/lang/smalltalk/test/test_interpreter.py	(original)
+++ pypy/dist/pypy/lang/smalltalk/test/test_interpreter.py	Wed Oct 24 11:21:49 2007
@@ -403,3 +403,28 @@
     assert interp.activeContext.stack == [interp.TRUE, interp.FALSE,
                                           interp.TRUE, interp.FALSE,
                                           interp.FALSE, interp.TRUE]
+
+def test_singleExtendedSendBytecode():
+    w_class = model.W_Class(None, None)
+    w_object = w_class.new()
+    for bytecode, result in [ (returnReceiver, w_object), 
+          (returnTrue, interpreter.Interpreter.TRUE), 
+          (returnFalse, interpreter.Interpreter.FALSE),
+          (returnNil, interpreter.Interpreter.NIL),
+          (returnTopFromMethod, interpreter.Interpreter.ONE) ]:
+        w_class.methoddict["foo"] = model.W_CompiledMethod(None, 0, pushConstantOneBytecode + bytecode)
+        interp = new_interpreter(singleExtendedSendBytecode + chr(0))
+        interp.activeContext.method.literals = ["foo"]
+        interp.activeContext.push(w_object)
+        callerContext = interp.activeContext
+        interp.step()
+        assert interp.activeContext.sender == callerContext
+        assert interp.activeContext.stack == []
+        assert interp.activeContext.receiver == w_object
+        assert interp.activeContext.method == w_class.methoddict["foo"]
+        assert callerContext.stack == []
+        interp.step()
+        interp.step()
+        assert interp.activeContext == callerContext
+        assert interp.activeContext.stack == [result]
+ 



More information about the Pypy-commit mailing list