[pypy-commit] lang-smalltalk default: created a caching shadow specialy for arrays which seldom change, like the special messages array

lwassermann noreply at buildbot.pypy.org
Fri Mar 8 17:15:03 CET 2013


Author: Lars Wassermann <lars.wassermann at gmail.com>
Branch: 
Changeset: r152:ec80277220dc
Date: 2013-03-08 15:35 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/ec80277220dc/

Log:	created a caching shadow specialy for arrays which seldom change,
	like the special messages array

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
 
@@ -149,7 +150,7 @@
                      'at:put:', 'size', 'next', 'nextPut:', 'atEnd', '==',
                      'class', 'blockCopy:', 'value', 'value:', 'do:', 'new',
                      'new:', 'x', 'y']
-
+ at elidable
 def find_selectorindex(selector):
     return SPECIAL_SELECTORS.index(selector) * 2
 find_selectorindex._annspecialcase_ = "specialize:memo"
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_array_get_shadow(self, space):
+        from spyvm.shadow import CachedArrayShadow
+        return self.as_special_get_shadow(space, CachedArrayShadow)
+
     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
@@ -149,6 +149,7 @@
         self.w_two = model.W_SmallInteger(2)
         w_special_selectors = model.W_PointersObject(
             self.classtable['w_Array'], len(constants.SPECIAL_SELECTORS) * 2)
+        w_special_selectors.as_cached_array_get_shadow(self)
         self.w_special_selectors = w_special_selectors
 
         self.objtable = {}
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -892,3 +892,28 @@
         s_new = MethodContextShadow.make_context(
                 space, self, receiver, arguments, sender)
         return s_new
+
+class CachedArrayShadow(AbstractCachingShadow):
+    _attr_ = ['version']
+
+    def __init__(self, space, w_self):
+        AbstractCachingShadow.__init__(self, space, w_self)
+        self.version = 0
+
+    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 = self.version + 1
+        return self._w_self._store(n0, w_value)
+
+    def update_shadow(self):
+        self.version = self.version + 1
\ No newline at end of file
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/todo.txt b/spyvm/todo.txt
--- a/spyvm/todo.txt
+++ b/spyvm/todo.txt
@@ -44,3 +44,14 @@
 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
\ No newline at end of file


More information about the pypy-commit mailing list