[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