[pypy-commit] lang-smalltalk storage: Printing better information in case of a doesNotUnderstand:

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


Author: Anton Gulenko <anton.gulenko at googlemail.com>
Branch: storage
Changeset: r903:b73849087f13
Date: 2014-07-13 16:42 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/b73849087f13/

Log:	Printing better information in case of a doesNotUnderstand:

diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -821,9 +821,10 @@
 
     def as_string(self):
         if self.bytes is not None:
-            return "".join(self.bytes)
+            string = "".join(self.bytes)
         else:
-            return "".join([self.c_bytes[i] for i in range(self.size())])
+            string = "".join([self.c_bytes[i] for i in range(self.size())])
+        return string.replace('\r', '\n')
 
     def invariant(self):
         if not W_AbstractObjectWithClassReference.invariant(self):
diff --git a/spyvm/objspace.py b/spyvm/objspace.py
--- a/spyvm/objspace.py
+++ b/spyvm/objspace.py
@@ -33,6 +33,7 @@
         self.no_specialized_storage = ConstantFlag()
         # This is a hack; see compile_code() in targetimageloadingsmalltalk.py
         self.suppress_process_switch = ConstantFlag()
+        self.headless = ConstantFlag()
         
         self.classtable = {}
         self.objtable = {}
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -2,10 +2,8 @@
 import inspect
 import math
 import operator
-from spyvm import model, shadow
-from spyvm import constants, display
-from spyvm.error import PrimitiveFailedError, \
-    PrimitiveNotYetWrittenError
+from spyvm import model, shadow, error, constants, display
+from spyvm.error import PrimitiveFailedError, PrimitiveNotYetWrittenError
 from spyvm import wrapper
 
 from rpython.rlib import rarithmetic, rfloat, unroll, jit
@@ -374,14 +372,26 @@
 
 @expose_primitive(FAIL)
 def func(interp, s_frame, argcount):
-    if s_frame.w_method().lookup_selector == 'doesNotUnderstand:':
-        print ''
-        print s_frame.print_stack()
-        w_message = s_frame.peek(0)
-        print ("%s" % w_message).replace('\r', '\n')
-        print ("%s" % s_frame.peek(1)).replace('\r', '\n')
-        if isinstance(w_message, model.W_PointersObject):
-            print ('%s' % w_message.fetch_all(s_frame.space)).replace('\r', '\n')
+    if interp.space.headless.is_set() and s_frame.w_method().lookup_selector == 'doesNotUnderstand:':
+        w_msg = s_frame.peek(1)
+        if isinstance(w_msg, model.W_BytesObject):
+            print "== Error message: %s" % w_msg.as_string()
+        print "== VM Stack:%s" % s_frame.print_stack()
+        print "== Message:"
+        for w_argument in s_frame.w_arguments():
+            print w_argument.as_repr_string()
+            if isinstance(w_argument, model.W_PointersObject):
+                fields = w_argument.fetch_all(interp.space)
+                for i, w_field in enumerate(fields):
+                    print "\t%s" % w_field.as_repr_string()
+                    if i == 1 and isinstance(w_field, model.W_PointersObject):
+                        # These are the arguments to the not-undersood message
+                        for w_field_field in w_field.fetch_all(interp.space):
+                            print "\t\t%s" % w_field_field.as_repr_string()
+        w_stack = s_frame.peek(0)
+        if isinstance(w_stack, model.W_BytesObject):
+            print "== Squeak stack:\n%s" % w_stack.as_string()
+        raise error.Exit("Unhandled doesNotUnderstand:")
     raise PrimitiveFailedError()
 
 # ___________________________________________________________________________
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -929,6 +929,9 @@
     # ______________________________________________________________________
     # Printing
 
+    def argument_strings(self):
+        return [ w_arg.as_repr_string() for w_arg in self.w_arguments() ]
+    
     def __str__(self):
         retval = self.short_str()
         retval += "\n%s" % self.w_method().bytecode_string(markBytecode=self.pc() + 1)
@@ -1099,7 +1102,7 @@
 
     # === Printing ===
 
-    def argument_strings(self):
+    def w_arguments(self):
         return []
 
     def method_str(self):
@@ -1255,13 +1258,9 @@
 
     # === Printing ===
 
-    def argument_strings(self):
+    def w_arguments(self):
         argcount = self.w_method().argsize
-        tempsize = self.w_method().tempsize()
-        args = []
-        for i in range(argcount):
-            args.append(self.peek(tempsize - i - 1).as_repr_string())
-        return args
+        return [ self.stack_get(i) for i in range(argcount) ]
 
     def method_str(self):
         block = '[] in ' if self.is_closure_context() else ''
diff --git a/targetimageloadingsmalltalk.py b/targetimageloadingsmalltalk.py
--- a/targetimageloadingsmalltalk.py
+++ b/targetimageloadingsmalltalk.py
@@ -165,6 +165,7 @@
                 return -1 # Compilation failed, message is printed.
         s_frame = create_context(interp, w_receiver, selector, stringarg)
         if headless:
+            space.headless.set()
             context = s_frame
         else:
             create_process(interp, s_frame)


More information about the pypy-commit mailing list