[pypy-commit] lang-smalltalk storage: pull checking for BlockContext>>ensure: primitive into the shadows

timfel noreply at buildbot.pypy.org
Thu Jul 10 16:58:32 CEST 2014


Author: Tim Felgentreff <timfelgentreff at gmail.com>
Branch: storage
Changeset: r890:6998efebafd6
Date: 2014-07-10 16:58 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/6998efebafd6/

Log:	pull checking for BlockContext>>ensure: primitive into the shadows

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -748,9 +748,7 @@
     # ====== Misc ======
 
     def _activate_unwind_context(self, interp):
-        # TODO put the constant somewhere else.
-        # Primitive 198 is used in BlockClosure >> ensure:
-        if self.is_closure_context() or self.w_method().primitive() != 198:
+        if self.is_closure_context() or not self.is_BlockClosure_ensure():
             self.mark_returned()
             return
         # The first temp is executed flag for both #ensure: and #ifCurtailed:
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -777,6 +777,9 @@
     def is_closure_context(self):
         raise NotImplementedError()
 
+    def is_BlockClosure_ensure(self):
+        raise NotImplementedError()
+
     def home_is_self(self):
         raise NotImplementedError()
 
@@ -998,6 +1001,9 @@
     def is_closure_context(self):
         return True
 
+    def is_BlockClosure_ensure(self):
+        return False
+
     def home_is_self(self):
         return False
 
@@ -1080,7 +1086,7 @@
         return '[] in %s' % self.w_method().get_identifier_string()
 
 class MethodContextShadow(ContextPartShadow):
-    _attrs_ = ['closure', '_w_receiver', '_w_method']
+    _attrs_ = ['closure', '_w_receiver', '_w_method', '_is_BlockClosure_ensure']
     repr_classname = "MethodContextShadow"
 
     # === Initialization ===
@@ -1102,6 +1108,7 @@
             self.init_stack_and_temps()
         else:
             self._w_method = None
+            self._is_BlockClosure_ensure = False
 
         argc = len(arguments)
         for i0 in range(argc):
@@ -1174,6 +1181,9 @@
     def store_w_method(self, w_method):
         assert isinstance(w_method, model.W_CompiledMethod)
         self._w_method = w_method
+        if w_method:
+            # Primitive 198 is used in BlockClosure >> ensure:
+            self._is_BlockClosure_ensure = (w_method.primitive() == 198)
 
     def w_receiver(self):
         return self._w_receiver
@@ -1192,6 +1202,9 @@
     def is_closure_context(self):
         return self.closure is not None
 
+    def is_BlockClosure_ensure(self):
+        return self._is_BlockClosure_ensure
+
     def home_is_self(self):
         return not self.is_closure_context()
 
diff --git a/spyvm/test/jittest/base.py b/spyvm/test/jittest/base.py
--- a/spyvm/test/jittest/base.py
+++ b/spyvm/test/jittest/base.py
@@ -18,7 +18,7 @@
     def run(self, spy, tmpdir, code):
         logfile = str(tmpdir.join("x.pypylog"))
         proc = subprocess.Popen(
-            [str(spy), "-r", code.replace("\n", "\r\n"), BenchmarkImage],
+            [str(spy), BenchmarkImage, "-r", code.replace("\n", "\r\n")],
             cwd=str(tmpdir),
             env={"PYPYLOG": "jit-log-opt:%s" % logfile,
                  "SDL_VIDEODRIVER": "dummy"}


More information about the pypy-commit mailing list