Author: fijal Branch: Changeset: r83487:325494587c00 Date: 2016-04-01 12:04 +0200 http://bitbucket.org/pypy/pypy/changeset/325494587c00/
Log: merge diff --git a/pypy/module/__pypy__/interp_magic.py b/pypy/module/__pypy__/interp_magic.py --- a/pypy/module/__pypy__/interp_magic.py +++ b/pypy/module/__pypy__/interp_magic.py @@ -172,7 +172,7 @@ def _promote(space, w_obj): """ Promote the first argument of the function and return it. Promote is by value for ints, floats, strs, unicodes (but not subclasses thereof) and by - reference otherwise. + reference otherwise. (Unicodes not supported right now.) This function is experimental!""" from rpython.rlib import jit @@ -181,7 +181,7 @@ elif space.is_w(space.type(w_obj), space.w_float): jit.promote(space.float_w(w_obj)) elif space.is_w(space.type(w_obj), space.w_str): - jit.promote_string(space.unicode_w(w_obj)) + jit.promote_string(space.str_w(w_obj)) elif space.is_w(space.type(w_obj), space.w_unicode): raise OperationError(space.w_TypeError, space.wrap( "promoting unicode unsupported")) diff --git a/pypy/module/operator/app_operator.py b/pypy/module/operator/app_operator.py --- a/pypy/module/operator/app_operator.py +++ b/pypy/module/operator/app_operator.py @@ -79,54 +79,45 @@ else: return _resolve_attr_chain(chain, obj, idx + 1) - -class _simple_attrgetter(object): - def __init__(self, attr): - self._attr = attr +class attrgetter(object): + def __init__(self, attr, *attrs): + if ( + not isinstance(attr, basestring) or + not all(isinstance(a, basestring) for a in attrs) + ): + def _raise_typeerror(obj): + raise TypeError( + "argument must be a string, not %r" % type(attr).__name__ + ) + self._call = _raise_typeerror + elif attrs: + self._multi_attrs = [ + a.split(".") for a in [attr] + list(attrs) + ] + self._call = self._multi_attrgetter + elif "." not in attr: + self._simple_attr = attr + self._call = self._simple_attrgetter + else: + self._single_attr = attr.split(".") + self._call = self._single_attrgetter def __call__(self, obj): - return getattr(obj, self._attr) + return self._call(obj) + def _simple_attrgetter(self, obj): + return getattr(obj, self._simple_attr) -class _single_attrgetter(object): - def __init__(self, attrs): - self._attrs = attrs + def _single_attrgetter(self, obj): + return _resolve_attr_chain(self._single_attr, obj) - def __call__(self, obj): - return _resolve_attr_chain(self._attrs, obj) - - -class _multi_attrgetter(object): - def __init__(self, attrs): - self._attrs = attrs - - def __call__(self, obj): + def _multi_attrgetter(self, obj): return tuple([ _resolve_attr_chain(attrs, obj) - for attrs in self._attrs + for attrs in self._multi_attrs ]) -def attrgetter(attr, *attrs): - if ( - not isinstance(attr, basestring) or - not all(isinstance(a, basestring) for a in attrs) - ): - def _raise_typeerror(obj): - raise TypeError( - "argument must be a string, not %r" % type(attr).__name__ - ) - return _raise_typeerror - if attrs: - return _multi_attrgetter([ - a.split(".") for a in [attr] + list(attrs) - ]) - elif "." not in attr: - return _simple_attrgetter(attr) - else: - return _single_attrgetter(attr.split(".")) - - class itemgetter(object): def __init__(self, item, *items): self._single = not bool(items) diff --git a/pypy/module/operator/test/test_operator.py b/pypy/module/operator/test/test_operator.py --- a/pypy/module/operator/test/test_operator.py +++ b/pypy/module/operator/test/test_operator.py @@ -47,7 +47,13 @@ a.name = "hello" a.child = A() a.child.name = "world" + a.child.foo = "bar" assert attrgetter("child.name")(a) == "world" + assert attrgetter("child.name", "child.foo")(a) == ("world", "bar") + + def test_attrgetter_type(self): + from operator import attrgetter + assert type(attrgetter("child.name")) is attrgetter def test_concat(self): class Seq1: diff --git a/rpython/jit/metainterp/opencoder.py b/rpython/jit/metainterp/opencoder.py --- a/rpython/jit/metainterp/opencoder.py +++ b/rpython/jit/metainterp/opencoder.py @@ -279,7 +279,6 @@ self._bigints = [] self._bigints_dict = {} self._floats = [] - self._floats_dict = {} self._snapshots = [] for i, inparg in enumerate(inputargs): inparg.set_position(i) @@ -305,7 +304,6 @@ self._bigints_dict = {} self._refs_dict = llhelper.new_ref_dict_3() - self._floats_dict = {} debug_start("jit-trace-done") debug_print("trace length: " + str(self._pos)) debug_print(" total snapshots: " + str(self._total_snapshots)) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit