[pypy-commit] lang-smalltalk default: selectors may not be ByteSymbols

timfel noreply at buildbot.pypy.org
Fri Dec 6 17:23:16 CET 2013


Author: Tim Felgentreff <timfelgentreff at gmail.com>
Branch: 
Changeset: r520:7c9cb17fa6e9
Date: 2013-12-06 12:31 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/7c9cb17fa6e9/

Log:	selectors may not be ByteSymbols

diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -341,7 +341,7 @@
         assert isinstance(w_selector, model.W_BytesObject)
         if interp.should_trace():
             print "%sSending selector %r to %r with: %r" % (
-                interp._last_indent, w_selector.as_string(), receiver,
+                interp._last_indent, w_selector.as_repr_string(), receiver,
                 [self.peek(argcount-1-i) for i in range(argcount)])
         assert argcount >= 0
 
@@ -385,7 +385,7 @@
 
         # ######################################################################
         if interp.trace:
-            print '%s%s missing: #%s' % (interp.padding('#'), s_frame.short_str(), w_selector.as_string())
+            print '%s%s missing: #%s' % (interp.padding('#'), s_frame.short_str(), w_selector.as_repr_string())
             if not objectmodel.we_are_translated():
                 import pdb; pdb.set_trace()
 
@@ -400,7 +400,7 @@
         if interp.trace:
             print "%s-> primitive %d \t(in #%s, named #%s)" % (
                 ' ' * (interp.max_stack_depth - interp.remaining_stack_depth),
-                    code, self.w_method()._likely_methodname, w_selector.as_string())
+                    code, self.w_method()._likely_methodname, w_selector.as_repr_string())
         try:
             # note: argcount does not include rcvr
             return func(interp, self, argcount, s_method)
@@ -410,7 +410,7 @@
                 ' ' * (interp.max_stack_depth - interp.remaining_stack_depth),)
 
             if interp.should_trace(True):
-                print "PRIMITIVE FAILED: %d %s" % (s_method.primitive, w_selector.as_string(),)
+                print "PRIMITIVE FAILED: %d %s" % (s_method.primitive, w_selector.as_repr_string())
             raise e
 
 
@@ -878,19 +878,19 @@
                       receiver, receiverclassshadow):
             options = [False]
             def next(): interp.message_stepping = True; print 'Now continue (c).'
-            def over(): options[0] = True; print  'Skipping #%s. You still need to continue(c).' % w_selector.as_string()
+            def over(): options[0] = True; print  'Skipping #%s. You still need to continue(c).' % w_selector.as_repr_string()
             def pstack(): print s_context.print_stack()
             if interp.message_stepping:
                 if argcount == 0:
                     print "-> %s %s" % (receiver.as_repr_string(),
-                            w_selector.as_string())
+                            w_selector.as_repr_string())
                 elif argcount == 1:
                     print "-> %s %s %s" % (receiver.as_repr_string(),
-                            w_selector.as_string(),
+                            w_selector.as_repr_string(),
                             s_context.peek(0).as_repr_string())
                 else:
                     print "-> %s %s %r" % (receiver.as_repr_string(),
-                            w_selector.as_string(),
+                            w_selector.as_repr_string(),
                             [s_context.peek(argcount-1-i) for i in range(argcount)])
                 import pdb; pdb.set_trace()
             if options[0]:
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -823,6 +823,7 @@
 EXIT_TO_DEBUGGER = 114
 CHANGE_CLASS = 115      # Blue Book: primitiveOopsLeft
 EXTERNAL_CALL = 117
+SYMBOL_FLUSH_CACHE = 119
 
 @expose_primitive(EQUIVALENT, unwrap_spec=[object, object])
 def func(interp, s_frame, w_arg, w_rcvr):
@@ -905,6 +906,10 @@
         return IProxy.call(signature, interp, s_frame, argcount, s_method)
     raise PrimitiveFailedError
 
+ at expose_primitive(SYMBOL_FLUSH_CACHE, unwrap_spec=[object])
+def func(interp, s_frame, w_rcvr):
+    raise PrimitiveFailedError()
+
 # ___________________________________________________________________________
 # Miscellaneous Primitives (120-127)
 CALLOUT_TO_FFI = 120
@@ -1321,8 +1326,6 @@
     argcount = len(args_w)
     s_frame.pop_n(2) # removing our arguments
 
-    assert isinstance(w_selector, model.W_BytesObject)
-
     try:
         s_method = w_rcvr.shadow_of_my_class(interp.space).lookup(w_selector)
     except MethodNotFound:
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -354,6 +354,8 @@
         AbstractShadow.__init__(self, space, w_self)
 
     def find_selector(self, w_selector):
+        if self.invalid:
+            self.sync_cache()
         assert not self.invalid
         return self.methoddict.get(w_selector, None)
 
@@ -382,7 +384,11 @@
             w_selector = self.w_self()._fetch(constants.METHODDICT_NAMES_INDEX+i)
             if not w_selector.is_same_object(self.space.w_nil):
                 if not isinstance(w_selector, model.W_BytesObject):
-                    raise ClassShadowError("bogus selector in method dict")
+                    pass
+                    # TODO: Check if there's more assumptions about this.
+                    #       Putting any key in the methodDict and running with
+                    #       perform is actually supported in Squeak
+                    # raise ClassShadowError("bogus selector in method dict")
                 w_compiledmethod = w_values._fetch(i)
                 if not isinstance(w_compiledmethod, model.W_CompiledMethod):
                     raise ClassShadowError("The methoddict must contain "
@@ -390,7 +396,10 @@
                                        "If the value observed is nil, our "
                                        "invalidating mechanism may be broken.")
                 self.methoddict[w_selector] = w_compiledmethod.as_compiledmethod_get_shadow(self.space)
-                selector = w_selector.as_string()
+                if isinstance(w_selector, model.W_BytesObject):
+                    selector = w_selector.as_string()
+                else:
+                    selector = w_selector.as_repr_string()
                 w_compiledmethod._likely_methodname = selector
         if self.s_class:
             self.s_class.changed()
diff --git a/spyvm/tool/analyseimage.py b/spyvm/tool/analyseimage.py
--- a/spyvm/tool/analyseimage.py
+++ b/spyvm/tool/analyseimage.py
@@ -9,6 +9,7 @@
 
 mini_image = image_dir.join('mini.image')
 minitest_image = image_dir.join('minitest.image')
+s45_image = image_dir.join('Squeak4.5-12568.image')
 
 def get_miniimage(space):
     return squeakimage.reader_for_image(space, squeakimage.Stream(mini_image.open(mode="rb")))
@@ -16,6 +17,9 @@
 def get_minitestimage(space):
     return squeakimage.reader_for_image(space, squeakimage.Stream(minitest_image.open(mode="rb")))
 
+def get_45image(space):
+    return squeakimage.reader_for_image(space, squeakimage.Stream(s45_image.open(mode="rb")))
+
 def create_image(space, image_reader):
     image_reader.initialize()
 
@@ -23,13 +27,14 @@
     image.from_reader(space, image_reader)
     return image
 
-
 def create_squeakimage(space):
     return create_image(space, get_miniimage(space))
 
 def create_testimage(space):
     return create_image(space, get_minitestimage(space))
 
+def create_45image(space):
+    return create_image(space, get_45image(space))
 
 def printStringsInImage():
     image = create_squeakimage()


More information about the pypy-commit mailing list