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