|
28 | 28 | Var,
|
29 | 29 | )
|
30 | 30 | from mypy.types import CallableType, get_proper_type
|
31 |
| -from mypyc.common import LAMBDA_NAME, SELF_NAME |
| 31 | +from mypyc.common import LAMBDA_NAME, PROPSET_PREFIX, SELF_NAME |
32 | 32 | from mypyc.ir.class_ir import ClassIR, NonExtClassInfo
|
33 | 33 | from mypyc.ir.func_ir import (
|
34 | 34 | FUNC_CLASSMETHOD,
|
@@ -1026,3 +1026,34 @@ def get_native_impl_ids(builder: IRBuilder, singledispatch_func: FuncDef) -> dic
|
1026 | 1026 | """
|
1027 | 1027 | impls = builder.singledispatch_impls[singledispatch_func]
|
1028 | 1028 | return {impl: i for i, (typ, impl) in enumerate(impls) if not is_decorated(builder, impl)}
|
| 1029 | + |
| 1030 | + |
| 1031 | +def gen_property_getter_ir(builder: IRBuilder, func_decl: FuncDecl, cdef: ClassDef) -> FuncIR: |
| 1032 | + """Generate an implicit trivial property getter for an attribute. |
| 1033 | +
|
| 1034 | + These are used if an attribute can also be accessed as a property. |
| 1035 | + """ |
| 1036 | + name = func_decl.name |
| 1037 | + builder.enter(name) |
| 1038 | + self_reg = builder.add_argument("self", func_decl.sig.args[0].type) |
| 1039 | + value = builder.builder.get_attr(self_reg, name, func_decl.sig.ret_type, -1) |
| 1040 | + builder.add(Return(value)) |
| 1041 | + args, _, blocks, ret_type, fn_info = builder.leave() |
| 1042 | + return FuncIR(func_decl, args, blocks) |
| 1043 | + |
| 1044 | + |
| 1045 | +def gen_property_setter_ir(builder: IRBuilder, func_decl: FuncDecl, cdef: ClassDef) -> FuncIR: |
| 1046 | + """Generate an implicit trivial property setter for an attribute. |
| 1047 | +
|
| 1048 | + These are used if an attribute can also be accessed as a property. |
| 1049 | + """ |
| 1050 | + name = func_decl.name |
| 1051 | + builder.enter(name) |
| 1052 | + self_reg = builder.add_argument("self", func_decl.sig.args[0].type) |
| 1053 | + value_reg = builder.add_argument("value", func_decl.sig.args[1].type) |
| 1054 | + assert name.startswith(PROPSET_PREFIX) |
| 1055 | + attr_name = name[len(PROPSET_PREFIX) :] |
| 1056 | + builder.add(SetAttr(self_reg, attr_name, value_reg, -1)) |
| 1057 | + builder.add(Return(builder.none())) |
| 1058 | + args, _, blocks, ret_type, fn_info = builder.leave() |
| 1059 | + return FuncIR(func_decl, args, blocks) |
0 commit comments