Author: Lars Wassermann <[email protected]>
Branch: 
Changeset: r245:92053dadadea
Date: 2013-04-03 13:41 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/92053dadadea/

Log:    changed object printing capabilities in order to enable diffing on
        traces of c and python (i.e. remove addresses from trace)

diff --git a/spyvm/model.py b/spyvm/model.py
--- a/spyvm/model.py
+++ b/spyvm/model.py
@@ -114,6 +114,12 @@
         true for some W_PointersObjects"""
         return True
 
+    def __repr__(self):
+        return self.as_repr_string()
+
+    def as_repr_string(self):
+        return "%r" % self
+
 class W_SmallInteger(W_Object):
     """Boxed integer value"""
     # TODO can we tell pypy that its never larger then 31-bit?
@@ -133,7 +139,7 @@
     def invariant(self):
         return isinstance(self.value, int) and self.value < 0x8000
 
-    def __repr__(self):
+    def as_repr_string(self):
         return "W_SmallInteger(%d)" % self.value
 
     def is_same_object(self, other):
@@ -338,9 +344,6 @@
         assert self.w_class is not None
         return self.w_class
 
-    def __repr__(self):
-        return "<%s %s>" % (self.__class__.__name__, self)
-
     def __str__(self):
         if isinstance(self, W_PointersObject) and self.has_shadow():
             return self._shadow.getname()
@@ -350,6 +353,16 @@
                 name = self.w_class._shadow.name
             return "a %s" % (name or '?',)
 
+    def as_repr_string(self):
+        return self.as_embellished_string("W_O /w Class", "")
+
+    def as_embellished_string(self, className, additionalInformation):
+        from rpython.rlib.objectmodel import current_object_addr_as_int
+        name = self.shadow_of_my_class(self.space).name or "?"
+        return "<%s (a %s) %s>" % (className, name, 
+                #hex(current_object_addr_as_int(self)), 
+                additionalInformation)
+
     def invariant(self):
         return (W_AbstractObjectWithIdentityHash.invariant(self) and
                 isinstance(self.w_class, W_PointersObject))
@@ -512,6 +525,11 @@
         w_result._vars = [self.fetch(space, i) for i in range(len(self._vars))]
         return w_result
 
+    def as_repr_string(self):
+        return W_AbstractObjectWithClassReference.as_embellished_string(self, 
+                                className='W_PointersObject', 
+                                additionalInformation='len(%d)' % self.size())
+
 class W_BytesObject(W_AbstractObjectWithClassReference):
     _attrs_ = ['bytes']
 
@@ -544,8 +562,9 @@
     def __str__(self):
         return self.as_string()
 
-    def __repr__(self):
-        return "<W_BytesObject %r>" % (self.as_string(),)
+    def as_repr_string(self):
+        return W_AbstractObjectWithClassReference.as_embellished_string(self, 
+            className='W_BytesObject', additionalInformation=self.as_string())
 
     def as_string(self):
         return "".join(self.bytes)
@@ -745,6 +764,9 @@
     def __str__(self):
         return self.as_string()
 
+    def as_repr_string(self):
+        return "<CompiledMethod %s>" % self.get_identifier_string()
+
     def as_string(self, markBytecode=0):
         from spyvm.interpreter import BYTECODE_TABLE
         j = 1
@@ -763,7 +785,7 @@
             w_candidate = self.literals[-1]
             if isinstance(w_candidate, W_PointersObject):
                 c_shadow = w_candidate._shadow
-                if c_shadow is None:
+                if c_shadow is None and w_candidate.size() >= 2:
                     w_class = w_candidate._fetch(1)
                     if isinstance(w_class, W_PointersObject):
                         d_shadow = w_class._shadow
diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -3,8 +3,7 @@
 import math
 import operator
 from spyvm import model, shadow
-from spyvm import constants
-from spyvm import display
+from spyvm import constants, display
 from spyvm.error import PrimitiveFailedError, \
     PrimitiveNotYetWrittenError
 from spyvm import wrapper
@@ -183,7 +182,6 @@
     def make_func(op):
         @expose_primitive(code, unwrap_spec=[pos_32bit_int, pos_32bit_int])
         def func(interp, s_frame, receiver, argument):
-            from spyvm.model import W_LargePositiveInteger1Word
             res = op(receiver, argument)
             return interp.space.wrap_positive_32bit_int(res)
     make_func(op)
@@ -570,6 +568,7 @@
 
 @expose_primitive(BITBLT_COPY_BITS, unwrap_spec=[object], clean_stack=False)
 def func(interp, s_frame, w_rcvr):
+    from spyvm.interpreter import Return
     if not isinstance(w_rcvr, model.W_PointersObject) or w_rcvr.size() < 15:
         raise PrimitiveFailedError
 
@@ -868,6 +867,7 @@
 def func(interp, s_frame, w_arg):
     import time
     sec_since_epoch = rarithmetic.r_uint(time.time())
+    # XXX: overflow check necessary?
     sec_since_1901 = sec_since_epoch + secs_between_1901_and_1970
     return interp.space.wrap_uint(sec_since_1901)
 
diff --git a/spyvm/shadow.py b/spyvm/shadow.py
--- a/spyvm/shadow.py
+++ b/spyvm/shadow.py
@@ -800,7 +800,7 @@
     def short_str(self):
         return 'BlockContext of %s (%s) [%d]' % (
             self.w_method().get_identifier_string(),
-            self.w_receiver(),
+            self.w_receiver().as_repr_string(),
             self.pc() + 1
         )
 
@@ -947,11 +947,11 @@
         return retval
 
     def short_str(self):
-        block = '[] of' if self.is_closure_context() else ''
-        return '%s %s (rcvr: %s) [pc: %d]' % (
+        block = '[] of ' if self.is_closure_context() else ''
+        return '%s%s (rcvr: %s) [pc: %d]' % (
             block,
             self.w_method().get_identifier_string(),
-            self.w_receiver(),
+            self.w_receiver().as_repr_string(),
             self.pc() + 1
         )
 
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to