[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