[pypy-commit] lang-smalltalk default: added closure bytecodes
lwassermann
noreply at buildbot.pypy.org
Fri Feb 15 18:48:18 CET 2013
Author: Lars Wassermann <lars.wassermann at gmail.com>
Branch:
Changeset: r32:0f7c194a272d
Date: 2013-02-15 18:47 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/0f7c194a272d/
Log: added closure bytecodes added NotYetImplementedError implementations
for these bytecodes added test for the first new bytecode merge with
tip
diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -1,9 +1,7 @@
import py
from spyvm.shadow import ContextPartShadow, MethodContextShadow, BlockContextShadow
-from spyvm import model, constants, primitives
-from spyvm.shadow import ContextPartShadow
-from spyvm import conftest
-from spyvm import wrapper
+from spyvm import model, constants, primitives, conftest, wrapper
+from spyvm.tool.bitmanipulation import splitter
from rpython.rlib import jit
from rpython.rlib import objectmodel, unroll
@@ -370,9 +368,41 @@
def popStackBytecode(self, interp):
self.pop()
+ # closure bytecodes
+ def pushNewArrayPopIntoArray(self, interp):
+ popIntoArray, arraySize = splitter[1, 7](self.getbytecode())
+ newArray = None
+ #if popIntoArray == 1:
+ # newArray = interp.space.wrap_list(self.pop_and_return_n(arraySize))
+ #else:
+ # newArray = interp.space.w_Array.as_class_get_shadow(interp.space).new(arraySize)
+ self.push(newArray)
+ raise MissingBytecode("not yet implemented: pushNewArray")
+
def experimentalBytecode(self, interp):
raise MissingBytecode("experimentalBytecode")
+ def pushTempAtInTempVectorAt(self, interp):
+ k = self.getbytecode()
+ j = self.getbytecode()
+ raise MissingBytecode("not yet implemented: pushTempAt k inTempVectorAt j")
+
+ def storeTempAtInTempVectorAt(self, interp):
+ k = self.getbytecode()
+ j = self.getbytecode()
+ raise MissingBytecode("not yet implemented: storeTempAt k inTempVectorAt j")
+
+ def popAndStoreTempAtInTempVectorAt(self, interp):
+ k = self.getbytecode()
+ j = self.getbytecode()
+ raise MissingBytecode("not yet implemented: popAndstoreTempAt k inTempVectorAt j")
+
+ def pushClosureNumCopiedNumArgsBlockSize(self, interp):
+ l, k = splitter[4, 4](self.getbytecode())
+ j = self.getbytecode()
+ i = self.getbytecode()
+ raise MissingBytecode("not yet implemented: pushClosureNumCopied l numArgs k blockSize ij")
+
def jump(self,offset):
self.store_pc(self.pc() + offset)
@@ -505,7 +535,12 @@
(135, "popStackBytecode"),
(136, "duplicateTopBytecode"),
(137, "pushActiveContextBytecode"),
- (138, 143, "experimentalBytecode"),
+ (138, "pushNewArrayPopIntoArray"),
+ (139, "experimentalBytecode"),
+ (140, "pushTempAtInTempVectorAt"),
+ (141, "storeTempAtInTempVectorAt"),
+ (142, "popAndStoreTempAtInTempVectorAt"),
+ (143, "pushClosureNumCopiedNumArgsBlockSize"),
(144, 151, "shortUnconditionalJump"),
(152, 159, "shortConditionalJump"),
(160, 167, "longUnconditionalJump"),
diff --git a/spyvm/objspace.py b/spyvm/objspace.py
--- a/spyvm/objspace.py
+++ b/spyvm/objspace.py
@@ -205,9 +205,9 @@
a wrapped smalltalk array
"""
lstlen = len(lst_w)
- res = self.w_Array.as_class_get_shadow().new(lstlen)
+ res = self.w_Array.as_class_get_shadow(self).new(lstlen)
for i in range(lstlen):
- res.storevarpointer(i, lit[i])
+ res.storevarpointer(i, lst_w[i])
return res
def unwrap_int(self, w_value):
diff --git a/spyvm/targettinybenchsmalltalk.py b/spyvm/targettinybenchsmalltalk.py
--- a/spyvm/targettinybenchsmalltalk.py
+++ b/spyvm/targettinybenchsmalltalk.py
@@ -1,6 +1,6 @@
import os, sys
from spyvm import model, interpreter, primitives, shadow, constants
-from spyvm.tool.analyseimage import create_squeakimage
+from spyvm.tool.analyseimage import create_squeakimage, create_testimage
from rpython.jit.codewriter.policy import JitPolicy
@@ -19,13 +19,13 @@
def tinyBenchmarks():
from spyvm import objspace
space = objspace.ObjSpace()
- image = create_squeakimage(space)
+ image = create_testimage(space)
interp = interpreter.Interpreter(space)
w_object = model.W_SmallInteger(0)
s_class = w_object.shadow_of_my_class(space)
- w_method = s_class.lookup("tinyBenchmarks")
+ w_method = s_class.lookup("loopTest")
assert w_method
w_frame = w_method.create_frame(space, w_object, [])
diff --git a/spyvm/test/jit.py b/spyvm/test/jit.py
--- a/spyvm/test/jit.py
+++ b/spyvm/test/jit.py
@@ -16,7 +16,7 @@
from spyvm import model, interpreter, primitives, shadow
from spyvm import objspace
-from spyvm.tool.analyseimage import create_testimage
+from spyvm.tool.analyseimage import create_squeakimage, create_testimage
mockclass = objspace.bootstrap_class
@@ -77,5 +77,4 @@
def interp_w():
interp.interpret()
- self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
-
+ self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
\ No newline at end of file
diff --git a/spyvm/test/test_interpreter.py b/spyvm/test/test_interpreter.py
--- a/spyvm/test/test_interpreter.py
+++ b/spyvm/test/test_interpreter.py
@@ -829,3 +829,14 @@
test_storeAndPopReceiverVariableBytecode()
test_bc_objectAtAndAtPut()
option.bc_trace = bc_trace
+
+# Closure Bytecodes
+def test_bc_pushNewArrayPopIntoArray(bytecode=pushNewArrayPopIntoArray):
+ py.test.skip("Fails, since pushNewArrayPopIntoArray is not yet implemented")
+ interp = new_interpreter(bytecode + chr(0x83))
+ context = interp.s_active_context()
+ context.push(fakeliterals("egg"))
+ context.push(fakeliterals("bar"))
+ context.push(fakeliterals("baz"))
+ interp.step(interp.s_active_context())
+ assert context.pop() == fakeliterals(["egg", "bar", "baz"])
\ No newline at end of file
diff --git a/spyvm/todo.txt b/spyvm/todo.txt
--- a/spyvm/todo.txt
+++ b/spyvm/todo.txt
@@ -21,3 +21,7 @@
Shadows:
[ ] Fix invalidation of methoddictshadow when the w_self of its values array changes
+
+Lars ToDo
+[ ] Tests for the new bytecodes.
+[ ] Guess method names for JIT debugging, e.g. changing MethodDictShadow
More information about the pypy-commit
mailing list