Author: Philip Jenvey <pjen...@underboss.org> Branch: remove-intlong-smm Changeset: r69240:3aff7d060076 Date: 2014-02-21 10:04 -0800 http://bitbucket.org/pypy/pypy/changeset/3aff7d060076/
Log: fix the inplace ops diff --git a/pypy/objspace/std/frame.py b/pypy/objspace/std/frame.py --- a/pypy/objspace/std/frame.py +++ b/pypy/objspace/std/frame.py @@ -1,6 +1,9 @@ """StdObjSpace custom opcode implementations""" +import operator + from rpython.rlib.rarithmetic import ovfcheck +from rpython.tool.sourcetools import func_renamer from pypy.interpreter.pyframe import PyFrame from pypy.interpreter.error import oefmt @@ -20,36 +23,41 @@ raise AssertionError -def int_BINARY_ADD(self, oparg, next_instr): - space = self.space - w_2 = self.popvalue() - w_1 = self.popvalue() - if type(w_1) is W_IntObject and type(w_2) is W_IntObject: - try: - z = ovfcheck(w_1.intval + w_2.intval) - except OverflowError: - w_result = w_1.descr_add(space, w_2) +def _intshortcut(spaceopname): + if spaceopname.startswith('inplace_'): + opname = spaceopname[len('inplace_'):] + funcprefix = 'int_' + else: + opname = spaceopname + funcprefix = 'int_BINARY_' + op = getattr(operator, opname) + int_op = getattr(W_IntObject, 'descr_' + opname) + + @func_renamer(funcprefix + spaceopname.upper()) + def opimpl(self, oparg, next_instr): + space = self.space + space_op = getattr(space, spaceopname) + + w_2 = self.popvalue() + w_1 = self.popvalue() + if type(w_1) is W_IntObject and type(w_2) is W_IntObject: + try: + z = ovfcheck(op(w_1.intval, w_2.intval)) + except OverflowError: + w_result = int_op(w_1, space, w_2) + else: + w_result = space.newint(z) else: - w_result = space.newint(z) - else: - w_result = space.add(w_1, w_2) - self.pushvalue(w_result) + w_result = space_op(w_1, w_2) + self.pushvalue(w_result) + return opimpl -def int_BINARY_SUBTRACT(self, oparg, next_instr): - space = self.space - w_2 = self.popvalue() - w_1 = self.popvalue() - if type(w_1) is W_IntObject and type(w_2) is W_IntObject: - try: - z = ovfcheck(w_1.intval - w_2.intval) - except OverflowError: - w_result = w_1.descr_sub(space, w_2) - else: - w_result = space.newint(z) - else: - w_result = space.sub(w_1, w_2) - self.pushvalue(w_result) + +int_BINARY_ADD = _intshortcut('add') +int_INPLACE_ADD = _intshortcut('inplace_add') +int_BINARY_SUBTRACT = _intshortcut('sub') +int_INPLACE_SUBTRACT = _intshortcut('inplace_sub') def list_BINARY_SUBSCR(self, oparg, next_instr): @@ -72,9 +80,9 @@ pass if space.config.objspace.std.optimized_int_add: StdObjSpaceFrame.BINARY_ADD = int_BINARY_ADD - StdObjSpaceFrame.INPLACE_ADD = int_BINARY_ADD - StdObjSpaceFrame.BINARY_SUB = int_BINARY_SUBTRACT - StdObjSpaceFrame.INPLACE_SUBTRACT = int_BINARY_SUBTRACT + StdObjSpaceFrame.INPLACE_ADD = int_INPLACE_ADD + StdObjSpaceFrame.BINARY_SUBTRACT = int_BINARY_SUBTRACT + StdObjSpaceFrame.INPLACE_SUBTRACT = int_INPLACE_SUBTRACT if space.config.objspace.std.optimized_list_getitem: StdObjSpaceFrame.BINARY_SUBSCR = list_BINARY_SUBSCR from pypy.objspace.std.callmethod import LOOKUP_METHOD, CALL_METHOD diff --git a/pypy/objspace/std/test/test_intobject.py b/pypy/objspace/std/test/test_intobject.py --- a/pypy/objspace/std/test/test_intobject.py +++ b/pypy/objspace/std/test/test_intobject.py @@ -556,3 +556,12 @@ class AppTestIntOptimizedAdd(AppTestInt): spaceconfig = {"objspace.std.optimized_int_add": True} + + def test_inplace(self): + # ensure other inplace ops still work + l = [] + l += xrange(5) + assert l == list(range(5)) + a = 8.5 + a -= .5 + assert a == 8 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit