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

Reply via email to