|
| 1 | +import copy |
| 2 | + |
1 | 3 | from vyper.codegen.core import _freshname, eval_once_check, make_setter
|
2 | 4 | from vyper.codegen.ir_node import IRnode
|
3 | 5 | from vyper.evm.address_space import MEMORY
|
@@ -66,7 +68,26 @@ def ir_for_self_call(stmt_expr, context):
|
66 | 68 |
|
67 | 69 | # note: dst_tuple_t != args_tuple_t
|
68 | 70 | dst_tuple_t = TupleT(tuple(func_t.argument_types))
|
69 |
| - args_dst = IRnode(func_t._ir_info.frame_info.frame_start, typ=dst_tuple_t, location=MEMORY) |
| 71 | + if context.settings.experimental_codegen: |
| 72 | + arg_items = ["multi"] |
| 73 | + frame_info = func_t._ir_info.frame_info |
| 74 | + |
| 75 | + for var in frame_info.frame_vars.values(): |
| 76 | + var = copy.copy(var) |
| 77 | + alloca = var.alloca |
| 78 | + assert alloca is not None |
| 79 | + assert isinstance(var.pos, str) # help mypy |
| 80 | + if not var.pos.startswith("$palloca"): |
| 81 | + continue |
| 82 | + newname = var.pos.replace("$palloca", "$calloca") |
| 83 | + var.pos = newname |
| 84 | + irnode = var.as_ir_node() |
| 85 | + irnode.passthrough_metadata["alloca"] = alloca |
| 86 | + arg_items.append(irnode) |
| 87 | + args_dst = IRnode.from_list(arg_items, typ=dst_tuple_t) |
| 88 | + else: |
| 89 | + # legacy |
| 90 | + args_dst = IRnode(func_t._ir_info.frame_info.frame_start, typ=dst_tuple_t, location=MEMORY) |
70 | 91 |
|
71 | 92 | # if one of the arguments is a self call, the argument
|
72 | 93 | # buffer could get borked. to prevent against that,
|
|
0 commit comments