From 47204c5dff6a7737132d3ab46608a79f8d22c309 Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Thu, 13 Aug 2020 19:25:15 +0800 Subject: [PATCH 1/2] PyTuple_Pack op --- mypyc/irbuild/classdef.py | 18 +++++++++++------- mypyc/irbuild/ll_builder.py | 7 +++++-- mypyc/primitives/tuple_ops.py | 18 +++++++++--------- mypyc/test-data/irbuild-basic.test | 13 +++++++------ mypyc/test-data/irbuild-classes.test | 8 ++++---- mypyc/test-data/refcount.test | 2 +- 6 files changed, 37 insertions(+), 29 deletions(-) diff --git a/mypyc/irbuild/classdef.py b/mypyc/irbuild/classdef.py index cf88d9896db1..2c96c2ddd7f7 100644 --- a/mypyc/irbuild/classdef.py +++ b/mypyc/irbuild/classdef.py @@ -8,11 +8,11 @@ ) from mypyc.ir.ops import ( Value, Call, LoadErrorValue, LoadStatic, InitStatic, TupleSet, SetAttr, Return, - BasicBlock, Branch, MethodCall, NAMESPACE_TYPE, LoadAddress + BasicBlock, Branch, MethodCall, NAMESPACE_TYPE, LoadAddress, LoadInt ) from mypyc.ir.rtypes import ( RInstance, object_rprimitive, bool_rprimitive, dict_rprimitive, is_optional_type, - is_object_rprimitive, is_none_rprimitive + is_object_rprimitive, is_none_rprimitive, c_pyssize_t_rprimitive ) from mypyc.ir.func_ir import FuncIR, FuncDecl, FuncSignature, RuntimeArg from mypyc.ir.class_ir import ClassIR, NonExtClassInfo @@ -165,7 +165,8 @@ def allocate_class(builder: IRBuilder, cdef: ClassDef) -> Value: base_exprs = cdef.base_type_exprs + cdef.removed_base_type_exprs if base_exprs: bases = [builder.accept(x) for x in base_exprs] - tp_bases = builder.primitive_op(new_tuple_op, bases, cdef.line) + load_size_op = builder.add(LoadInt(len(bases), -1, c_pyssize_t_rprimitive)) + tp_bases = builder.call_c(new_tuple_op, [load_size_op] + bases, cdef.line) else: tp_bases = builder.add(LoadErrorValue(object_rprimitive, is_borrowed=True)) modname = builder.load_static_unicode(builder.module_name) @@ -219,7 +220,8 @@ def populate_non_ext_bases(builder: IRBuilder, cdef: ClassDef) -> Value: base = builder.load_global_str(cls.name, cdef.line) bases.append(base) - return builder.primitive_op(new_tuple_op, bases, cdef.line) + load_size_op = builder.add(LoadInt(len(bases), -1, c_pyssize_t_rprimitive)) + return builder.call_c(new_tuple_op, [load_size_op] + bases, cdef.line) def find_non_ext_metaclass(builder: IRBuilder, cdef: ClassDef, bases: Value) -> Value: @@ -465,9 +467,11 @@ def create_mypyc_attrs_tuple(builder: IRBuilder, ir: ClassIR, line: int) -> Valu attrs = [name for ancestor in ir.mro for name in ancestor.attributes] if ir.inherits_python: attrs.append('__dict__') - return builder.primitive_op(new_tuple_op, - [builder.load_static_unicode(attr) for attr in attrs], - line) + items = [builder.load_static_unicode(attr) for attr in attrs] + load_size_op = builder.add(LoadInt(len(items), -1, c_pyssize_t_rprimitive)) + return builder.call_c(new_tuple_op, + [load_size_op] + items, + line) def finish_non_ext_dict(builder: IRBuilder, non_ext: NonExtClassInfo, line: int) -> None: diff --git a/mypyc/irbuild/ll_builder.py b/mypyc/irbuild/ll_builder.py index 0e07092fdb63..7c03dc17d30e 100644 --- a/mypyc/irbuild/ll_builder.py +++ b/mypyc/irbuild/ll_builder.py @@ -267,7 +267,8 @@ def py_call(self, if len(star_arg_values) == 0: # We can directly construct a tuple if there are no star args. - pos_args_tuple = self.primitive_op(new_tuple_op, pos_arg_values, line) + load_size_op = self.add(LoadInt(len(pos_arg_values), -1, c_pyssize_t_rprimitive)) + pos_args_tuple = self.call_c(new_tuple_op, [load_size_op] + pos_arg_values, line) else: # Otherwise we construct a list and call extend it with the star args, since tuples # don't have an extend method. @@ -338,7 +339,9 @@ def native_args_to_positional(self, for lst, arg in zip(formal_to_actual, sig.args): output_arg = None if arg.kind == ARG_STAR: - output_arg = self.primitive_op(new_tuple_op, [args[i] for i in lst], line) + items = [args[i] for i in lst] + load_size_op = self.add(LoadInt(len(items), -1, c_pyssize_t_rprimitive)) + output_arg = self.call_c(new_tuple_op, [load_size_op] + items, line) elif arg.kind == ARG_STAR2: dict_entries = [(self.load_static_unicode(cast(str, arg_names[i])), args[i]) for i in lst] diff --git a/mypyc/primitives/tuple_ops.py b/mypyc/primitives/tuple_ops.py index 02746e7dd462..edd3d91a70a4 100644 --- a/mypyc/primitives/tuple_ops.py +++ b/mypyc/primitives/tuple_ops.py @@ -5,9 +5,11 @@ """ from mypyc.ir.ops import ERR_MAGIC -from mypyc.ir.rtypes import tuple_rprimitive, int_rprimitive, list_rprimitive, object_rprimitive +from mypyc.ir.rtypes import ( + tuple_rprimitive, int_rprimitive, list_rprimitive, object_rprimitive, c_pyssize_t_rprimitive +) from mypyc.primitives.registry import ( - c_method_op, custom_op, simple_emit, c_function_op + c_method_op, c_function_op, c_custom_op ) @@ -20,14 +22,12 @@ error_kind=ERR_MAGIC) # Construct a boxed tuple from items: (item1, item2, ...) -new_tuple_op = custom_op( - arg_types=[object_rprimitive], - result_type=tuple_rprimitive, - is_var_arg=True, +new_tuple_op = c_custom_op( + arg_types=[c_pyssize_t_rprimitive], + return_type=tuple_rprimitive, + c_function_name='PyTuple_Pack', error_kind=ERR_MAGIC, - steals=False, - format_str='{dest} = ({comma_args}) :: tuple', - emit=simple_emit('{dest} = PyTuple_Pack({num_args}{comma_if_args}{comma_args});')) + var_arg_type=object_rprimitive) # Construct tuple from a list. list_tuple_op = c_function_op( diff --git a/mypyc/test-data/irbuild-basic.test b/mypyc/test-data/irbuild-basic.test index a6691ac610e6..4d16f5d2c527 100644 --- a/mypyc/test-data/irbuild-basic.test +++ b/mypyc/test-data/irbuild-basic.test @@ -1258,7 +1258,7 @@ def call_python_function_with_keyword_arg(x): L0: r0 = load_address PyLong_Type r1 = unicode_3 :: static ('base') - r2 = (x) :: tuple + r2 = PyTuple_Pack(1, x) r3 = box(short_int, 4) r4 = CPyDict_Build(1, r1, r3) r5 = py_call_with_kwargs(r0, r2, r4) @@ -1287,7 +1287,7 @@ L0: r1 = CPyObject_GetAttr(xs, r0) r2 = unicode_5 :: static ('x') r3 = box(short_int, 0) - r4 = (r3) :: tuple + r4 = PyTuple_Pack(1, r3) r5 = box(int, first) r6 = CPyDict_Build(1, r2, r5) r7 = py_call_with_kwargs(r1, r4, r6) @@ -1295,7 +1295,7 @@ L0: r9 = CPyObject_GetAttr(xs, r8) r10 = unicode_5 :: static ('x') r11 = unicode_6 :: static ('i') - r12 = () :: tuple + r12 = PyTuple_Pack(0) r13 = box(int, second) r14 = box(short_int, 2) r15 = CPyDict_Build(2, r10, r13, r11, r14) @@ -1828,7 +1828,7 @@ L0: r7 = __main__.globals :: static r8 = unicode_6 :: static ('f') r9 = CPyDict_GetItem(r7, r8) - r10 = () :: tuple + r10 = PyTuple_Pack(0) r11 = PyDict_New() r12 = CPyDict_UpdateInDisplay(r11, r6) r13 = py_call_with_kwargs(r9, r10, r11) @@ -1840,7 +1840,8 @@ def h(): r2, r3 :: object r4, r5 :: dict r6 :: str - r7, r8 :: object + r7 :: object + r8 :: object r9 :: tuple r10 :: dict r11 :: int32 @@ -1856,7 +1857,7 @@ L0: r6 = unicode_6 :: static ('f') r7 = CPyDict_GetItem(r5, r6) r8 = box(short_int, 2) - r9 = (r8) :: tuple + r9 = PyTuple_Pack(1, r8) r10 = PyDict_New() r11 = CPyDict_UpdateInDisplay(r10, r4) r12 = py_call_with_kwargs(r7, r9, r10) diff --git a/mypyc/test-data/irbuild-classes.test b/mypyc/test-data/irbuild-classes.test index d2cf53e90c78..fd67f9246318 100644 --- a/mypyc/test-data/irbuild-classes.test +++ b/mypyc/test-data/irbuild-classes.test @@ -410,7 +410,7 @@ L6: r42 = pytype_from_template(r41, r39, r40) r43 = C_trait_vtable_setup() r44 = unicode_8 :: static ('__mypyc_attrs__') - r45 = () :: tuple + r45 = PyTuple_Pack(0) r46 = PyObject_SetAttr(r42, r44, r45) __main__.C = r42 :: type r47 = __main__.globals :: static @@ -421,7 +421,7 @@ L6: r52 = __main__.S_template :: type r53 = pytype_from_template(r52, r50, r51) r54 = unicode_8 :: static ('__mypyc_attrs__') - r55 = () :: tuple + r55 = PyTuple_Pack(0) r56 = PyObject_SetAttr(r53, r54, r55) __main__.S = r53 :: type r57 = __main__.globals :: static @@ -436,14 +436,14 @@ L6: r66 = unicode_6 :: static ('T') r67 = CPyDict_GetItem(r65, r66) r68 = PyObject_GetItem(r64, r67) - r69 = (r60, r61, r68) :: tuple + r69 = PyTuple_Pack(3, r60, r61, r68) r70 = unicode_7 :: static ('__main__') r71 = __main__.D_template :: type r72 = pytype_from_template(r71, r69, r70) r73 = D_trait_vtable_setup() r74 = unicode_8 :: static ('__mypyc_attrs__') r75 = unicode_11 :: static ('__dict__') - r76 = (r75) :: tuple + r76 = PyTuple_Pack(1, r75) r77 = PyObject_SetAttr(r72, r74, r76) __main__.D = r72 :: type r78 = __main__.globals :: static diff --git a/mypyc/test-data/refcount.test b/mypyc/test-data/refcount.test index 878acd578c8f..ec70afc6bb42 100644 --- a/mypyc/test-data/refcount.test +++ b/mypyc/test-data/refcount.test @@ -722,7 +722,7 @@ def g(x): L0: r0 = load_address PyLong_Type r1 = unicode_1 :: static ('base') - r2 = (x) :: tuple + r2 = PyTuple_Pack(1, x) r3 = box(short_int, 4) r4 = CPyDict_Build(1, r1, r3) dec_ref r3 From 03a0989d843ced5f634f6714762f52f8f3dd77fd Mon Sep 17 00:00:00 2001 From: Xuanda Yang Date: Thu, 13 Aug 2020 20:05:39 +0800 Subject: [PATCH 2/2] refactor, add new_tuple to builder --- mypyc/irbuild/builder.py | 3 +++ mypyc/irbuild/classdef.py | 16 +++++----------- mypyc/irbuild/ll_builder.py | 10 ++++++---- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/mypyc/irbuild/builder.py b/mypyc/irbuild/builder.py index 2b9c994ae47c..b9e7b9cf7c76 100644 --- a/mypyc/irbuild/builder.py +++ b/mypyc/irbuild/builder.py @@ -250,6 +250,9 @@ def compare_tagged(self, lhs: Value, rhs: Value, op: str, line: int) -> Value: def builtin_len(self, val: Value, line: int) -> Value: return self.builder.builtin_len(val, line) + def new_tuple(self, items: List[Value], line: int) -> Value: + return self.builder.new_tuple(items, line) + @property def environment(self) -> Environment: return self.builder.environment diff --git a/mypyc/irbuild/classdef.py b/mypyc/irbuild/classdef.py index 2c96c2ddd7f7..cfce0b369ef7 100644 --- a/mypyc/irbuild/classdef.py +++ b/mypyc/irbuild/classdef.py @@ -8,11 +8,11 @@ ) from mypyc.ir.ops import ( Value, Call, LoadErrorValue, LoadStatic, InitStatic, TupleSet, SetAttr, Return, - BasicBlock, Branch, MethodCall, NAMESPACE_TYPE, LoadAddress, LoadInt + BasicBlock, Branch, MethodCall, NAMESPACE_TYPE, LoadAddress ) from mypyc.ir.rtypes import ( RInstance, object_rprimitive, bool_rprimitive, dict_rprimitive, is_optional_type, - is_object_rprimitive, is_none_rprimitive, c_pyssize_t_rprimitive + is_object_rprimitive, is_none_rprimitive ) from mypyc.ir.func_ir import FuncIR, FuncDecl, FuncSignature, RuntimeArg from mypyc.ir.class_ir import ClassIR, NonExtClassInfo @@ -22,7 +22,6 @@ not_implemented_op ) from mypyc.primitives.dict_ops import dict_set_item_op, dict_new_op -from mypyc.primitives.tuple_ops import new_tuple_op from mypyc.common import SELF_NAME from mypyc.irbuild.util import ( is_dataclass_decorator, get_func_def, is_dataclass, is_constant, add_self_to_env @@ -165,8 +164,7 @@ def allocate_class(builder: IRBuilder, cdef: ClassDef) -> Value: base_exprs = cdef.base_type_exprs + cdef.removed_base_type_exprs if base_exprs: bases = [builder.accept(x) for x in base_exprs] - load_size_op = builder.add(LoadInt(len(bases), -1, c_pyssize_t_rprimitive)) - tp_bases = builder.call_c(new_tuple_op, [load_size_op] + bases, cdef.line) + tp_bases = builder.new_tuple(bases, cdef.line) else: tp_bases = builder.add(LoadErrorValue(object_rprimitive, is_borrowed=True)) modname = builder.load_static_unicode(builder.module_name) @@ -220,8 +218,7 @@ def populate_non_ext_bases(builder: IRBuilder, cdef: ClassDef) -> Value: base = builder.load_global_str(cls.name, cdef.line) bases.append(base) - load_size_op = builder.add(LoadInt(len(bases), -1, c_pyssize_t_rprimitive)) - return builder.call_c(new_tuple_op, [load_size_op] + bases, cdef.line) + return builder.new_tuple(bases, cdef.line) def find_non_ext_metaclass(builder: IRBuilder, cdef: ClassDef, bases: Value) -> Value: @@ -468,10 +465,7 @@ def create_mypyc_attrs_tuple(builder: IRBuilder, ir: ClassIR, line: int) -> Valu if ir.inherits_python: attrs.append('__dict__') items = [builder.load_static_unicode(attr) for attr in attrs] - load_size_op = builder.add(LoadInt(len(items), -1, c_pyssize_t_rprimitive)) - return builder.call_c(new_tuple_op, - [load_size_op] + items, - line) + return builder.new_tuple(items, line) def finish_non_ext_dict(builder: IRBuilder, non_ext: NonExtClassInfo, line: int) -> None: diff --git a/mypyc/irbuild/ll_builder.py b/mypyc/irbuild/ll_builder.py index 7c03dc17d30e..293e3df2d720 100644 --- a/mypyc/irbuild/ll_builder.py +++ b/mypyc/irbuild/ll_builder.py @@ -267,8 +267,7 @@ def py_call(self, if len(star_arg_values) == 0: # We can directly construct a tuple if there are no star args. - load_size_op = self.add(LoadInt(len(pos_arg_values), -1, c_pyssize_t_rprimitive)) - pos_args_tuple = self.call_c(new_tuple_op, [load_size_op] + pos_arg_values, line) + pos_args_tuple = self.new_tuple(pos_arg_values, line) else: # Otherwise we construct a list and call extend it with the star args, since tuples # don't have an extend method. @@ -340,8 +339,7 @@ def native_args_to_positional(self, output_arg = None if arg.kind == ARG_STAR: items = [args[i] for i in lst] - load_size_op = self.add(LoadInt(len(items), -1, c_pyssize_t_rprimitive)) - output_arg = self.call_c(new_tuple_op, [load_size_op] + items, line) + output_arg = self.new_tuple(items, line) elif arg.kind == ARG_STAR2: dict_entries = [(self.load_static_unicode(cast(str, arg_names[i])), args[i]) for i in lst] @@ -847,6 +845,10 @@ def builtin_len(self, val: Value, line: int) -> Value: else: return self.call_c(generic_len_op, [val], line) + def new_tuple(self, items: List[Value], line: int) -> Value: + load_size_op = self.add(LoadInt(len(items), -1, c_pyssize_t_rprimitive)) + return self.call_c(new_tuple_op, [load_size_op] + items, line) + # Internal helpers def decompose_union_helper(self, pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy