Author: Tim Felgentreff <timfelgentr...@gmail.com> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit