Author: Armin Rigo <ar...@tunes.org>
Branch: stm-gc
Changeset: r54809:2906eb0e0980
Date: 2012-04-29 14:41 +0200
http://bitbucket.org/pypy/pypy/changeset/2906eb0e0980/

Log:    Re-enable the methodcache optimization. Found another trick that
        should be "kind of good enough for now".

diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py
--- a/pypy/config/pypyoption.py
+++ b/pypy/config/pypyoption.py
@@ -366,8 +366,7 @@
     if level in ['2', '3', 'jit']:
         config.objspace.opcodes.suggest(CALL_METHOD=True)
         config.objspace.std.suggest(withrangelist=True)
-        if not config.translation.stm:   # XXX temporary
-            config.objspace.std.suggest(withmethodcache=True)
+        config.objspace.std.suggest(withmethodcache=True)
         config.objspace.std.suggest(withprebuiltchar=True)
         config.objspace.std.suggest(builtinshortcut=True)
         config.objspace.std.suggest(optimized_list_getitem=True)
diff --git a/pypy/module/transaction/interp_transaction.py 
b/pypy/module/transaction/interp_transaction.py
--- a/pypy/module/transaction/interp_transaction.py
+++ b/pypy/module/transaction/interp_transaction.py
@@ -127,8 +127,17 @@
         ec = self.space.getexecutioncontext()    # create it if needed
         assert len(ec._transaction_pending) == 0
         #
+        if self.space.config.translation.stm:
+            from pypy.objspace.std.typeobject import MethodCache
+            ec._methodcache = MethodCache(self.space)
+        #
         self.space.call_args(self.w_callback, self.args)
         #
+        if self.space.config.translation.stm:
+            # remove the method cache again now, to prevent it from being
+            # promoted to a GLOBAL
+            ec._methodcache = None
+        #
         result = ec._transaction_pending
         ec._transaction_pending = []
         return result
diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py
--- a/pypy/objspace/std/typeobject.py
+++ b/pypy/objspace/std/typeobject.py
@@ -409,6 +409,9 @@
         if space.config.translation.stm:
             # with stm, it's important to use one method cache per thread;
             # otherwise, we get all the time spurious transaction conflicts.
+            # For now we have one per transaction: the following field is
+            # set when we start a transaction, and cleared just before
+            # committing.
             cache = space.getexecutioncontext()._methodcache
         else:
             cache = space.fromcache(MethodCache)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to