[pypy-commit] lang-smalltalk default: method extraction refactoring for does not understand case in _sendSelector
lwassermann
noreply at buildbot.pypy.org
Thu Mar 21 16:12:27 CET 2013
Author: Lars Wassermann <lars.wassermann at gmail.com>
Branch:
Changeset: r228:7e8d4241566a
Date: 2013-03-21 16:07 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/7e8d4241566a/
Log: method extraction refactoring for does not understand case in
_sendSelector
diff --git a/spyvm/interpreter.py b/spyvm/interpreter.py
--- a/spyvm/interpreter.py
+++ b/spyvm/interpreter.py
@@ -33,7 +33,8 @@
get_printable_location=get_printable_location
)
- def __init__(self, space, image=None, image_name="", max_stack_depth=100):
+ def __init__(self, space, image=None, image_name="",
+ max_stack_depth=constants.MAX_LOOP_DEPTH):
self.space = space
self.image = image
self.image_name = image_name
@@ -118,7 +119,8 @@
if selector == "asSymbol":
w_selector = self.image.w_asSymbol
else:
- w_selector = self.perform(self.space.wrap_string(selector), "asSymbol")
+ w_selector = self.perform(self.space.wrap_string(selector),
+ "asSymbol")
else:
w_selector = selector
@@ -281,22 +283,11 @@
interp._last_indent, w_selector.as_string(), receiver,
[self.peek(argcount-1-i) for i in range(argcount)])
assert argcount >= 0
+
try:
s_method = receiverclassshadow.lookup(w_selector)
except MethodNotFound:
- arguments = self.pop_and_return_n(argcount)
- s_message_class = self.space.classtable["w_Message"].as_class_get_shadow(self.space)
- w_message = s_message_class.new()
- w_message.store(self.space, 0, w_selector)
- w_message.store(self.space, 1, self.space.wrap_list(arguments))
- try:
- s_method = receiver.shadow_of_my_class(self.space).lookup(self.space.objtable["w_doesNotUnderstand"])
- except MethodNotFound:
- print "Missing doesDoesNotUnderstand in hierarchy of %s" % receiverclassshadow.getname()
- raise
- s_frame = s_method.create_frame(self.space, receiver, [w_message], self)
- self.pop()
- return interp.stack_frame(s_frame)
+ return self._doesNotUnderstand(w_selector, argcount, interp, receiver)
code = s_method.primitive()
if code:
@@ -316,6 +307,22 @@
self.pop()
return interp.stack_frame(s_frame)
+ def _doesNotUnderstand(self, w_selector, argcount, interp, receiver):
+ arguments = self.pop_and_return_n(argcount)
+ s_message_class = self.space.classtable["w_Message"].as_class_get_shadow(self.space)
+ w_message = s_message_class.new()
+ w_message.store(self.space, 0, w_selector)
+ w_message.store(self.space, 1, self.space.wrap_list(arguments))
+ s_class = receiver.shadow_of_my_class(self.space)
+ try:
+ s_method = s_class.lookup(self.space.objtable["w_doesNotUnderstand"])
+ except MethodNotFound:
+ print "Missing doesDoesNotUnderstand in hierarchy of %s" % s_class.getname()
+ raise
+ s_frame = s_method.create_frame(self.space, receiver, [w_message], self)
+ self.pop()
+ return interp.stack_frame(s_frame)
+
def _return(self, return_value, interp, s_return_to):
# for tests, when returning from the top-level context
if s_return_to is None:
More information about the pypy-commit
mailing list