[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