Commit 2dbba0c
committed
Leave a forwarded vararg placeholder on the packed path
A vararg constructor is reached through a generated new_C wrapper that passes
its own vararg parameter to construct_C. When a call above the bound keeps
that wrapper as the retained original, its body still holds the forwarding
call, and the placeholder is one node standing for however many arguments the
caller passed. Counting nodes turned it into an arity, so construct_C_1 was
generated and the call rewritten to it: every argument after the first was
dropped and the constructor ran on one value.
Node count is only an arity when no node is a placeholder, so calls that
forward one are now left alone. This is Lua-only in effect. The forwarding
call survives in the body of a vararg original, and a copy has its
placeholder expanded into real parameters long before anything counts them
again, so only originals match - which Jass removes and Lua retains.
Both the generation and the rewrite loop consult the same predicate. Skipping
generation alone would not have been enough: another call can produce a copy
at the same node count, and the rewrite would then redirect the forwarding
call to it regardless.
The existing above-the-bound test used a plain function, which has no wrapper
and so never forwards. The new test uses a constructor and fails on the
constructed value before this change.1 parent 99f5dae commit 2dbba0c
2 files changed
Lines changed: 72 additions & 4 deletions
File tree
- de.peeeq.wurstscript/src
- main/java/de/peeeq/wurstscript/translation/imtranslation
- test/java/tests/wurstscript/tests
Lines changed: 39 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
61 | | - | |
| 61 | + | |
62 | 62 | | |
63 | 63 | | |
64 | 64 | | |
| |||
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
75 | | - | |
| 75 | + | |
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
| |||
90 | 90 | | |
91 | 91 | | |
92 | 92 | | |
93 | | - | |
| 93 | + | |
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
100 | 100 | | |
101 | | - | |
| 101 | + | |
102 | 102 | | |
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
107 | 107 | | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
108 | 143 | | |
109 | 144 | | |
110 | 145 | | |
| |||
Lines changed: 33 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2096 | 2096 | | |
2097 | 2097 | | |
2098 | 2098 | | |
| 2099 | + | |
| 2100 | + | |
| 2101 | + | |
| 2102 | + | |
| 2103 | + | |
| 2104 | + | |
| 2105 | + | |
| 2106 | + | |
| 2107 | + | |
| 2108 | + | |
| 2109 | + | |
| 2110 | + | |
| 2111 | + | |
| 2112 | + | |
| 2113 | + | |
| 2114 | + | |
| 2115 | + | |
| 2116 | + | |
| 2117 | + | |
| 2118 | + | |
| 2119 | + | |
| 2120 | + | |
| 2121 | + | |
| 2122 | + | |
| 2123 | + | |
| 2124 | + | |
| 2125 | + | |
| 2126 | + | |
| 2127 | + | |
| 2128 | + | |
| 2129 | + | |
| 2130 | + | |
| 2131 | + | |
2099 | 2132 | | |
2100 | 2133 | | |
2101 | 2134 | | |
| |||
0 commit comments