[pypy-commit] lang-smalltalk storage: Fixed bug in CompiledMethod: literals were set to nil when the header was changed. Caused incorrectly compiled code.

anton_gulenko noreply at buildbot.pypy.org
Fri Jul 18 14:08:36 CEST 2014


Author: Anton Gulenko <anton.gulenko at googlemail.com>
Branch: storage
Changeset: r909:c063fbae6f06
Date: 2014-07-14 18:39 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/c063fbae6f06/

Log:	Fixed bug in CompiledMethod: literals were set to nil when the
	header was changed. Caused incorrectly compiled code.

diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -1154,7 +1154,7 @@
 
     def compute_pos(self, n):
         return n * (NATIVE_DEPTH / self._depth)
-
+        
 # XXX Shouldn't compiledmethod have class reference for subclassed compiled
 # methods?
 class W_CompiledMethod(W_AbstractObjectWithIdentityHash):
@@ -1185,20 +1185,22 @@
     
     def __init__(self, space, bytecount=0, header=0):
         self.bytes = ["\x00"] * bytecount
-        self.setheader(space, header)
+        self.setheader(space, header, initializing=True)
 
     def fillin(self, space, g_self):
         # Implicitely sets the header, including self.literalsize
         for i, w_object in enumerate(g_self.get_pointers()):
-            self.literalatput0(space, i, w_object)
+            self.literalatput0(space, i, w_object, initializing=True)
         self.setbytes(g_self.get_bytes()[self.bytecodeoffset():])
 
     # === Setters ===
     
-    def setheader(self, space, header):
+    def setheader(self, space, header, initializing=False):
         _primitive, literalsize, islarge, tempsize, argsize = constants.decode_compiled_method_header(header)
-        self.literalsize = literalsize
-        self.literals = [space.w_nil] * self.literalsize
+        if initializing or self.literalsize != literalsize:
+            # Keep the literals if possible.
+            self.literalsize = literalsize
+            self.literals = [space.w_nil] * self.literalsize
         self.header = header
         self.argsize = argsize
         self._tempsize = tempsize
@@ -1314,11 +1316,11 @@
             return space.wrap_int(self.getheader())
         else:
             return self.getliteral(index0 - 1)
-
-    def literalatput0(self, space, index0, w_value):
+            
+    def literalatput0(self, space, index0, w_value, initializing=False):
         if index0 == 0:
             header = space.unwrap_int(w_value)
-            self.setheader(space, header)
+            self.setheader(space, header, initializing=initializing)
         else:
             self.setliteral(index0 - 1, w_value)
 


More information about the pypy-commit mailing list