From 9c95473dc9b35189ed24fe024127d950e02bb551 Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Wed, 5 Aug 2020 03:51:50 +0800 Subject: [PATCH 01/10] binary operations 1 --- mypyc/primitives/generic_ops.py | 12 ++++++------ mypyc/test-data/exceptions.test | 2 +- mypyc/test-data/irbuild-any.test | 4 ++-- mypyc/test-data/irbuild-basic.test | 6 +++--- mypyc/test-data/irbuild-nested.test | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/mypyc/primitives/generic_ops.py b/mypyc/primitives/generic_ops.py index e5d3e93bcab1..c37d8a84eeb5 100644 --- a/mypyc/primitives/generic_ops.py +++ b/mypyc/primitives/generic_ops.py @@ -46,12 +46,12 @@ ('&', 'PyNumber_And'), ('^', 'PyNumber_Xor'), ('|', 'PyNumber_Or')]: - binary_op(op=op, - arg_types=[object_rprimitive, object_rprimitive], - result_type=object_rprimitive, - error_kind=ERR_MAGIC, - emit=call_emit(funcname), - priority=0) + c_binary_op(name=op, + arg_types=[object_rprimitive, object_rprimitive], + return_type=object_rprimitive, + c_function_name=funcname, + error_kind=ERR_MAGIC, + priority=0) for op, funcname in [('+=', 'PyNumber_InPlaceAdd'), ('-=', 'PyNumber_InPlaceSubtract'), diff --git a/mypyc/test-data/exceptions.test b/mypyc/test-data/exceptions.test index 4b39cb2978b2..acd5731bfb26 100644 --- a/mypyc/test-data/exceptions.test +++ b/mypyc/test-data/exceptions.test @@ -441,7 +441,7 @@ L10: L11: unreachable L12: - r6 = a + b + r6 = PyNumber_Add(a, b) xdec_ref a xdec_ref b if is_error(r6) goto L14 (error at lol:9) else goto L13 diff --git a/mypyc/test-data/irbuild-any.test b/mypyc/test-data/irbuild-any.test index ff5fe9272ad5..528f295e94cd 100644 --- a/mypyc/test-data/irbuild-any.test +++ b/mypyc/test-data/irbuild-any.test @@ -91,9 +91,9 @@ def f1(a, n): r4 :: None L0: r0 = box(int, n) - r1 = a + r0 + r1 = PyNumber_Add(a, r0) r2 = box(int, n) - r3 = r2 + a + r3 = PyNumber_Add(r2, a) r4 = None return r4 def f2(a, n, l): diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index 96e39f2baadd..41379f1f882a 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -1126,9 +1126,9 @@ L0: f2 = r1 r2 = float_3 :: static (3.0) f3 = r2 - r3 = f1 * f2 + r3 = PyNumber_Multiply(f1, f2) r4 = cast(float, r3) - r5 = r4 + f3 + r5 = PyNumber_Add(r4, f3) r6 = cast(float, r5) return r6 @@ -1143,7 +1143,7 @@ def load(): L0: r0 = complex_1 :: static (5j) r1 = float_2 :: static (1.0) - r2 = r0 + r1 + r2 = PyNumber_Add(r0, r1) return r2 [case testBigIntLiteral] diff --git a/mypyc/test-data/irbuild-nested.test b/mypyc/test-data/irbuild-nested.test index 45e7d957feb9..62f8c07812d4 100644 --- a/mypyc/test-data/irbuild-nested.test +++ b/mypyc/test-data/irbuild-nested.test @@ -805,7 +805,7 @@ def __mypyc_lambda__0_f_obj.__call__(__mypyc_self__, a, b): r1 :: object L0: r0 = __mypyc_self__.__mypyc_env__ - r1 = a + b + r1 = PyNumber_Add(a, b) return r1 def __mypyc_lambda__1_f_obj.__get__(__mypyc_self__, instance, owner): __mypyc_self__, instance, owner, r0 :: object From 098d82f79aee9b79ba9426c03a1afc4d7ab81ee1 Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Wed, 5 Aug 2020 04:48:45 +0800 Subject: [PATCH 02/10] binary operations 2 --- mypyc/primitives/generic_ops.py | 12 ++++++------ mypyc/test-data/irbuild-any.test | 4 ++-- mypyc/test-data/irbuild-dict.test | 4 ++-- mypyc/test-data/irbuild-lists.test | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/mypyc/primitives/generic_ops.py b/mypyc/primitives/generic_ops.py index c37d8a84eeb5..c1f36b7d5b89 100644 --- a/mypyc/primitives/generic_ops.py +++ b/mypyc/primitives/generic_ops.py @@ -65,12 +65,12 @@ ('&=', 'PyNumber_InPlaceAnd'), ('^=', 'PyNumber_InPlaceXor'), ('|=', 'PyNumber_InPlaceOr')]: - binary_op(op=op, - arg_types=[object_rprimitive, object_rprimitive], - result_type=object_rprimitive, - error_kind=ERR_MAGIC, - emit=call_emit(funcname), - priority=0) + c_binary_op(name=op, + arg_types=[object_rprimitive, object_rprimitive], + return_type=object_rprimitive, + c_function_name=funcname, + error_kind=ERR_MAGIC, + priority=0) binary_op(op='**', arg_types=[object_rprimitive, object_rprimitive], diff --git a/mypyc/test-data/irbuild-any.test b/mypyc/test-data/irbuild-any.test index 528f295e94cd..579f61bd4a0b 100644 --- a/mypyc/test-data/irbuild-any.test +++ b/mypyc/test-data/irbuild-any.test @@ -129,10 +129,10 @@ def f3(a, n): r5 :: None L0: r0 = box(int, n) - r1 = a += r0 + r1 = PyNumber_InPlaceAdd(a, r0) a = r1 r2 = box(int, n) - r3 = r2 += a + r3 = PyNumber_InPlaceAdd(r2, a) r4 = unbox(int, r3) n = r4 r5 = None diff --git a/mypyc/test-data/irbuild-dict.test b/mypyc/test-data/irbuild-dict.test index 85f23058126d..064406c9f808 100644 --- a/mypyc/test-data/irbuild-dict.test +++ b/mypyc/test-data/irbuild-dict.test @@ -172,7 +172,7 @@ L2: k = r7 r8 = CPyDict_GetItem(d, k) r9 = box(short_int, 2) - r10 = r8 += r9 + r10 = PyNumber_InPlaceAdd(r8, r9) r11 = CPyDict_SetItem(d, k, r10) L3: r12 = CPyDict_CheckSize(d, r1) @@ -288,7 +288,7 @@ L9: r24 = box(int, k) r25 = CPyDict_GetItem(d2, r24) r26 = box(int, v) - r27 = r25 += r26 + r27 = PyNumber_InPlaceAdd(r25, r26) r28 = box(int, k) r29 = CPyDict_SetItem(d2, r28, r27) L10: diff --git a/mypyc/test-data/irbuild-lists.test b/mypyc/test-data/irbuild-lists.test index b07e5c40b118..76c39fc183eb 100644 --- a/mypyc/test-data/irbuild-lists.test +++ b/mypyc/test-data/irbuild-lists.test @@ -169,7 +169,7 @@ L1: L2: r3 = CPyList_GetItem(l, i) r4 = box(short_int, 2) - r5 = r3 += r4 + r5 = PyNumber_InPlaceAdd(r3, r4) r6 = CPyList_SetItem(l, i, r5) L3: r7 = r1 + 2 From 483cb425c1c743c513339498e1b819eaab94ce30 Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Wed, 5 Aug 2020 05:34:06 +0800 Subject: [PATCH 03/10] unary --- mypyc/primitives/generic_ops.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mypyc/primitives/generic_ops.py b/mypyc/primitives/generic_ops.py index c1f36b7d5b89..16ae5034b08c 100644 --- a/mypyc/primitives/generic_ops.py +++ b/mypyc/primitives/generic_ops.py @@ -14,7 +14,7 @@ from mypyc.primitives.registry import ( binary_op, unary_op, func_op, method_op, custom_op, call_emit, simple_emit, call_negative_bool_emit, call_negative_magic_emit, negative_int_emit, - c_binary_op + c_binary_op, c_unary_op ) @@ -106,12 +106,12 @@ for op, funcname in [('-', 'PyNumber_Negative'), ('+', 'PyNumber_Positive'), ('~', 'PyNumber_Invert')]: - unary_op(op=op, - arg_type=object_rprimitive, - result_type=object_rprimitive, - error_kind=ERR_MAGIC, - emit=call_emit(funcname), - priority=0) + c_unary_op(name=op, + arg_type=object_rprimitive, + return_type=object_rprimitive, + c_function_name=funcname, + error_kind=ERR_MAGIC, + priority=0) unary_op(op='not', arg_type=object_rprimitive, From 3e6563cf3dfa3933001c1aa79dc695ac602c2040 Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Wed, 5 Aug 2020 05:46:09 +0800 Subject: [PATCH 04/10] some call_emit --- mypyc/primitives/generic_ops.py | 22 +++++++++++----------- mypyc/test-data/irbuild-any.test | 4 ++-- mypyc/test-data/irbuild-basic.test | 2 +- mypyc/test-data/irbuild-classes.test | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/mypyc/primitives/generic_ops.py b/mypyc/primitives/generic_ops.py index 16ae5034b08c..f9ce5a984ee7 100644 --- a/mypyc/primitives/generic_ops.py +++ b/mypyc/primitives/generic_ops.py @@ -14,7 +14,7 @@ from mypyc.primitives.registry import ( binary_op, unary_op, func_op, method_op, custom_op, call_emit, simple_emit, call_negative_bool_emit, call_negative_magic_emit, negative_int_emit, - c_binary_op, c_unary_op + c_binary_op, c_unary_op, c_method_op, c_function_op ) @@ -123,12 +123,12 @@ # obj1[obj2] -method_op('__getitem__', - arg_types=[object_rprimitive, object_rprimitive], - result_type=object_rprimitive, - error_kind=ERR_MAGIC, - emit=call_emit('PyObject_GetItem'), - priority=0) +c_method_op(name='__getitem__', + arg_types=[object_rprimitive, object_rprimitive], + return_type=object_rprimitive, + c_function_name='PyObject_GetItem', + error_kind=ERR_MAGIC, + priority=0) # obj1[obj2] = obj3 method_op('__setitem__', @@ -147,12 +147,12 @@ priority=0) # hash(obj) -func_op( +c_function_op( name='builtins.hash', arg_types=[object_rprimitive], - result_type=int_rprimitive, - error_kind=ERR_MAGIC, - emit=call_emit('CPyObject_Hash')) + return_type=int_rprimitive, + c_function_name='CPyObject_Hash', + error_kind=ERR_MAGIC) # getattr(obj, attr) py_getattr_op = func_op( diff --git a/mypyc/test-data/irbuild-any.test b/mypyc/test-data/irbuild-any.test index 579f61bd4a0b..f83bf5104d0f 100644 --- a/mypyc/test-data/irbuild-any.test +++ b/mypyc/test-data/irbuild-any.test @@ -109,8 +109,8 @@ def f2(a, n, l): r11 :: None L0: r0 = box(int, n) - r1 = a[r0] :: object - r2 = l[a] :: object + r1 = PyObject_GetItem(a, r0) + r2 = PyObject_GetItem(l, a) r3 = box(int, n) r4 = box(int, n) r5 = a.__setitem__(r3, r4) :: object diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index 41379f1f882a..e36dbc83449c 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -2694,7 +2694,7 @@ L4: r53 = unicode_2 :: static ('List') r54 = CPyDict_GetItem(r52, r53) r55 = int - r56 = r54[r55] :: object + r56 = PyObject_GetItem(r54, r55) r57 = __main__.globals :: static r58 = unicode_10 :: static ('Foo') r59 = CPyDict_SetItem(r57, r58, r56) diff --git a/mypyc/test-data/irbuild-classes.test b/mypyc/test-data/irbuild-classes.test index 51e53f91a0dc..48e38c06f040 100644 --- a/mypyc/test-data/irbuild-classes.test +++ b/mypyc/test-data/irbuild-classes.test @@ -448,7 +448,7 @@ L6: r65 = __main__.globals :: static r66 = unicode_6 :: static ('T') r67 = CPyDict_GetItem(r65, r66) - r68 = r64[r67] :: object + r68 = PyObject_GetItem(r64, r67) r69 = (r60, r61, r68) :: tuple r70 = unicode_7 :: static ('__main__') r71 = __main__.D_template :: type From 8075691995d99ba970fc58c206b489c0c3bdb0b0 Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Wed, 5 Aug 2020 05:52:36 +0800 Subject: [PATCH 05/10] some call_emit 2 --- mypyc/irbuild/builder.py | 6 ++--- mypyc/irbuild/expression.py | 2 +- mypyc/irbuild/for_helpers.py | 4 ++-- mypyc/irbuild/function.py | 4 ++-- mypyc/primitives/generic_ops.py | 32 +++++++++++-------------- mypyc/test-data/irbuild-basic.test | 8 +++---- mypyc/test-data/irbuild-statements.test | 28 +++++++++++----------- 7 files changed, 40 insertions(+), 44 deletions(-) diff --git a/mypyc/irbuild/builder.py b/mypyc/irbuild/builder.py index a39dcad7b082..bfbf4c19a5ab 100644 --- a/mypyc/irbuild/builder.py +++ b/mypyc/irbuild/builder.py @@ -484,14 +484,14 @@ def process_iterator_tuple_assignment(self, rvalue_reg: Value, line: int) -> None: - iterator = self.primitive_op(iter_op, [rvalue_reg], line) + iterator = self.call_c(iter_op, [rvalue_reg], line) # This may be the whole lvalue list if there is no starred value split_idx = target.star_idx if target.star_idx is not None else len(target.items) # Assign values before the first starred value for litem in target.items[:split_idx]: - ritem = self.primitive_op(next_op, [iterator], line) + ritem = self.call_c(next_op, [iterator], line) error_block, ok_block = BasicBlock(), BasicBlock() self.add(Branch(ritem, error_block, ok_block, Branch.IS_ERROR)) @@ -532,7 +532,7 @@ def process_iterator_tuple_assignment(self, # There is no starred value, so check if there are extra values in rhs that # have not been assigned. else: - extra = self.primitive_op(next_op, [iterator], line) + extra = self.call_c(next_op, [iterator], line) error_block, ok_block = BasicBlock(), BasicBlock() self.add(Branch(extra, ok_block, error_block, Branch.IS_ERROR)) diff --git a/mypyc/irbuild/expression.py b/mypyc/irbuild/expression.py index 3e20951d491f..f759ffeb329d 100644 --- a/mypyc/irbuild/expression.py +++ b/mypyc/irbuild/expression.py @@ -575,6 +575,6 @@ def get_arg(arg: Optional[Expression]) -> Value: def transform_generator_expr(builder: IRBuilder, o: GeneratorExpr) -> Value: builder.warning('Treating generator comprehension as list', o.line) - return builder.primitive_op( + return builder.call_c( iter_op, [translate_list_comprehension(builder, o)], o.line ) diff --git a/mypyc/irbuild/for_helpers.py b/mypyc/irbuild/for_helpers.py index 9b5e24b97911..56e8cf8b816f 100644 --- a/mypyc/irbuild/for_helpers.py +++ b/mypyc/irbuild/for_helpers.py @@ -352,7 +352,7 @@ def init(self, expr_reg: Value, target_type: RType) -> None: # for the for-loop. If we are inside of a generator function, spill these into the # environment class. builder = self.builder - iter_reg = builder.primitive_op(iter_op, [expr_reg], self.line) + iter_reg = builder.call_c(iter_op, [expr_reg], self.line) builder.maybe_spill(expr_reg) self.iter_target = builder.maybe_spill(iter_reg) self.target_type = target_type @@ -364,7 +364,7 @@ def gen_condition(self) -> None: # for NULL (an exception does not necessarily have to be raised). builder = self.builder line = self.line - self.next_reg = builder.primitive_op(next_op, [builder.read(self.iter_target, line)], line) + self.next_reg = builder.call_c(next_op, [builder.read(self.iter_target, line)], line) builder.add(Branch(self.next_reg, self.loop_exit, self.body_block, Branch.IS_ERROR)) def begin_body(self) -> None: diff --git a/mypyc/irbuild/function.py b/mypyc/irbuild/function.py index 121f28088da7..4e7bd5687394 100644 --- a/mypyc/irbuild/function.py +++ b/mypyc/irbuild/function.py @@ -491,14 +491,14 @@ def handle_yield_from_and_await(builder: IRBuilder, o: Union[YieldFromExpr, Awai received_reg = builder.alloc_temp(object_rprimitive) if isinstance(o, YieldFromExpr): - iter_val = builder.primitive_op(iter_op, [builder.accept(o.expr)], o.line) + iter_val = builder.call_c(iter_op, [builder.accept(o.expr)], o.line) else: iter_val = builder.call_c(coro_op, [builder.accept(o.expr)], o.line) iter_reg = builder.maybe_spill_assignable(iter_val) stop_block, main_block, done_block = BasicBlock(), BasicBlock(), BasicBlock() - _y_init = builder.primitive_op(next_raw_op, [builder.read(iter_reg)], o.line) + _y_init = builder.call_c(next_raw_op, [builder.read(iter_reg)], o.line) builder.add(Branch(_y_init, stop_block, main_block, Branch.IS_ERROR)) # Try extracting a return value from a StopIteration and return it. diff --git a/mypyc/primitives/generic_ops.py b/mypyc/primitives/generic_ops.py index f9ce5a984ee7..5578904b49ba 100644 --- a/mypyc/primitives/generic_ops.py +++ b/mypyc/primitives/generic_ops.py @@ -14,7 +14,7 @@ from mypyc.primitives.registry import ( binary_op, unary_op, func_op, method_op, custom_op, call_emit, simple_emit, call_negative_bool_emit, call_negative_magic_emit, negative_int_emit, - c_binary_op, c_unary_op, c_method_op, c_function_op + c_binary_op, c_unary_op, c_method_op, c_function_op, c_custom_op ) @@ -237,22 +237,19 @@ priority=0) # iter(obj) -iter_op = func_op(name='builtins.iter', - arg_types=[object_rprimitive], - result_type=object_rprimitive, - error_kind=ERR_MAGIC, - emit=call_emit('PyObject_GetIter')) - +iter_op = c_function_op(name='builtins.iter', + arg_types=[object_rprimitive], + return_type=object_rprimitive, + c_function_name='PyObject_GetIter', + error_kind=ERR_MAGIC) # next(iterator) # # Although the error_kind is set to be ERR_NEVER, this can actually # return NULL, and thus it must be checked using Branch.IS_ERROR. -next_op = custom_op(name='next', - arg_types=[object_rprimitive], - result_type=object_rprimitive, - error_kind=ERR_NEVER, - emit=call_emit('PyIter_Next')) - +next_op = c_custom_op(arg_types=[object_rprimitive], + return_type=object_rprimitive, + c_function_name='PyIter_Next', + error_kind=ERR_NEVER) # next(iterator) # # Do a next, don't swallow StopIteration, but also don't propagate an @@ -260,8 +257,7 @@ # represent an implicit StopIteration, but if StopIteration is # *explicitly* raised this will not swallow it.) # Can return NULL: see next_op. -next_raw_op = custom_op(name='next', - arg_types=[object_rprimitive], - result_type=object_rprimitive, - error_kind=ERR_NEVER, - emit=call_emit('CPyIter_Next')) +next_raw_op = c_custom_op(arg_types=[object_rprimitive], + return_type=object_rprimitive, + c_function_name='CPyIter_Next', + error_kind=ERR_NEVER) diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index e36dbc83449c..9817d29fe3c4 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -3233,9 +3233,9 @@ def call_any(l): L0: r1 = False r0 = r1 - r2 = iter l :: object + r2 = PyObject_GetIter(l) L1: - r3 = next r2 :: object + r3 = PyIter_Next(r2) if is_error(r3) goto L9 else goto L2 L2: r4 = unbox(int, r3) @@ -3275,9 +3275,9 @@ def call_all(l): L0: r1 = True r0 = r1 - r2 = iter l :: object + r2 = PyObject_GetIter(l) L1: - r3 = next r2 :: object + r3 = PyIter_Next(r2) if is_error(r3) goto L9 else goto L2 L2: r4 = unbox(int, r3) diff --git a/mypyc/test-data/irbuild-statements.test b/mypyc/test-data/irbuild-statements.test index cdac45f0557b..c069cb70c45c 100644 --- a/mypyc/test-data/irbuild-statements.test +++ b/mypyc/test-data/irbuild-statements.test @@ -509,22 +509,22 @@ def from_any(a): r6 :: bool r7 :: None L0: - r0 = iter a :: object - r1 = next r0 :: object + r0 = PyObject_GetIter(a) + r1 = PyIter_Next(r0) if is_error(r1) goto L1 else goto L2 L1: raise ValueError('not enough values to unpack') unreachable L2: x = r1 - r3 = next r0 :: object + r3 = PyIter_Next(r0) if is_error(r3) goto L3 else goto L4 L3: raise ValueError('not enough values to unpack') unreachable L4: y = r3 - r5 = next r0 :: object + r5 = PyIter_Next(r0) if is_error(r5) goto L6 else goto L5 L5: raise ValueError('too many values to unpack') @@ -573,8 +573,8 @@ def from_any(a): r7 :: bool r8 :: None L0: - r0 = iter a :: object - r1 = next r0 :: object + r0 = PyObject_GetIter(a) + r1 = PyIter_Next(r0) if is_error(r1) goto L1 else goto L2 L1: raise ValueError('not enough values to unpack') @@ -582,14 +582,14 @@ L1: L2: r3 = unbox(int, r1) x = r3 - r4 = next r0 :: object + r4 = PyIter_Next(r0) if is_error(r4) goto L3 else goto L4 L3: raise ValueError('not enough values to unpack') unreachable L4: y = r4 - r6 = next r0 :: object + r6 = PyIter_Next(r0) if is_error(r6) goto L6 else goto L5 L5: raise ValueError('too many values to unpack') @@ -911,9 +911,9 @@ def g(x): L0: r0 = 0 i = 0 - r1 = iter x :: object + r1 = PyObject_GetIter(x) L1: - r2 = next r1 :: object + r2 = PyIter_Next(r1) if is_error(r2) goto L4 else goto L2 L2: r3 = unbox(int, r2) @@ -956,13 +956,13 @@ def f(a, b): r11 :: None L0: r0 = 0 - r1 = iter b :: object + r1 = PyObject_GetIter(b) L1: r2 = len a :: list r3 = r0 < r2 :: signed if r3 goto L2 else goto L7 :: bool L2: - r4 = next r1 :: object + r4 = PyIter_Next(r1) if is_error(r4) goto L7 else goto L3 L3: r5 = a[r0] :: unsafe list @@ -1000,12 +1000,12 @@ def g(a, b): r13 :: bool r14 :: None L0: - r0 = iter a :: object + r0 = PyObject_GetIter(a) r1 = 0 r2 = 0 z = r2 L1: - r3 = next r0 :: object + r3 = PyIter_Next(r0) if is_error(r3) goto L6 else goto L2 L2: r4 = len b :: list From 8e06debcdc76ea277c00d424d4bdc8d43a2dda74 Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Wed, 5 Aug 2020 06:00:10 +0800 Subject: [PATCH 06/10] more call_emit --- mypyc/irbuild/classdef.py | 6 ++-- mypyc/irbuild/ll_builder.py | 2 +- mypyc/primitives/generic_ops.py | 27 +++++++------- mypyc/test-data/analysis.test | 2 +- mypyc/test-data/exceptions.test | 16 ++++----- mypyc/test-data/irbuild-basic.test | 48 ++++++++++++------------- mypyc/test-data/irbuild-classes.test | 8 ++--- mypyc/test-data/irbuild-optional.test | 6 ++-- mypyc/test-data/irbuild-statements.test | 2 +- mypyc/test-data/irbuild-try.test | 36 +++++++++---------- 10 files changed, 75 insertions(+), 78 deletions(-) diff --git a/mypyc/irbuild/classdef.py b/mypyc/irbuild/classdef.py index ef6527e445a0..3a5a09a41cb8 100644 --- a/mypyc/irbuild/classdef.py +++ b/mypyc/irbuild/classdef.py @@ -241,9 +241,9 @@ def setup_non_ext_dict(builder: IRBuilder, This class dictionary is passed to the metaclass constructor. """ # Check if the metaclass defines a __prepare__ method, and if so, call it. - has_prepare = builder.primitive_op(py_hasattr_op, - [metaclass, - builder.load_static_unicode('__prepare__')], cdef.line) + has_prepare = builder.call_c(py_hasattr_op, + [metaclass, + builder.load_static_unicode('__prepare__')], cdef.line) non_ext_dict = builder.alloc_temp(dict_rprimitive) diff --git a/mypyc/irbuild/ll_builder.py b/mypyc/irbuild/ll_builder.py index a3b6652c4d3f..f8d5e5d8e04f 100644 --- a/mypyc/irbuild/ll_builder.py +++ b/mypyc/irbuild/ll_builder.py @@ -186,7 +186,7 @@ def py_get_attr(self, obj: Value, attr: str, line: int) -> Value: Prefer get_attr() which generates optimized code for native classes. """ key = self.load_static_unicode(attr) - return self.add(PrimitiveOp([obj, key], py_getattr_op, line)) + return self.call_c(py_getattr_op, [obj, key], line) # isinstance() checks diff --git a/mypyc/primitives/generic_ops.py b/mypyc/primitives/generic_ops.py index 5578904b49ba..cdb93248f443 100644 --- a/mypyc/primitives/generic_ops.py +++ b/mypyc/primitives/generic_ops.py @@ -155,22 +155,20 @@ error_kind=ERR_MAGIC) # getattr(obj, attr) -py_getattr_op = func_op( +py_getattr_op = c_function_op( name='builtins.getattr', arg_types=[object_rprimitive, object_rprimitive], - result_type=object_rprimitive, - error_kind=ERR_MAGIC, - emit=call_emit('CPyObject_GetAttr') -) + return_type=object_rprimitive, + c_function_name='CPyObject_GetAttr', + error_kind=ERR_MAGIC) # getattr(obj, attr, default) -func_op( +c_function_op( name='builtins.getattr', arg_types=[object_rprimitive, object_rprimitive, object_rprimitive], - result_type=object_rprimitive, - error_kind=ERR_MAGIC, - emit=call_emit('CPyObject_GetAttr3') -) + return_type=object_rprimitive, + c_function_name='CPyObject_GetAttr3', + error_kind=ERR_MAGIC) # setattr(obj, attr, value) py_setattr_op = func_op( @@ -182,13 +180,12 @@ ) # hasattr(obj, attr) -py_hasattr_op = func_op( +py_hasattr_op = c_function_op( name='builtins.hasattr', arg_types=[object_rprimitive, object_rprimitive], - result_type=bool_rprimitive, - error_kind=ERR_NEVER, - emit=call_emit('PyObject_HasAttr') -) + return_type=bool_rprimitive, + c_function_name='PyObject_HasAttr', + error_kind=ERR_NEVER) # del obj.attr py_delattr_op = func_op( diff --git a/mypyc/test-data/analysis.test b/mypyc/test-data/analysis.test index c800c43bed5e..c79c61bbcdeb 100644 --- a/mypyc/test-data/analysis.test +++ b/mypyc/test-data/analysis.test @@ -755,7 +755,7 @@ L2: r1 = CPy_CatchError() r2 = builtins :: module r3 = unicode_1 :: static ('Exception') - r4 = getattr r2, r3 + r4 = CPyObject_GetAttr(r2, r3) if is_error(r4) goto L8 (error at lol:4) else goto L3 L3: r5 = CPy_ExceptionMatches(r4) diff --git a/mypyc/test-data/exceptions.test b/mypyc/test-data/exceptions.test index acd5731bfb26..02db4aa9e789 100644 --- a/mypyc/test-data/exceptions.test +++ b/mypyc/test-data/exceptions.test @@ -199,7 +199,7 @@ L0: L1: r0 = builtins :: module r1 = unicode_1 :: static ('object') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) if is_error(r2) goto L3 (error at g:3) else goto L2 L2: r3 = py_call(r2) @@ -210,7 +210,7 @@ L3: r5 = unicode_2 :: static ('weeee') r6 = builtins :: module r7 = unicode_3 :: static ('print') - r8 = getattr r6, r7 + r8 = CPyObject_GetAttr(r6, r7) if is_error(r8) goto L6 (error at g:5) else goto L4 L4: r9 = py_call(r8, r5) @@ -268,7 +268,7 @@ L0: L1: r0 = builtins :: module r1 = unicode_1 :: static ('print') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) if is_error(r2) goto L5 (error at a:3) else goto L2 L2: r3 = py_call(r2) @@ -291,7 +291,7 @@ L6: r11 = unicode_3 :: static ('goodbye!') r12 = builtins :: module r13 = unicode_1 :: static ('print') - r14 = getattr r12, r13 + r14 = CPyObject_GetAttr(r12, r13) if is_error(r14) goto L13 (error at a:6) else goto L7 L7: r15 = py_call(r14, r11) @@ -371,7 +371,7 @@ def lol(x): L0: L1: r0 = unicode_3 :: static ('foo') - r1 = getattr x, r0 + r1 = CPyObject_GetAttr(x, r0) if is_error(r1) goto L3 (error at lol:4) else goto L2 L2: st = r1 @@ -411,12 +411,12 @@ def lol(x): L0: L1: r0 = unicode_3 :: static ('foo') - r1 = getattr x, r0 + r1 = CPyObject_GetAttr(x, r0) if is_error(r1) goto L4 (error at lol:4) else goto L15 L2: a = r1 r2 = unicode_4 :: static ('bar') - r3 = getattr x, r2 + r3 = CPyObject_GetAttr(x, r2) if is_error(r3) goto L4 (error at lol:5) else goto L16 L3: b = r3 @@ -498,7 +498,7 @@ L2: L3: r4 = builtins :: module r5 = unicode_3 :: static ('print') - r6 = getattr r4, r5 + r6 = CPyObject_GetAttr(r4, r5) if is_error(r6) goto L12 (error at f:7) else goto L4 L4: if is_error(v) goto L13 else goto L7 diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index 9817d29fe3c4..8ac323dc1ef2 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -776,7 +776,7 @@ def f(x): L0: r0 = testmodule :: module r1 = unicode_2 :: static ('factorial') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) r3 = box(int, x) r4 = py_call(r2, r3) r5 = unbox(int, r4) @@ -821,7 +821,7 @@ def f(x): L0: r0 = builtins :: module r1 = unicode_1 :: static ('print') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) r3 = box(short_int, 10) r4 = py_call(r2, r3) r5 = None @@ -841,7 +841,7 @@ def f(x): L0: r0 = builtins :: module r1 = unicode_1 :: static ('print') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) r3 = box(short_int, 10) r4 = py_call(r2, r3) r5 = None @@ -1322,7 +1322,7 @@ def call_python_method_with_keyword_args(xs, first, second): r16 :: object L0: r0 = unicode_4 :: static ('insert') - r1 = getattr xs, r0 + r1 = CPyObject_GetAttr(xs, r0) r2 = unicode_5 :: static ('x') r3 = box(short_int, 0) r4 = (r3) :: tuple @@ -1330,7 +1330,7 @@ L0: r6 = CPyDict_Build(1, r2, r5) r7 = py_call_with_kwargs(r1, r4, r6) r8 = unicode_4 :: static ('insert') - r9 = getattr xs, r8 + r9 = CPyObject_GetAttr(xs, r8) r10 = unicode_5 :: static ('x') r11 = unicode_6 :: static ('i') r12 = () :: tuple @@ -1518,7 +1518,7 @@ def foo(): L0: r0 = builtins :: module r1 = unicode_1 :: static ('Exception') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) r3 = py_call(r2) CPy_Raise(r3) unreachable @@ -1529,7 +1529,7 @@ def bar(): L0: r0 = builtins :: module r1 = unicode_1 :: static ('Exception') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) CPy_Raise(r2) unreachable @@ -1556,7 +1556,7 @@ L0: r3 = unbox(int, r2) r4 = builtins :: module r5 = unicode_2 :: static ('print') - r6 = getattr r4, r5 + r6 = CPyObject_GetAttr(r4, r5) r7 = box(int, r3) r8 = py_call(r6, r7) r9 = None @@ -1598,7 +1598,7 @@ L2: r12 = unbox(int, r11) r13 = builtins :: module r14 = unicode_2 :: static ('print') - r15 = getattr r13, r14 + r15 = CPyObject_GetAttr(r13, r14) r16 = box(int, r12) r17 = py_call(r15, r16) r18 = None @@ -1624,7 +1624,7 @@ def f(): L0: r0 = m :: module r1 = unicode_2 :: static ('f') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) r3 = box(short_int, 2) r4 = py_call(r2, r3) r5 = cast(str, r4) @@ -2651,15 +2651,15 @@ L4: r10 = typing :: module r11 = __main__.globals :: static r12 = unicode_2 :: static ('List') - r13 = getattr r10, r12 + r13 = CPyObject_GetAttr(r10, r12) r14 = unicode_2 :: static ('List') r15 = CPyDict_SetItem(r11, r14, r13) r16 = unicode_3 :: static ('NewType') - r17 = getattr r10, r16 + r17 = CPyObject_GetAttr(r10, r16) r18 = unicode_3 :: static ('NewType') r19 = CPyDict_SetItem(r11, r18, r17) r20 = unicode_4 :: static ('NamedTuple') - r21 = getattr r10, r20 + r21 = CPyObject_GetAttr(r10, r20) r22 = unicode_4 :: static ('NamedTuple') r23 = CPyDict_SetItem(r11, r22, r21) r24 = unicode_5 :: static ('Lol') @@ -2876,14 +2876,14 @@ L0: r2 = unicode_3 :: static ('Entering') r3 = builtins :: module r4 = unicode_4 :: static ('print') - r5 = getattr r3, r4 + r5 = CPyObject_GetAttr(r3, r4) r6 = py_call(r5, r2) r7 = r0.f r8 = py_call(r7) r9 = unicode_5 :: static ('Exited') r10 = builtins :: module r11 = unicode_4 :: static ('print') - r12 = getattr r10, r11 + r12 = CPyObject_GetAttr(r10, r11) r13 = py_call(r12, r9) r14 = None return r14 @@ -2935,14 +2935,14 @@ L0: r2 = unicode_6 :: static ('---') r3 = builtins :: module r4 = unicode_4 :: static ('print') - r5 = getattr r3, r4 + r5 = CPyObject_GetAttr(r3, r4) r6 = py_call(r5, r2) r7 = r0.f r8 = py_call(r7) r9 = unicode_6 :: static ('---') r10 = builtins :: module r11 = unicode_4 :: static ('print') - r12 = getattr r10, r11 + r12 = CPyObject_GetAttr(r10, r11) r13 = py_call(r12, r9) r14 = None return r14 @@ -2990,7 +2990,7 @@ L0: r2 = unicode_7 :: static ('d') r3 = builtins :: module r4 = unicode_4 :: static ('print') - r5 = getattr r3, r4 + r5 = CPyObject_GetAttr(r3, r4) r6 = py_call(r5, r2) r7 = None return r7 @@ -3026,7 +3026,7 @@ L0: r12 = unicode_10 :: static ('c') r13 = builtins :: module r14 = unicode_4 :: static ('print') - r15 = getattr r13, r14 + r15 = CPyObject_GetAttr(r13, r14) r16 = py_call(r15, r12) r17 = r0.d r18 = py_call(r17) @@ -3080,7 +3080,7 @@ L4: r10 = typing :: module r11 = __main__.globals :: static r12 = unicode_2 :: static ('Callable') - r13 = getattr r10, r12 + r13 = CPyObject_GetAttr(r10, r12) r14 = unicode_2 :: static ('Callable') r15 = CPyDict_SetItem(r11, r14, r13) r16 = __main__.globals :: static @@ -3144,14 +3144,14 @@ L0: r2 = unicode_3 :: static ('Entering') r3 = builtins :: module r4 = unicode_4 :: static ('print') - r5 = getattr r3, r4 + r5 = CPyObject_GetAttr(r3, r4) r6 = py_call(r5, r2) r7 = r0.f r8 = py_call(r7) r9 = unicode_5 :: static ('Exited') r10 = builtins :: module r11 = unicode_4 :: static ('print') - r12 = getattr r10, r11 + r12 = CPyObject_GetAttr(r10, r11) r13 = py_call(r12, r9) r14 = None return r14 @@ -3206,7 +3206,7 @@ L4: r10 = typing :: module r11 = __main__.globals :: static r12 = unicode_2 :: static ('Callable') - r13 = getattr r10, r12 + r13 = CPyObject_GetAttr(r10, r12) r14 = unicode_2 :: static ('Callable') r15 = CPyDict_SetItem(r11, r14, r13) r16 = None @@ -3575,7 +3575,7 @@ def f(x): L0: r0 = builtins :: module r1 = unicode_1 :: static ('reveal_type') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) r3 = box(int, x) r4 = py_call(r2, r3) r5 = None diff --git a/mypyc/test-data/irbuild-classes.test b/mypyc/test-data/irbuild-classes.test index 48e38c06f040..e4c8ba73a48d 100644 --- a/mypyc/test-data/irbuild-classes.test +++ b/mypyc/test-data/irbuild-classes.test @@ -387,11 +387,11 @@ L4: r10 = typing :: module r11 = __main__.globals :: static r12 = unicode_2 :: static ('TypeVar') - r13 = getattr r10, r12 + r13 = CPyObject_GetAttr(r10, r12) r14 = unicode_2 :: static ('TypeVar') r15 = CPyDict_SetItem(r11, r14, r13) r16 = unicode_3 :: static ('Generic') - r17 = getattr r10, r16 + r17 = CPyObject_GetAttr(r10, r16) r18 = unicode_3 :: static ('Generic') r19 = CPyDict_SetItem(r11, r18, r17) r20 = mypy_extensions :: module @@ -406,7 +406,7 @@ L6: r25 = mypy_extensions :: module r26 = __main__.globals :: static r27 = unicode_5 :: static ('trait') - r28 = getattr r25, r27 + r28 = CPyObject_GetAttr(r25, r27) r29 = unicode_5 :: static ('trait') r30 = CPyDict_SetItem(r26, r29, r28) r31 = unicode_6 :: static ('T') @@ -767,7 +767,7 @@ def f(): L0: r0 = __main__.A :: type r1 = unicode_6 :: static ('x') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) r3 = unbox(int, r2) return r3 diff --git a/mypyc/test-data/irbuild-optional.test b/mypyc/test-data/irbuild-optional.test index 8e70c91ae09f..dbf8f760b477 100644 --- a/mypyc/test-data/irbuild-optional.test +++ b/mypyc/test-data/irbuild-optional.test @@ -494,7 +494,7 @@ L1: L2: r5 = o r6 = unicode_7 :: static ('x') - r7 = getattr r5, r6 + r7 = CPyObject_GetAttr(r5, r6) r8 = unbox(int, r7) r0 = r8 L3: @@ -524,7 +524,7 @@ L1: L2: r5 = o r6 = unicode_7 :: static ('x') - r7 = getattr r5, r6 + r7 = CPyObject_GetAttr(r5, r6) r8 = unbox(int, r7) r0 = r8 L3: @@ -554,7 +554,7 @@ def f(o): L0: r1 = o r2 = unicode_6 :: static ('x') - r3 = getattr r1, r2 + r3 = CPyObject_GetAttr(r1, r2) r0 = r3 L1: r4 = None diff --git a/mypyc/test-data/irbuild-statements.test b/mypyc/test-data/irbuild-statements.test index c069cb70c45c..959f48da2efb 100644 --- a/mypyc/test-data/irbuild-statements.test +++ b/mypyc/test-data/irbuild-statements.test @@ -689,7 +689,7 @@ L1: L2: r4 = builtins :: module r5 = unicode_3 :: static ('AssertionError') - r6 = getattr r4, r5 + r6 = CPyObject_GetAttr(r4, r5) r7 = py_call(r6, s) CPy_Raise(r7) unreachable diff --git a/mypyc/test-data/irbuild-try.test b/mypyc/test-data/irbuild-try.test index f8b3bfca5c12..6ac7faeaf3ba 100644 --- a/mypyc/test-data/irbuild-try.test +++ b/mypyc/test-data/irbuild-try.test @@ -20,7 +20,7 @@ L0: L1: r0 = builtins :: module r1 = unicode_1 :: static ('object') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) r3 = py_call(r2) goto L5 L2: (handler for L1) @@ -28,7 +28,7 @@ L2: (handler for L1) r5 = unicode_2 :: static ('weeee') r6 = builtins :: module r7 = unicode_3 :: static ('print') - r8 = getattr r6, r7 + r8 = CPyObject_GetAttr(r6, r7) r9 = py_call(r8, r5) L3: CPy_RestoreExcInfo(r4) @@ -70,7 +70,7 @@ L1: L2: r0 = builtins :: module r1 = unicode_1 :: static ('object') - r2 = getattr r0, r1 + r2 = CPyObject_GetAttr(r0, r1) r3 = py_call(r2) goto L4 L3: @@ -83,7 +83,7 @@ L5: (handler for L1, L2, L3, L4) r7 = unicode_3 :: static ('weeee') r8 = builtins :: module r9 = unicode_4 :: static ('print') - r10 = getattr r8, r9 + r10 = CPyObject_GetAttr(r8, r9) r11 = py_call(r10, r7) L6: CPy_RestoreExcInfo(r6) @@ -137,19 +137,19 @@ L1: r0 = unicode_1 :: static ('a') r1 = builtins :: module r2 = unicode_2 :: static ('print') - r3 = getattr r1, r2 + r3 = CPyObject_GetAttr(r1, r2) r4 = py_call(r3, r0) L2: r5 = builtins :: module r6 = unicode_3 :: static ('object') - r7 = getattr r5, r6 + r7 = CPyObject_GetAttr(r5, r6) r8 = py_call(r7) goto L8 L3: (handler for L2) r9 = CPy_CatchError() r10 = builtins :: module r11 = unicode_4 :: static ('AttributeError') - r12 = getattr r10, r11 + r12 = CPyObject_GetAttr(r10, r11) r13 = CPy_ExceptionMatches(r12) if r13 goto L4 else goto L5 :: bool L4: @@ -158,7 +158,7 @@ L4: r15 = unicode_5 :: static ('b') r16 = builtins :: module r17 = unicode_2 :: static ('print') - r18 = getattr r16, r17 + r18 = CPyObject_GetAttr(r16, r17) r19 = py_call(r18, r15, e) goto L6 L5: @@ -178,7 +178,7 @@ L9: (handler for L1, L6, L7, L8) r22 = unicode_6 :: static ('weeee') r23 = builtins :: module r24 = unicode_2 :: static ('print') - r25 = getattr r23, r24 + r25 = CPyObject_GetAttr(r23, r24) r26 = py_call(r25, r22) L10: CPy_RestoreExcInfo(r21) @@ -226,27 +226,27 @@ L2: (handler for L1) r0 = CPy_CatchError() r1 = builtins :: module r2 = unicode_1 :: static ('KeyError') - r3 = getattr r1, r2 + r3 = CPyObject_GetAttr(r1, r2) r4 = CPy_ExceptionMatches(r3) if r4 goto L3 else goto L4 :: bool L3: r5 = unicode_2 :: static ('weeee') r6 = builtins :: module r7 = unicode_3 :: static ('print') - r8 = getattr r6, r7 + r8 = CPyObject_GetAttr(r6, r7) r9 = py_call(r8, r5) goto L7 L4: r10 = builtins :: module r11 = unicode_4 :: static ('IndexError') - r12 = getattr r10, r11 + r12 = CPyObject_GetAttr(r10, r11) r13 = CPy_ExceptionMatches(r12) if r13 goto L5 else goto L6 :: bool L5: r14 = unicode_5 :: static ('yo') r15 = builtins :: module r16 = unicode_3 :: static ('print') - r17 = getattr r15, r16 + r17 = CPyObject_GetAttr(r15, r16) r18 = py_call(r17, r14) goto L7 L6: @@ -291,7 +291,7 @@ L2: r0 = unicode_1 :: static ('hi') r1 = builtins :: module r2 = unicode_2 :: static ('Exception') - r3 = getattr r1, r2 + r3 = CPyObject_GetAttr(r1, r2) r4 = py_call(r3, r0) CPy_Raise(r4) unreachable @@ -308,7 +308,7 @@ L7: r8 = unicode_3 :: static ('finally') r9 = builtins :: module r10 = unicode_4 :: static ('print') - r11 = getattr r9, r10 + r11 = CPyObject_GetAttr(r9, r10) r12 = py_call(r11, r8) if is_error(r5) goto L9 else goto L8 L8: @@ -358,9 +358,9 @@ L0: r0 = py_call(x) r1 = PyObject_Type(r0) r2 = unicode_3 :: static ('__exit__') - r3 = getattr r1, r2 + r3 = CPyObject_GetAttr(r1, r2) r4 = unicode_4 :: static ('__enter__') - r5 = getattr r1, r4 + r5 = CPyObject_GetAttr(r1, r4) r6 = py_call(r5, r0) r7 = True r8 = r7 @@ -370,7 +370,7 @@ L2: r9 = unicode_5 :: static ('hello') r10 = builtins :: module r11 = unicode_6 :: static ('print') - r12 = getattr r10, r11 + r12 = CPyObject_GetAttr(r10, r11) r13 = py_call(r12, r9) goto L8 L3: (handler for L2) From 2abcf80b3f3171cff3e41ef38f30246383647281 Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Wed, 5 Aug 2020 06:08:09 +0800 Subject: [PATCH 07/10] del attr --- mypyc/irbuild/statement.py | 4 ++-- mypyc/primitives/generic_ops.py | 11 +++++------ mypyc/test-data/irbuild-statements.test | 12 ++++++------ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/mypyc/irbuild/statement.py b/mypyc/irbuild/statement.py index ecbfcd18ea9d..0898a0b19d4d 100644 --- a/mypyc/irbuild/statement.py +++ b/mypyc/irbuild/statement.py @@ -17,7 +17,7 @@ from mypyc.ir.ops import ( Assign, Unreachable, AssignmentTarget, AssignmentTargetRegister, AssignmentTargetIndex, - AssignmentTargetAttr, AssignmentTargetTuple, PrimitiveOp, RaiseStandardError, LoadErrorValue, + AssignmentTargetAttr, AssignmentTargetTuple, RaiseStandardError, LoadErrorValue, BasicBlock, TupleGet, Value, Register, Branch, NO_TRACEBACK_LINE_NO ) from mypyc.ir.rtypes import exc_rtuple @@ -634,7 +634,7 @@ def transform_del_item(builder: IRBuilder, target: AssignmentTarget, line: int) ) elif isinstance(target, AssignmentTargetAttr): key = builder.load_static_unicode(target.attr) - builder.add(PrimitiveOp([target.obj, key], py_delattr_op, line)) + builder.call_c(py_delattr_op, [target.obj, key], line) elif isinstance(target, AssignmentTargetRegister): # Delete a local by assigning an error value to it, which will # prompt the insertion of uninit checks. diff --git a/mypyc/primitives/generic_ops.py b/mypyc/primitives/generic_ops.py index cdb93248f443..b670a0b30680 100644 --- a/mypyc/primitives/generic_ops.py +++ b/mypyc/primitives/generic_ops.py @@ -9,7 +9,7 @@ check that the priorities are configured properly. """ -from mypyc.ir.ops import ERR_NEVER, ERR_MAGIC, ERR_FALSE +from mypyc.ir.ops import ERR_NEVER, ERR_MAGIC, ERR_FALSE, ERR_NEG_INT from mypyc.ir.rtypes import object_rprimitive, int_rprimitive, bool_rprimitive, c_int_rprimitive from mypyc.primitives.registry import ( binary_op, unary_op, func_op, method_op, custom_op, call_emit, simple_emit, @@ -188,13 +188,12 @@ error_kind=ERR_NEVER) # del obj.attr -py_delattr_op = func_op( +py_delattr_op = c_function_op( name='builtins.delattr', arg_types=[object_rprimitive, object_rprimitive], - result_type=bool_rprimitive, - error_kind=ERR_FALSE, - emit=call_negative_bool_emit('PyObject_DelAttr') -) + return_type=c_int_rprimitive, + c_function_name='PyObject_DelAttr', + error_kind=ERR_NEG_INT) # Call callable object with N positional arguments: func(arg1, ..., argN) # Arguments are (func, arg1, ..., argN). diff --git a/mypyc/test-data/irbuild-statements.test b/mypyc/test-data/irbuild-statements.test index 959f48da2efb..c1a73fbb5b0b 100644 --- a/mypyc/test-data/irbuild-statements.test +++ b/mypyc/test-data/irbuild-statements.test @@ -829,29 +829,29 @@ L0: def delAttribute(): r0, dummy :: __main__.Dummy r1 :: str - r2 :: bool + r2 :: int32 r3 :: None L0: r0 = Dummy(2, 4) dummy = r0 r1 = unicode_3 :: static ('x') - r2 = delattr dummy, r1 + r2 = PyObject_DelAttr(dummy, r1) r3 = None return r3 def delAttributeMultiple(): r0, dummy :: __main__.Dummy r1 :: str - r2 :: bool + r2 :: int32 r3 :: str - r4 :: bool + r4 :: int32 r5 :: None L0: r0 = Dummy(2, 4) dummy = r0 r1 = unicode_3 :: static ('x') - r2 = delattr dummy, r1 + r2 = PyObject_DelAttr(dummy, r1) r3 = unicode_4 :: static ('y') - r4 = delattr dummy, r3 + r4 = PyObject_DelAttr(dummy, r3) r5 = None return r5 From 9d5236b8bd643713ba81d598927a3da0f14e1877 Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Wed, 5 Aug 2020 06:15:17 +0800 Subject: [PATCH 08/10] set attr --- mypyc/irbuild/builder.py | 4 ++-- mypyc/irbuild/classdef.py | 4 ++-- mypyc/irbuild/function.py | 14 +++++++------- mypyc/primitives/generic_ops.py | 9 ++++----- mypyc/test-data/irbuild-any.test | 4 ++-- mypyc/test-data/irbuild-basic.test | 4 ++-- mypyc/test-data/irbuild-classes.test | 12 ++++++------ mypyc/test-data/irbuild-optional.test | 4 ++-- 8 files changed, 27 insertions(+), 28 deletions(-) diff --git a/mypyc/irbuild/builder.py b/mypyc/irbuild/builder.py index bfbf4c19a5ab..1b087c501aa3 100644 --- a/mypyc/irbuild/builder.py +++ b/mypyc/irbuild/builder.py @@ -34,7 +34,7 @@ BasicBlock, AssignmentTarget, AssignmentTargetRegister, AssignmentTargetIndex, AssignmentTargetAttr, AssignmentTargetTuple, Environment, LoadInt, Value, Register, Op, Assign, Branch, Unreachable, TupleGet, GetAttr, SetAttr, LoadStatic, - InitStatic, PrimitiveOp, OpDescription, NAMESPACE_MODULE, RaiseStandardError, + InitStatic, OpDescription, NAMESPACE_MODULE, RaiseStandardError, ) from mypyc.ir.rtypes import ( RType, RTuple, RInstance, int_rprimitive, dict_rprimitive, @@ -448,7 +448,7 @@ def assign(self, target: Union[Register, AssignmentTarget], else: key = self.load_static_unicode(target.attr) boxed_reg = self.builder.box(rvalue_reg) - self.add(PrimitiveOp([target.obj, key, boxed_reg], py_setattr_op, line)) + self.call_c(py_setattr_op, [target.obj, key, boxed_reg], line) elif isinstance(target, AssignmentTargetIndex): target_reg2 = self.gen_method_call( target.base, '__setitem__', [target.index, rvalue_reg], None, line) diff --git a/mypyc/irbuild/classdef.py b/mypyc/irbuild/classdef.py index 3a5a09a41cb8..68d5ff3ee1bd 100644 --- a/mypyc/irbuild/classdef.py +++ b/mypyc/irbuild/classdef.py @@ -124,7 +124,7 @@ def transform_class_def(builder: IRBuilder, cdef: ClassDef) -> None: continue typ = builder.load_native_type_object(cdef.fullname) value = builder.accept(stmt.rvalue) - builder.primitive_op( + builder.call_c( py_setattr_op, [typ, builder.load_static_unicode(lvalue.name), value], stmt.line) if builder.non_function_scope() and stmt.is_final_def: builder.init_final_static(lvalue, value, cdef.name) @@ -182,7 +182,7 @@ def allocate_class(builder: IRBuilder, cdef: ClassDef) -> Value: None, builder.module_name, FuncSignature([], bool_rprimitive)), [], -1)) # Populate a '__mypyc_attrs__' field containing the list of attrs - builder.primitive_op(py_setattr_op, [ + builder.call_c(py_setattr_op, [ tp, builder.load_static_unicode('__mypyc_attrs__'), create_mypyc_attrs_tuple(builder, builder.mapper.type_to_ir[cdef.info], cdef.line)], cdef.line) diff --git a/mypyc/irbuild/function.py b/mypyc/irbuild/function.py index 4e7bd5687394..44928136c886 100644 --- a/mypyc/irbuild/function.py +++ b/mypyc/irbuild/function.py @@ -350,13 +350,13 @@ def handle_ext_method(builder: IRBuilder, cdef: ClassDef, fdef: FuncDef) -> None # Set the callable object representing the decorated method as an attribute of the # extension class. - builder.primitive_op(py_setattr_op, - [ - typ, - builder.load_static_unicode(name), - decorated_func - ], - fdef.line) + builder.call_c(py_setattr_op, + [ + typ, + builder.load_static_unicode(name), + decorated_func + ], + fdef.line) if fdef.is_property: # If there is a property setter, it will be processed after the getter, diff --git a/mypyc/primitives/generic_ops.py b/mypyc/primitives/generic_ops.py index b670a0b30680..f748a051bac8 100644 --- a/mypyc/primitives/generic_ops.py +++ b/mypyc/primitives/generic_ops.py @@ -171,13 +171,12 @@ error_kind=ERR_MAGIC) # setattr(obj, attr, value) -py_setattr_op = func_op( +py_setattr_op = c_function_op( name='builtins.setattr', arg_types=[object_rprimitive, object_rprimitive, object_rprimitive], - result_type=bool_rprimitive, - error_kind=ERR_FALSE, - emit=call_negative_bool_emit('PyObject_SetAttr') -) + return_type=c_int_rprimitive, + c_function_name='PyObject_SetAttr', + error_kind=ERR_NEG_INT) # hasattr(obj, attr) py_hasattr_op = c_function_op( diff --git a/mypyc/test-data/irbuild-any.test b/mypyc/test-data/irbuild-any.test index f83bf5104d0f..f1a1f9a849e9 100644 --- a/mypyc/test-data/irbuild-any.test +++ b/mypyc/test-data/irbuild-any.test @@ -51,7 +51,7 @@ def f(a, n, c): r5 :: int r6 :: str r7 :: object - r8 :: bool + r8 :: int32 r9 :: None L0: r0 = box(int, n) @@ -64,7 +64,7 @@ L0: n = r5 r6 = unicode_6 :: static ('a') r7 = box(int, n) - r8 = setattr a, r6, r7 + r8 = PyObject_SetAttr(a, r6, r7) r9 = None return r9 diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index 8ac323dc1ef2..f4c096d76e06 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -3317,13 +3317,13 @@ def lol(x: Any): def lol(x): x :: object r0, r1 :: str - r2 :: bool + r2 :: int32 r3, r4 :: None r5 :: object L0: r0 = unicode_5 :: static ('x') r1 = unicode_6 :: static ('5') - r2 = setattr x, r0, r1 + r2 = PyObject_SetAttr(x, r0, r1) r3 = None r4 = None r5 = box(None, r4) diff --git a/mypyc/test-data/irbuild-classes.test b/mypyc/test-data/irbuild-classes.test index e4c8ba73a48d..d92291e29c95 100644 --- a/mypyc/test-data/irbuild-classes.test +++ b/mypyc/test-data/irbuild-classes.test @@ -334,7 +334,7 @@ def __top_level__(): r43 :: bool r44 :: str r45 :: tuple - r46 :: bool + r46 :: int32 r47 :: dict r48 :: str r49 :: int32 @@ -343,7 +343,7 @@ def __top_level__(): r52, r53 :: object r54 :: str r55 :: tuple - r56 :: bool + r56 :: int32 r57 :: dict r58 :: str r59 :: int32 @@ -360,7 +360,7 @@ def __top_level__(): r73 :: bool r74, r75 :: str r76 :: tuple - r77 :: bool + r77 :: int32 r78 :: dict r79 :: str r80 :: int32 @@ -424,7 +424,7 @@ L6: r43 = C_trait_vtable_setup() r44 = unicode_8 :: static ('__mypyc_attrs__') r45 = () :: tuple - r46 = setattr r42, r44, r45 + r46 = PyObject_SetAttr(r42, r44, r45) __main__.C = r42 :: type r47 = __main__.globals :: static r48 = unicode_9 :: static ('C') @@ -435,7 +435,7 @@ L6: r53 = pytype_from_template(r52, r50, r51) r54 = unicode_8 :: static ('__mypyc_attrs__') r55 = () :: tuple - r56 = setattr r53, r54, r55 + r56 = PyObject_SetAttr(r53, r54, r55) __main__.S = r53 :: type r57 = __main__.globals :: static r58 = unicode_10 :: static ('S') @@ -457,7 +457,7 @@ L6: r74 = unicode_8 :: static ('__mypyc_attrs__') r75 = unicode_11 :: static ('__dict__') r76 = (r75) :: tuple - r77 = setattr r72, r74, r76 + r77 = PyObject_SetAttr(r72, r74, r76) __main__.D = r72 :: type r78 = __main__.globals :: static r79 = unicode_12 :: static ('D') diff --git a/mypyc/test-data/irbuild-optional.test b/mypyc/test-data/irbuild-optional.test index dbf8f760b477..3f25bf103c80 100644 --- a/mypyc/test-data/irbuild-optional.test +++ b/mypyc/test-data/irbuild-optional.test @@ -368,11 +368,11 @@ L3: def set(o, s): o :: union[__main__.A, __main__.B] s, r0 :: str - r1 :: bool + r1 :: int32 r2 :: None L0: r0 = unicode_5 :: static ('a') - r1 = setattr o, r0, s + r1 = PyObject_SetAttr(o, r0, s) r2 = None return r2 From 15ad658d00730cfb2a00a558719865ce5c4f795c Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Wed, 5 Aug 2020 14:21:11 +0800 Subject: [PATCH 09/10] set/del item --- mypyc/primitives/generic_ops.py | 30 +++++++++++++------------ mypyc/test-data/irbuild-any.test | 4 ++-- mypyc/test-data/irbuild-basic.test | 2 +- mypyc/test-data/irbuild-statements.test | 26 ++++++++++----------- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/mypyc/primitives/generic_ops.py b/mypyc/primitives/generic_ops.py index f748a051bac8..a4a4bcba345d 100644 --- a/mypyc/primitives/generic_ops.py +++ b/mypyc/primitives/generic_ops.py @@ -12,8 +12,8 @@ from mypyc.ir.ops import ERR_NEVER, ERR_MAGIC, ERR_FALSE, ERR_NEG_INT from mypyc.ir.rtypes import object_rprimitive, int_rprimitive, bool_rprimitive, c_int_rprimitive from mypyc.primitives.registry import ( - binary_op, unary_op, func_op, method_op, custom_op, call_emit, simple_emit, - call_negative_bool_emit, call_negative_magic_emit, negative_int_emit, + binary_op, unary_op, func_op, custom_op, call_emit, simple_emit, + call_negative_magic_emit, negative_int_emit, c_binary_op, c_unary_op, c_method_op, c_function_op, c_custom_op ) @@ -131,20 +131,22 @@ priority=0) # obj1[obj2] = obj3 -method_op('__setitem__', - arg_types=[object_rprimitive, object_rprimitive, object_rprimitive], - result_type=bool_rprimitive, - error_kind=ERR_FALSE, - emit=call_negative_bool_emit('PyObject_SetItem'), - priority=0) +c_method_op( + name='__setitem__', + arg_types=[object_rprimitive, object_rprimitive, object_rprimitive], + return_type=bool_rprimitive, + c_function_name='PyObject_SetItem', + error_kind=ERR_FALSE, + priority=0) # del obj1[obj2] -method_op('__delitem__', - arg_types=[object_rprimitive, object_rprimitive], - result_type=bool_rprimitive, - error_kind=ERR_FALSE, - emit=call_negative_bool_emit('PyObject_DelItem'), - priority=0) +c_method_op( + name='__delitem__', + arg_types=[object_rprimitive, object_rprimitive], + return_type=c_int_rprimitive, + c_function_name='PyObject_DelItem', + error_kind=ERR_NEG_INT, + priority=0) # hash(obj) c_function_op( diff --git a/mypyc/test-data/irbuild-any.test b/mypyc/test-data/irbuild-any.test index f1a1f9a849e9..a165f6d8a61b 100644 --- a/mypyc/test-data/irbuild-any.test +++ b/mypyc/test-data/irbuild-any.test @@ -113,9 +113,9 @@ L0: r2 = PyObject_GetItem(l, a) r3 = box(int, n) r4 = box(int, n) - r5 = a.__setitem__(r3, r4) :: object + r5 = PyObject_SetItem(a, r3, r4) r6 = box(int, n) - r7 = l.__setitem__(a, r6) :: object + r7 = PyObject_SetItem(l, a, r6) r8 = CPyList_SetItem(l, n, a) r9 = box(int, n) r10 = [a, r9] diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index f4c096d76e06..697f149fd842 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -1102,7 +1102,7 @@ def f(x, y, z): r0 :: bool r1 :: None L0: - r0 = x.__setitem__(y, z) :: object + r0 = PyObject_SetItem(x, y, z) r1 = None return r1 diff --git a/mypyc/test-data/irbuild-statements.test b/mypyc/test-data/irbuild-statements.test index c1a73fbb5b0b..a3768d343cfb 100644 --- a/mypyc/test-data/irbuild-statements.test +++ b/mypyc/test-data/irbuild-statements.test @@ -709,7 +709,7 @@ def delList(): r0, r1 :: object r2, l :: list r3 :: object - r4 :: bool + r4 :: int32 r5 :: None L0: r0 = box(short_int, 2) @@ -717,18 +717,18 @@ L0: r2 = [r0, r1] l = r2 r3 = box(short_int, 2) - r4 = l.__delitem__(r3) :: object + r4 = PyObject_DelItem(l, r3) r5 = None return r5 def delListMultiple(): r0, r1, r2, r3, r4, r5, r6 :: object r7, l :: list r8 :: object - r9 :: bool + r9 :: int32 r10 :: object - r11 :: bool + r11 :: int32 r12 :: object - r13 :: bool + r13 :: int32 r14 :: None L0: r0 = box(short_int, 2) @@ -741,11 +741,11 @@ L0: r7 = [r0, r1, r2, r3, r4, r5, r6] l = r7 r8 = box(short_int, 2) - r9 = l.__delitem__(r8) :: object + r9 = PyObject_DelItem(l, r8) r10 = box(short_int, 4) - r11 = l.__delitem__(r10) :: object + r11 = PyObject_DelItem(l, r10) r12 = box(short_int, 6) - r13 = l.__delitem__(r12) :: object + r13 = PyObject_DelItem(l, r12) r14 = None return r14 @@ -763,7 +763,7 @@ def delDict(): r2, r3 :: object r4, d :: dict r5 :: str - r6 :: bool + r6 :: int32 r7 :: None L0: r0 = unicode_1 :: static ('one') @@ -773,7 +773,7 @@ L0: r4 = CPyDict_Build(2, r0, r2, r1, r3) d = r4 r5 = unicode_1 :: static ('one') - r6 = d.__delitem__(r5) :: object + r6 = PyObject_DelItem(d, r5) r7 = None return r7 def delDictMultiple(): @@ -784,7 +784,7 @@ def delDictMultiple(): r4, r5, r6, r7 :: object r8, d :: dict r9, r10 :: str - r11, r12 :: bool + r11, r12 :: int32 r13 :: None L0: r0 = unicode_1 :: static ('one') @@ -799,8 +799,8 @@ L0: d = r8 r9 = unicode_1 :: static ('one') r10 = unicode_4 :: static ('four') - r11 = d.__delitem__(r9) :: object - r12 = d.__delitem__(r10) :: object + r11 = PyObject_DelItem(d, r9) + r12 = PyObject_DelItem(d, r10) r13 = None return r13 From 8b2afb8a3f25b54ddba0bb1b897aff4fd6762cb5 Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Wed, 5 Aug 2020 14:34:25 +0800 Subject: [PATCH 10/10] fix --- mypyc/primitives/generic_ops.py | 6 +++--- mypyc/test-data/irbuild-any.test | 5 +++-- mypyc/test-data/irbuild-basic.test | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mypyc/primitives/generic_ops.py b/mypyc/primitives/generic_ops.py index a4a4bcba345d..39d8f6cd279f 100644 --- a/mypyc/primitives/generic_ops.py +++ b/mypyc/primitives/generic_ops.py @@ -9,7 +9,7 @@ check that the priorities are configured properly. """ -from mypyc.ir.ops import ERR_NEVER, ERR_MAGIC, ERR_FALSE, ERR_NEG_INT +from mypyc.ir.ops import ERR_NEVER, ERR_MAGIC, ERR_NEG_INT from mypyc.ir.rtypes import object_rprimitive, int_rprimitive, bool_rprimitive, c_int_rprimitive from mypyc.primitives.registry import ( binary_op, unary_op, func_op, custom_op, call_emit, simple_emit, @@ -134,9 +134,9 @@ c_method_op( name='__setitem__', arg_types=[object_rprimitive, object_rprimitive, object_rprimitive], - return_type=bool_rprimitive, + return_type=c_int_rprimitive, c_function_name='PyObject_SetItem', - error_kind=ERR_FALSE, + error_kind=ERR_NEG_INT, priority=0) # del obj1[obj2] diff --git a/mypyc/test-data/irbuild-any.test b/mypyc/test-data/irbuild-any.test index a165f6d8a61b..71ae2bfa457d 100644 --- a/mypyc/test-data/irbuild-any.test +++ b/mypyc/test-data/irbuild-any.test @@ -101,9 +101,10 @@ def f2(a, n, l): n :: int l :: list r0, r1, r2, r3, r4 :: object - r5 :: bool + r5 :: int32 r6 :: object - r7, r8 :: bool + r7 :: int32 + r8 :: bool r9 :: object r10 :: list r11 :: None diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index 697f149fd842..6a6cd086642c 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -1099,7 +1099,7 @@ def f(x: Any, y: Any, z: Any) -> None: [out] def f(x, y, z): x, y, z :: object - r0 :: bool + r0 :: int32 r1 :: None L0: r0 = PyObject_SetItem(x, y, z)