Author: Tim Felgentreff <[email protected]>
Branch:
Changeset: r156:c0b6fb0e6d02
Date: 2013-03-08 18:03 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/c0b6fb0e6d02/
Log: merge default
diff --git a/spyvm/constants.py b/spyvm/constants.py
--- a/spyvm/constants.py
+++ b/spyvm/constants.py
@@ -1,3 +1,4 @@
+from rpython.rlib.jit import elidable
# ___________________________________________________________________________
# Slot Names
diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -365,6 +365,10 @@
from spyvm.shadow import MethodDictionaryShadow
return self.as_special_get_shadow(space, MethodDictionaryShadow)
+ def as_cached_object_get_shadow(self, space):
+ from spyvm.shadow import CachedObjectShadow
+ return self.as_special_get_shadow(space, CachedObjectShadow)
+
def become(self, w_other):
if not isinstance(w_other, W_PointersObject):
return False
diff --git a/spyvm/objspace.py b/spyvm/objspace.py
--- a/spyvm/objspace.py
+++ b/spyvm/objspace.py
@@ -162,7 +162,8 @@
@specialize.arg(1)
def get_special_selector(self, selector):
i0 = constants.find_selectorindex(selector)
- return self.w_special_selectors.at0(self, i0)
+ self.w_special_selectors.as_cached_object_get_shadow(self)
+ return self.w_special_selectors.fetch(self, i0)
# methods for wrapping and unwrapping stuff
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -892,3 +892,31 @@
s_new = MethodContextShadow.make_context(
space, self, receiver, arguments, sender)
return s_new
+
+class Version:
+ pass
+
+class CachedObjectShadow(AbstractCachingShadow):
+ _immutable_fields_ = ['version?']
+
+ def __init__(self, space, w_self):
+ AbstractCachingShadow.__init__(self, space, w_self)
+ self.version = Version()
+
+ def fetch(self, n0):
+ jit.promote(self)
+ version = self.version
+ jit.promote(version)
+ return self.safe_fetch(n0, version)
+
+ @jit.elidable
+ def safe_fetch(self, n0, version):
+ assert version is self.version
+ return self._w_self._fetch(n0)
+
+ def store(self, n0, w_value):
+ self.version = Version()
+ return self._w_self._store(n0, w_value)
+
+ def update_shadow(self):
+ self.version = Version()
\ No newline at end of file
diff --git a/spyvm/squeakimage.py b/spyvm/squeakimage.py
--- a/spyvm/squeakimage.py
+++ b/spyvm/squeakimage.py
@@ -491,6 +491,9 @@
self.w_object = objectmodel.instantiate(model.W_CompiledMethod)
else:
assert 0, "not reachable"
+ else:
+ #XXX invalidate shadow here
+ pass
return self.w_object
def fillin_w_object(self):
diff --git a/spyvm/test/jit.py b/spyvm/test/jit.py
--- a/spyvm/test/jit.py
+++ b/spyvm/test/jit.py
@@ -58,7 +58,7 @@
image = create_testimage(space)
interp = interpreter.Interpreter(space, image)
- w_selector = interp.perform(space.wrap_string('loopTest'), "asSymbol")
+ w_selector = interp.perform(space.wrap_string('loopTest3'), "asSymbol")
assert isinstance(w_selector, model.W_BytesObject)
def interp_w():
interp.perform(model.W_SmallInteger(1000), w_selector)
diff --git a/spyvm/test/test_miniimage.py b/spyvm/test/test_miniimage.py
--- a/spyvm/test/test_miniimage.py
+++ b/spyvm/test/test_miniimage.py
@@ -47,9 +47,9 @@
def test_read_header():
reader = open_miniimage(space)
reader.read_header()
- assert reader.endofmemory == 0x93174
- assert reader.oldbaseaddress == 0x6649000
- assert reader.specialobjectspointer == 0x6668380
+ assert reader.endofmemory == 655196
+ assert reader.oldbaseaddress == -1220960256
+ assert reader.specialobjectspointer == -1220832384
def test_read_all_header():
reader = open_miniimage(space)
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
@@ -207,3 +207,13 @@
shadow = w_compiledmethod.as_compiledmethod_get_shadow(space)
assert shadow.bytecode == "abx"
+
+def test_cached_object_shadow():
+ w_o = space.wrap_list([0, 1, 2, 3, 4, 5, 6, 7])
+ s_o = w_o.as_cached_object_get_shadow(space)
+ version = s_o.version
+ for i in range(w_o.size()):
+ assert w_o.at0(space, i) == i
+ w_o.atput0(space, 0, 8)
+ assert version is not s_o.version
+ assert w_o.at0(space, 0) == 8
\ No newline at end of file
diff --git a/spyvm/todo.txt b/spyvm/todo.txt
--- a/spyvm/todo.txt
+++ b/spyvm/todo.txt
@@ -44,3 +44,18 @@
Shadows:
[ ] Fix invalidation of methoddictshadow when the w_self of its values array
changes
+
+Optimizations:
+use integer tagging primitives to get more compact code:
+ def wrap_int(self, val):
+ from rpython.rlib import rerased
+ try:
+ return model.W_SmallInteger(rerased.erase_int(val))
+ except OverflowError:
+ raise WrappingError("integer too large to fit into a tagged
pointer")
+
+make classes
+
+
+Unclarities:
+[ ] should image loading invalidate the shadows of the precreated objects?
\ No newline at end of file
diff --git a/targetimageloadingsmalltalk.py b/targetimageloadingsmalltalk.py
--- a/targetimageloadingsmalltalk.py
+++ b/targetimageloadingsmalltalk.py
@@ -1,4 +1,4 @@
-import sys
+import sys, time
import os
from rpython.rlib.streamio import open_file_as_stream
@@ -10,14 +10,17 @@
def _run_benchmark(interp, number, benchmark):
w_object = model.W_SmallInteger(number)
+ t1 = time.time()
try:
w_result = interp.perform(w_object, benchmark)
except interpreter.ReturnFromTopLevel, e:
w_result = e.object
+ t2 = time.time()
if w_result:
- assert isinstance(w_result, model.W_BytesObject)
- print '\n'
- print w_result.as_string()
+ if isinstance(w_result, model.W_BytesObject):
+ print '\n'
+ print w_result.as_string()
+ print "took %s seconds" % (t2 - t1)
return 0
return -1
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit