Author: Philip Jenvey <pjen...@underboss.org> Branch: py3k Changeset: r65010:f9806d05ed7c Date: 2013-06-26 12:53 -0700 http://bitbucket.org/pypy/pypy/changeset/f9806d05ed7c/
Log: merge default diff --git a/pypy/interpreter/error.py b/pypy/interpreter/error.py --- a/pypy/interpreter/error.py +++ b/pypy/interpreter/error.py @@ -30,12 +30,12 @@ w_cause = None def __init__(self, w_type, w_value, tb=None, w_cause=None): - assert w_type is not None self.setup(w_type, w_value) self._application_traceback = tb self.w_cause = w_cause def setup(self, w_type, w_value=None): + assert w_type is not None from pypy.objspace.std.typeobject import W_TypeObject self.w_type = w_type self._w_value = w_value @@ -395,7 +395,6 @@ self.xstrings = strings for i, _, attr in entries: setattr(self, attr, args[i]) - assert w_type is not None self.setup(w_type) def _compute_value(self, space): @@ -422,6 +421,18 @@ _fmtcache2[formats] = OpErrFmt return OpErrFmt, strings +class OpErrFmtNoArgs(OperationError): + + def __init__(self, w_type, value): + self.setup(w_type) + self._value = value + + def get_w_value(self, space): + w_value = self._w_value + if w_value is None: + self._w_value = w_value = space.wrap(self._value) + return w_value + def get_operationerr_class(valuefmt): try: result = _fmtcache[valuefmt] @@ -444,6 +455,8 @@ %T - The result of space.type(w_arg).getname(space) """ + if not len(args): + return OpErrFmtNoArgs(w_type, valuefmt) OpErrFmt, strings = get_operationerr_class(valuefmt) return OpErrFmt(w_type, strings, *args) operationerrfmt._annspecialcase_ = 'specialize:arg(1)' diff --git a/pypy/interpreter/test/test_error.py b/pypy/interpreter/test/test_error.py --- a/pypy/interpreter/test/test_error.py +++ b/pypy/interpreter/test/test_error.py @@ -37,6 +37,14 @@ operr3 = operationerrfmt("w_type2", "a %s b %s c", "bar", "4b") assert operr3.__class__ is not operr.__class__ +def test_operationerrfmt_noargs(space): + operr = operationerrfmt(space.w_AttributeError, "no attribute 'foo'") + operr.normalize_exception(space) + val = operr.get_w_value(space) + assert space.isinstance_w(val, space.w_AttributeError) + w_repr = space.repr(val) + assert space.str_w(w_repr) == "AttributeError(\"no attribute 'foo'\",)" + def test_operationerrfmt_T(space): operr = operationerrfmt(space.w_AttributeError, "'%T' object has no attribute '%s'", diff --git a/pypy/objspace/std/dictmultiobject.py b/pypy/objspace/std/dictmultiobject.py --- a/pypy/objspace/std/dictmultiobject.py +++ b/pypy/objspace/std/dictmultiobject.py @@ -191,8 +191,8 @@ space.raise_key_error(w_key) def descr_reversed(self, space): - raise OperationError(space.w_TypeError, space.wrap( - 'argument to reversed() must be a sequence')) + raise operationerrfmt(space.w_TypeError, + 'argument to reversed() must be a sequence') def descr_copy(self, space): """D.copy() -> a shallow copy of D""" diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py --- a/pypy/objspace/std/listobject.py +++ b/pypy/objspace/std/listobject.py @@ -1201,7 +1201,8 @@ def _safe_find(self, w_list, obj, start, stop): l = self.unerase(w_list.lstorage) for i in range(start, min(stop, len(l))): - if l[i] == obj: + val = l[i] + if val == obj: return i raise ValueError @@ -1521,18 +1522,6 @@ if reverse: l.reverse() - def _safe_find(self, w_list, obj, start, stop): - from rpython.rlib.rfloat import isnan - if not isnan(obj): - return AbstractUnwrappedStrategy._safe_find(self, w_list, obj, - start, stop) - # unwrapped nan != nan, finding it requires more effort - l = self.unerase(w_list.lstorage) - for i in range(start, min(stop, len(l))): - if isnan(l[i]): - return i - raise ValueError - class StringListStrategy(AbstractUnwrappedStrategy, ListStrategy): _none_value = None diff --git a/pypy/objspace/std/test/test_listobject.py b/pypy/objspace/std/test/test_listobject.py --- a/pypy/objspace/std/test/test_listobject.py +++ b/pypy/objspace/std/test/test_listobject.py @@ -1274,10 +1274,6 @@ non_list = NonList() assert [] != non_list - def test_nan_containment(self): - nan = float('nan') - assert nan in [nan] - def test_issue1266(self): l = list(range(1)) l.pop() diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -351,7 +351,8 @@ self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd) self.bool_boxes = {} self.producer = {} - self.pendingfields = [] + self.pendingfields = None # set temporarily to a list, normally by + # heap.py, as we're about to generate a guard self.quasi_immutable_deps = None self.opaque_pointers = {} self.replaces_guard = {} @@ -546,12 +547,14 @@ self.metainterp_sd.profiler.count(jitprof.Counters.OPT_OPS) if op.is_guard(): self.metainterp_sd.profiler.count(jitprof.Counters.OPT_GUARDS) + pendingfields = self.pendingfields + self.pendingfields = None if self.replaces_guard and op in self.replaces_guard: self.replace_op(self.replaces_guard[op], op) del self.replaces_guard[op] return else: - op = self.store_final_boxes_in_guard(op) + op = self.store_final_boxes_in_guard(op, pendingfields) elif op.can_raise(): self.exception_might_have_happened = True if op.result: @@ -571,12 +574,13 @@ else: assert False - def store_final_boxes_in_guard(self, op): + def store_final_boxes_in_guard(self, op, pendingfields): + assert pendingfields is not None descr = op.getdescr() assert isinstance(descr, compile.ResumeGuardDescr) modifier = resume.ResumeDataVirtualAdder(descr, self.resumedata_memo) try: - newboxes = modifier.finish(self, self.pendingfields) + newboxes = modifier.finish(self, pendingfields) if len(newboxes) > self.metainterp_sd.options.failargs_limit: raise resume.TagOverflow except resume.TagOverflow: diff --git a/rpython/jit/metainterp/optimizeopt/simplify.py b/rpython/jit/metainterp/optimizeopt/simplify.py --- a/rpython/jit/metainterp/optimizeopt/simplify.py +++ b/rpython/jit/metainterp/optimizeopt/simplify.py @@ -7,7 +7,13 @@ def __init__(self, unroll): self.last_label_descr = None self.unroll = unroll - + + def emit_operation(self, op): + if op.is_guard(): + if self.optimizer.pendingfields is None: + self.optimizer.pendingfields = [] + Optimization.emit_operation(self, op) + def optimize_CALL_PURE(self, op): args = op.getarglist() self.emit_operation(ResOperation(rop.CALL, args, op.result, diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py @@ -27,7 +27,7 @@ snapshot0 = resume.Snapshot(None, [b0]) fdescr.rd_snapshot = resume.Snapshot(snapshot0, [b1]) # - opt.store_final_boxes_in_guard(op) + opt.store_final_boxes_in_guard(op, []) if op.getfailargs() == [b0, b1]: assert list(fdescr.rd_numb.nums) == [tag(1, TAGBOX)] assert list(fdescr.rd_numb.prev.nums) == [tag(0, TAGBOX)] _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit