|
| 1 | +(module |
| 2 | + |
| 3 | + ;; Callee has ~1000 const cells (500 unique i64 constants). |
| 4 | + ;; When tiny_caller does a return_call to this function, the fast interpreter |
| 5 | + ;; must stage the parameter at frame->operand + callee->const_cell_num. |
| 6 | + ;; Without the fix, this write extends past the end of tiny_caller's small |
| 7 | + ;; frame and corrupts adjacent heap memory. |
| 8 | + (func $callee (param i32) (result i32) |
| 9 | + (drop (i64.add (i64.const 100000000001) (i64.const 100000000002))) |
| 10 | + (drop (i64.add (i64.const 100000000003) (i64.const 100000000004))) |
| 11 | + (drop (i64.add (i64.const 100000000005) (i64.const 100000000006))) |
| 12 | + (drop (i64.add (i64.const 100000000007) (i64.const 100000000008))) |
| 13 | + (drop (i64.add (i64.const 100000000009) (i64.const 100000000010))) |
| 14 | + (drop (i64.add (i64.const 100000000011) (i64.const 100000000012))) |
| 15 | + (drop (i64.add (i64.const 100000000013) (i64.const 100000000014))) |
| 16 | + (drop (i64.add (i64.const 100000000015) (i64.const 100000000016))) |
| 17 | + (drop (i64.add (i64.const 100000000017) (i64.const 100000000018))) |
| 18 | + (drop (i64.add (i64.const 100000000019) (i64.const 100000000020))) |
| 19 | + (drop (i64.add (i64.const 100000000021) (i64.const 100000000022))) |
| 20 | + (drop (i64.add (i64.const 100000000023) (i64.const 100000000024))) |
| 21 | + (drop (i64.add (i64.const 100000000025) (i64.const 100000000026))) |
| 22 | + (drop (i64.add (i64.const 100000000027) (i64.const 100000000028))) |
| 23 | + (drop (i64.add (i64.const 100000000029) (i64.const 100000000030))) |
| 24 | + (drop (i64.add (i64.const 100000000031) (i64.const 100000000032))) |
| 25 | + (drop (i64.add (i64.const 100000000033) (i64.const 100000000034))) |
| 26 | + (drop (i64.add (i64.const 100000000035) (i64.const 100000000036))) |
| 27 | + (drop (i64.add (i64.const 100000000037) (i64.const 100000000038))) |
| 28 | + (drop (i64.add (i64.const 100000000039) (i64.const 100000000040))) |
| 29 | + (drop (i64.add (i64.const 100000000041) (i64.const 100000000042))) |
| 30 | + (drop (i64.add (i64.const 100000000043) (i64.const 100000000044))) |
| 31 | + (drop (i64.add (i64.const 100000000045) (i64.const 100000000046))) |
| 32 | + (drop (i64.add (i64.const 100000000047) (i64.const 100000000048))) |
| 33 | + (drop (i64.add (i64.const 100000000049) (i64.const 100000000050))) |
| 34 | + (drop (i64.add (i64.const 100000000051) (i64.const 100000000052))) |
| 35 | + (drop (i64.add (i64.const 100000000053) (i64.const 100000000054))) |
| 36 | + (drop (i64.add (i64.const 100000000055) (i64.const 100000000056))) |
| 37 | + (drop (i64.add (i64.const 100000000057) (i64.const 100000000058))) |
| 38 | + (drop (i64.add (i64.const 100000000059) (i64.const 100000000060))) |
| 39 | + (drop (i64.add (i64.const 100000000061) (i64.const 100000000062))) |
| 40 | + (drop (i64.add (i64.const 100000000063) (i64.const 100000000064))) |
| 41 | + (drop (i64.add (i64.const 100000000065) (i64.const 100000000066))) |
| 42 | + (drop (i64.add (i64.const 100000000067) (i64.const 100000000068))) |
| 43 | + (drop (i64.add (i64.const 100000000069) (i64.const 100000000070))) |
| 44 | + (drop (i64.add (i64.const 100000000071) (i64.const 100000000072))) |
| 45 | + (drop (i64.add (i64.const 100000000073) (i64.const 100000000074))) |
| 46 | + (drop (i64.add (i64.const 100000000075) (i64.const 100000000076))) |
| 47 | + (drop (i64.add (i64.const 100000000077) (i64.const 100000000078))) |
| 48 | + (drop (i64.add (i64.const 100000000079) (i64.const 100000000080))) |
| 49 | + (drop (i64.add (i64.const 100000000081) (i64.const 100000000082))) |
| 50 | + (drop (i64.add (i64.const 100000000083) (i64.const 100000000084))) |
| 51 | + (drop (i64.add (i64.const 100000000085) (i64.const 100000000086))) |
| 52 | + (drop (i64.add (i64.const 100000000087) (i64.const 100000000088))) |
| 53 | + (drop (i64.add (i64.const 100000000089) (i64.const 100000000090))) |
| 54 | + (drop (i64.add (i64.const 100000000091) (i64.const 100000000092))) |
| 55 | + (drop (i64.add (i64.const 100000000093) (i64.const 100000000094))) |
| 56 | + (drop (i64.add (i64.const 100000000095) (i64.const 100000000096))) |
| 57 | + (drop (i64.add (i64.const 100000000097) (i64.const 100000000098))) |
| 58 | + (drop (i64.add (i64.const 100000000099) (i64.const 100000000100))) |
| 59 | + (drop (i64.add (i64.const 100000000101) (i64.const 100000000102))) |
| 60 | + (drop (i64.add (i64.const 100000000103) (i64.const 100000000104))) |
| 61 | + (drop (i64.add (i64.const 100000000105) (i64.const 100000000106))) |
| 62 | + (drop (i64.add (i64.const 100000000107) (i64.const 100000000108))) |
| 63 | + (drop (i64.add (i64.const 100000000109) (i64.const 100000000110))) |
| 64 | + (drop (i64.add (i64.const 100000000111) (i64.const 100000000112))) |
| 65 | + (drop (i64.add (i64.const 100000000113) (i64.const 100000000114))) |
| 66 | + (drop (i64.add (i64.const 100000000115) (i64.const 100000000116))) |
| 67 | + (drop (i64.add (i64.const 100000000117) (i64.const 100000000118))) |
| 68 | + (drop (i64.add (i64.const 100000000119) (i64.const 100000000120))) |
| 69 | + (drop (i64.add (i64.const 100000000121) (i64.const 100000000122))) |
| 70 | + (drop (i64.add (i64.const 100000000123) (i64.const 100000000124))) |
| 71 | + (drop (i64.add (i64.const 100000000125) (i64.const 100000000126))) |
| 72 | + (drop (i64.add (i64.const 100000000127) (i64.const 100000000128))) |
| 73 | + (drop (i64.add (i64.const 100000000129) (i64.const 100000000130))) |
| 74 | + (drop (i64.add (i64.const 100000000131) (i64.const 100000000132))) |
| 75 | + (drop (i64.add (i64.const 100000000133) (i64.const 100000000134))) |
| 76 | + (drop (i64.add (i64.const 100000000135) (i64.const 100000000136))) |
| 77 | + (drop (i64.add (i64.const 100000000137) (i64.const 100000000138))) |
| 78 | + (drop (i64.add (i64.const 100000000139) (i64.const 100000000140))) |
| 79 | + (drop (i64.add (i64.const 100000000141) (i64.const 100000000142))) |
| 80 | + (drop (i64.add (i64.const 100000000143) (i64.const 100000000144))) |
| 81 | + (drop (i64.add (i64.const 100000000145) (i64.const 100000000146))) |
| 82 | + (drop (i64.add (i64.const 100000000147) (i64.const 100000000148))) |
| 83 | + (drop (i64.add (i64.const 100000000149) (i64.const 100000000150))) |
| 84 | + (drop (i64.add (i64.const 100000000151) (i64.const 100000000152))) |
| 85 | + (drop (i64.add (i64.const 100000000153) (i64.const 100000000154))) |
| 86 | + (drop (i64.add (i64.const 100000000155) (i64.const 100000000156))) |
| 87 | + (drop (i64.add (i64.const 100000000157) (i64.const 100000000158))) |
| 88 | + (drop (i64.add (i64.const 100000000159) (i64.const 100000000160))) |
| 89 | + (drop (i64.add (i64.const 100000000161) (i64.const 100000000162))) |
| 90 | + (drop (i64.add (i64.const 100000000163) (i64.const 100000000164))) |
| 91 | + (drop (i64.add (i64.const 100000000165) (i64.const 100000000166))) |
| 92 | + (drop (i64.add (i64.const 100000000167) (i64.const 100000000168))) |
| 93 | + (drop (i64.add (i64.const 100000000169) (i64.const 100000000170))) |
| 94 | + (drop (i64.add (i64.const 100000000171) (i64.const 100000000172))) |
| 95 | + (drop (i64.add (i64.const 100000000173) (i64.const 100000000174))) |
| 96 | + (drop (i64.add (i64.const 100000000175) (i64.const 100000000176))) |
| 97 | + (drop (i64.add (i64.const 100000000177) (i64.const 100000000178))) |
| 98 | + (drop (i64.add (i64.const 100000000179) (i64.const 100000000180))) |
| 99 | + (drop (i64.add (i64.const 100000000181) (i64.const 100000000182))) |
| 100 | + (drop (i64.add (i64.const 100000000183) (i64.const 100000000184))) |
| 101 | + (drop (i64.add (i64.const 100000000185) (i64.const 100000000186))) |
| 102 | + (drop (i64.add (i64.const 100000000187) (i64.const 100000000188))) |
| 103 | + (drop (i64.add (i64.const 100000000189) (i64.const 100000000190))) |
| 104 | + (drop (i64.add (i64.const 100000000191) (i64.const 100000000192))) |
| 105 | + (drop (i64.add (i64.const 100000000193) (i64.const 100000000194))) |
| 106 | + (drop (i64.add (i64.const 100000000195) (i64.const 100000000196))) |
| 107 | + (drop (i64.add (i64.const 100000000197) (i64.const 100000000198))) |
| 108 | + (drop (i64.add (i64.const 100000000199) (i64.const 100000000200))) |
| 109 | + (drop (i64.add (i64.const 100000000201) (i64.const 100000000202))) |
| 110 | + (drop (i64.add (i64.const 100000000203) (i64.const 100000000204))) |
| 111 | + (drop (i64.add (i64.const 100000000205) (i64.const 100000000206))) |
| 112 | + (drop (i64.add (i64.const 100000000207) (i64.const 100000000208))) |
| 113 | + (drop (i64.add (i64.const 100000000209) (i64.const 100000000210))) |
| 114 | + (drop (i64.add (i64.const 100000000211) (i64.const 100000000212))) |
| 115 | + (drop (i64.add (i64.const 100000000213) (i64.const 100000000214))) |
| 116 | + (drop (i64.add (i64.const 100000000215) (i64.const 100000000216))) |
| 117 | + (drop (i64.add (i64.const 100000000217) (i64.const 100000000218))) |
| 118 | + (drop (i64.add (i64.const 100000000219) (i64.const 100000000220))) |
| 119 | + (drop (i64.add (i64.const 100000000221) (i64.const 100000000222))) |
| 120 | + (drop (i64.add (i64.const 100000000223) (i64.const 100000000224))) |
| 121 | + (drop (i64.add (i64.const 100000000225) (i64.const 100000000226))) |
| 122 | + (drop (i64.add (i64.const 100000000227) (i64.const 100000000228))) |
| 123 | + (drop (i64.add (i64.const 100000000229) (i64.const 100000000230))) |
| 124 | + (drop (i64.add (i64.const 100000000231) (i64.const 100000000232))) |
| 125 | + (drop (i64.add (i64.const 100000000233) (i64.const 100000000234))) |
| 126 | + (drop (i64.add (i64.const 100000000235) (i64.const 100000000236))) |
| 127 | + (drop (i64.add (i64.const 100000000237) (i64.const 100000000238))) |
| 128 | + (drop (i64.add (i64.const 100000000239) (i64.const 100000000240))) |
| 129 | + (drop (i64.add (i64.const 100000000241) (i64.const 100000000242))) |
| 130 | + (drop (i64.add (i64.const 100000000243) (i64.const 100000000244))) |
| 131 | + (drop (i64.add (i64.const 100000000245) (i64.const 100000000246))) |
| 132 | + (drop (i64.add (i64.const 100000000247) (i64.const 100000000248))) |
| 133 | + (drop (i64.add (i64.const 100000000249) (i64.const 100000000250))) |
| 134 | + (drop (i64.add (i64.const 100000000251) (i64.const 100000000252))) |
| 135 | + (drop (i64.add (i64.const 100000000253) (i64.const 100000000254))) |
| 136 | + (drop (i64.add (i64.const 100000000255) (i64.const 100000000256))) |
| 137 | + (drop (i64.add (i64.const 100000000257) (i64.const 100000000258))) |
| 138 | + (drop (i64.add (i64.const 100000000259) (i64.const 100000000260))) |
| 139 | + (drop (i64.add (i64.const 100000000261) (i64.const 100000000262))) |
| 140 | + (drop (i64.add (i64.const 100000000263) (i64.const 100000000264))) |
| 141 | + (drop (i64.add (i64.const 100000000265) (i64.const 100000000266))) |
| 142 | + (drop (i64.add (i64.const 100000000267) (i64.const 100000000268))) |
| 143 | + (drop (i64.add (i64.const 100000000269) (i64.const 100000000270))) |
| 144 | + (drop (i64.add (i64.const 100000000271) (i64.const 100000000272))) |
| 145 | + (drop (i64.add (i64.const 100000000273) (i64.const 100000000274))) |
| 146 | + (drop (i64.add (i64.const 100000000275) (i64.const 100000000276))) |
| 147 | + (drop (i64.add (i64.const 100000000277) (i64.const 100000000278))) |
| 148 | + (drop (i64.add (i64.const 100000000279) (i64.const 100000000280))) |
| 149 | + (drop (i64.add (i64.const 100000000281) (i64.const 100000000282))) |
| 150 | + (drop (i64.add (i64.const 100000000283) (i64.const 100000000284))) |
| 151 | + (drop (i64.add (i64.const 100000000285) (i64.const 100000000286))) |
| 152 | + (drop (i64.add (i64.const 100000000287) (i64.const 100000000288))) |
| 153 | + (drop (i64.add (i64.const 100000000289) (i64.const 100000000290))) |
| 154 | + (drop (i64.add (i64.const 100000000291) (i64.const 100000000292))) |
| 155 | + (drop (i64.add (i64.const 100000000293) (i64.const 100000000294))) |
| 156 | + (drop (i64.add (i64.const 100000000295) (i64.const 100000000296))) |
| 157 | + (drop (i64.add (i64.const 100000000297) (i64.const 100000000298))) |
| 158 | + (drop (i64.add (i64.const 100000000299) (i64.const 100000000300))) |
| 159 | + (drop (i64.add (i64.const 100000000301) (i64.const 100000000302))) |
| 160 | + (drop (i64.add (i64.const 100000000303) (i64.const 100000000304))) |
| 161 | + (drop (i64.add (i64.const 100000000305) (i64.const 100000000306))) |
| 162 | + (drop (i64.add (i64.const 100000000307) (i64.const 100000000308))) |
| 163 | + (drop (i64.add (i64.const 100000000309) (i64.const 100000000310))) |
| 164 | + (drop (i64.add (i64.const 100000000311) (i64.const 100000000312))) |
| 165 | + (drop (i64.add (i64.const 100000000313) (i64.const 100000000314))) |
| 166 | + (drop (i64.add (i64.const 100000000315) (i64.const 100000000316))) |
| 167 | + (drop (i64.add (i64.const 100000000317) (i64.const 100000000318))) |
| 168 | + (drop (i64.add (i64.const 100000000319) (i64.const 100000000320))) |
| 169 | + (drop (i64.add (i64.const 100000000321) (i64.const 100000000322))) |
| 170 | + (drop (i64.add (i64.const 100000000323) (i64.const 100000000324))) |
| 171 | + (drop (i64.add (i64.const 100000000325) (i64.const 100000000326))) |
| 172 | + (drop (i64.add (i64.const 100000000327) (i64.const 100000000328))) |
| 173 | + (drop (i64.add (i64.const 100000000329) (i64.const 100000000330))) |
| 174 | + (drop (i64.add (i64.const 100000000331) (i64.const 100000000332))) |
| 175 | + (drop (i64.add (i64.const 100000000333) (i64.const 100000000334))) |
| 176 | + (drop (i64.add (i64.const 100000000335) (i64.const 100000000336))) |
| 177 | + (drop (i64.add (i64.const 100000000337) (i64.const 100000000338))) |
| 178 | + (drop (i64.add (i64.const 100000000339) (i64.const 100000000340))) |
| 179 | + (drop (i64.add (i64.const 100000000341) (i64.const 100000000342))) |
| 180 | + (drop (i64.add (i64.const 100000000343) (i64.const 100000000344))) |
| 181 | + (drop (i64.add (i64.const 100000000345) (i64.const 100000000346))) |
| 182 | + (drop (i64.add (i64.const 100000000347) (i64.const 100000000348))) |
| 183 | + (drop (i64.add (i64.const 100000000349) (i64.const 100000000350))) |
| 184 | + (drop (i64.add (i64.const 100000000351) (i64.const 100000000352))) |
| 185 | + (drop (i64.add (i64.const 100000000353) (i64.const 100000000354))) |
| 186 | + (drop (i64.add (i64.const 100000000355) (i64.const 100000000356))) |
| 187 | + (drop (i64.add (i64.const 100000000357) (i64.const 100000000358))) |
| 188 | + (drop (i64.add (i64.const 100000000359) (i64.const 100000000360))) |
| 189 | + (drop (i64.add (i64.const 100000000361) (i64.const 100000000362))) |
| 190 | + (drop (i64.add (i64.const 100000000363) (i64.const 100000000364))) |
| 191 | + (drop (i64.add (i64.const 100000000365) (i64.const 100000000366))) |
| 192 | + (drop (i64.add (i64.const 100000000367) (i64.const 100000000368))) |
| 193 | + (drop (i64.add (i64.const 100000000369) (i64.const 100000000370))) |
| 194 | + (drop (i64.add (i64.const 100000000371) (i64.const 100000000372))) |
| 195 | + (drop (i64.add (i64.const 100000000373) (i64.const 100000000374))) |
| 196 | + (drop (i64.add (i64.const 100000000375) (i64.const 100000000376))) |
| 197 | + (drop (i64.add (i64.const 100000000377) (i64.const 100000000378))) |
| 198 | + (drop (i64.add (i64.const 100000000379) (i64.const 100000000380))) |
| 199 | + (drop (i64.add (i64.const 100000000381) (i64.const 100000000382))) |
| 200 | + (drop (i64.add (i64.const 100000000383) (i64.const 100000000384))) |
| 201 | + (drop (i64.add (i64.const 100000000385) (i64.const 100000000386))) |
| 202 | + (drop (i64.add (i64.const 100000000387) (i64.const 100000000388))) |
| 203 | + (drop (i64.add (i64.const 100000000389) (i64.const 100000000390))) |
| 204 | + (drop (i64.add (i64.const 100000000391) (i64.const 100000000392))) |
| 205 | + (drop (i64.add (i64.const 100000000393) (i64.const 100000000394))) |
| 206 | + (drop (i64.add (i64.const 100000000395) (i64.const 100000000396))) |
| 207 | + (drop (i64.add (i64.const 100000000397) (i64.const 100000000398))) |
| 208 | + (drop (i64.add (i64.const 100000000399) (i64.const 100000000400))) |
| 209 | + (drop (i64.add (i64.const 100000000401) (i64.const 100000000402))) |
| 210 | + (drop (i64.add (i64.const 100000000403) (i64.const 100000000404))) |
| 211 | + (drop (i64.add (i64.const 100000000405) (i64.const 100000000406))) |
| 212 | + (drop (i64.add (i64.const 100000000407) (i64.const 100000000408))) |
| 213 | + (drop (i64.add (i64.const 100000000409) (i64.const 100000000410))) |
| 214 | + (drop (i64.add (i64.const 100000000411) (i64.const 100000000412))) |
| 215 | + (drop (i64.add (i64.const 100000000413) (i64.const 100000000414))) |
| 216 | + (drop (i64.add (i64.const 100000000415) (i64.const 100000000416))) |
| 217 | + (drop (i64.add (i64.const 100000000417) (i64.const 100000000418))) |
| 218 | + (drop (i64.add (i64.const 100000000419) (i64.const 100000000420))) |
| 219 | + (drop (i64.add (i64.const 100000000421) (i64.const 100000000422))) |
| 220 | + (drop (i64.add (i64.const 100000000423) (i64.const 100000000424))) |
| 221 | + (drop (i64.add (i64.const 100000000425) (i64.const 100000000426))) |
| 222 | + (drop (i64.add (i64.const 100000000427) (i64.const 100000000428))) |
| 223 | + (drop (i64.add (i64.const 100000000429) (i64.const 100000000430))) |
| 224 | + (drop (i64.add (i64.const 100000000431) (i64.const 100000000432))) |
| 225 | + (drop (i64.add (i64.const 100000000433) (i64.const 100000000434))) |
| 226 | + (drop (i64.add (i64.const 100000000435) (i64.const 100000000436))) |
| 227 | + (drop (i64.add (i64.const 100000000437) (i64.const 100000000438))) |
| 228 | + (drop (i64.add (i64.const 100000000439) (i64.const 100000000440))) |
| 229 | + (drop (i64.add (i64.const 100000000441) (i64.const 100000000442))) |
| 230 | + (drop (i64.add (i64.const 100000000443) (i64.const 100000000444))) |
| 231 | + (drop (i64.add (i64.const 100000000445) (i64.const 100000000446))) |
| 232 | + (drop (i64.add (i64.const 100000000447) (i64.const 100000000448))) |
| 233 | + (drop (i64.add (i64.const 100000000449) (i64.const 100000000450))) |
| 234 | + (drop (i64.add (i64.const 100000000451) (i64.const 100000000452))) |
| 235 | + (drop (i64.add (i64.const 100000000453) (i64.const 100000000454))) |
| 236 | + (drop (i64.add (i64.const 100000000455) (i64.const 100000000456))) |
| 237 | + (drop (i64.add (i64.const 100000000457) (i64.const 100000000458))) |
| 238 | + (drop (i64.add (i64.const 100000000459) (i64.const 100000000460))) |
| 239 | + (drop (i64.add (i64.const 100000000461) (i64.const 100000000462))) |
| 240 | + (drop (i64.add (i64.const 100000000463) (i64.const 100000000464))) |
| 241 | + (drop (i64.add (i64.const 100000000465) (i64.const 100000000466))) |
| 242 | + (drop (i64.add (i64.const 100000000467) (i64.const 100000000468))) |
| 243 | + (drop (i64.add (i64.const 100000000469) (i64.const 100000000470))) |
| 244 | + (drop (i64.add (i64.const 100000000471) (i64.const 100000000472))) |
| 245 | + (drop (i64.add (i64.const 100000000473) (i64.const 100000000474))) |
| 246 | + (drop (i64.add (i64.const 100000000475) (i64.const 100000000476))) |
| 247 | + (drop (i64.add (i64.const 100000000477) (i64.const 100000000478))) |
| 248 | + (drop (i64.add (i64.const 100000000479) (i64.const 100000000480))) |
| 249 | + (drop (i64.add (i64.const 100000000481) (i64.const 100000000482))) |
| 250 | + (drop (i64.add (i64.const 100000000483) (i64.const 100000000484))) |
| 251 | + (drop (i64.add (i64.const 100000000485) (i64.const 100000000486))) |
| 252 | + (drop (i64.add (i64.const 100000000487) (i64.const 100000000488))) |
| 253 | + (drop (i64.add (i64.const 100000000489) (i64.const 100000000490))) |
| 254 | + (drop (i64.add (i64.const 100000000491) (i64.const 100000000492))) |
| 255 | + (drop (i64.add (i64.const 100000000493) (i64.const 100000000494))) |
| 256 | + (drop (i64.add (i64.const 100000000495) (i64.const 100000000496))) |
| 257 | + (drop (i64.add (i64.const 100000000497) (i64.const 100000000498))) |
| 258 | + (drop (i64.add (i64.const 100000000499) (i64.const 100000000500))) |
| 259 | + (local.get 0) |
| 260 | + ) |
| 261 | + |
| 262 | + ;; Tiny caller: no locals, no constants. Does a return_call to $callee. |
| 263 | + ;; This is the vulnerable site: tiny_caller's frame has const_cell_num=0 |
| 264 | + ;; but $callee has const_cell_num~=1000, so without the fix the fast |
| 265 | + ;; interpreter writes the staged parameter ~4000 bytes past the end of |
| 266 | + ;; tiny_caller's frame. |
| 267 | + (func $tiny_caller (result i32) |
| 268 | + (return_call $callee (i32.const 42)) |
| 269 | + ) |
| 270 | + |
| 271 | + ;; Builds up 1000 normal call frames then tail-calls through tiny_caller. |
| 272 | + (func $fill (param i32) (result i32) |
| 273 | + (if (result i32) (i32.gt_s (local.get 0) (i32.const 0)) |
| 274 | + (then (call $fill (i32.sub (local.get 0) (i32.const 1)))) |
| 275 | + (else (call $tiny_caller)) |
| 276 | + ) |
| 277 | + ) |
| 278 | + |
| 279 | + (func (export "test") (result i32) |
| 280 | + (call $fill (i32.const 1000)) |
| 281 | + ) |
| 282 | +) |
0 commit comments