diff options
| -rw-r--r-- | pez.c | 99 | ||||
| -rw-r--r-- | t/emanyloc.pez | 29 | ||||
| -rw-r--r-- | t/emanyupval.pez | 49 |
3 files changed, 154 insertions, 23 deletions
@@ -1995,7 +1995,6 @@ f_arraypush(PezContext *cx, int argc) { Array *arr; TRY(pez_checksig(cx, argc, "array#push", "array, any")); - assert(isobj_of(cx->stktop[-2], PEZ_TArray)); arr = unbox_obj(cx->stktop[-2]); TRY(arrpushn(cx, arr, peek(cx), 1)); return push(cx, box_obj(arr)); @@ -2222,8 +2221,12 @@ addlocal(Comp *cm, uint *idx, const char *name, bool mutable, bool has_k, Val k) .has_k = has_k, .mutable = mutable, }; assert(l.scope > 0); - assert(l.sref == cm->spool.len); - assert(l.kref == cm->kpool.len); + if (l.sref != cm->spool.len) { + return comperr(cm, *name, "locals name pool overflow"), NULL; + } + if (has_k && l.kref != cm->kpool.len) { + return comperr(cm, *name, "constants pool overflow"), NULL; + } TRY(vecpush(cm->cx, &cm->spool, name, strlen(name) + 1)); if (mutable) { assert(!has_k); @@ -2271,7 +2274,9 @@ addupval(Comp *cm, struct fenv *fenv, uint8_t idx, bool arg, bool local) return up->idx; } } - assert(fenv->nupval < 256 && "upval limit"); + if (fenv->nupval == 256) { + return comperr(cm, peekchr(cm), "too many upvalues"), -2; + } fenv->upvals[fenv->nupval] = up; return fenv->nupval++; } @@ -2644,19 +2649,24 @@ primaryexpr(Comp *cm) if (local) { Local: if (local->isparam) { - assert(local->index < 256); + if (local->index >= 256) { + return comperr(cm, *buf, "too many locals"), 0; + } TRY(compop(cm, Oarg) && compbyte(cm, local->index)); } else if (local->has_k) { cm->has_k = 1; cm->k = cm->kpool.at[local->kref]; } else { - assert(local->index < 256); + if (local->index >= 256) { + return comperr(cm, *buf, "too many locals"), 0; + } TRY(compop(cm, Olocal) && compbyte(cm, local->index)); } cm->lvalue = 1; cm->lvalue_const = !local->mutable; cm->lvalue_name = &cm->spool.at[local->sref]; } else if ((idx = findupval(cm, &local, &cm->fenv, buf)) != -1) { + if (idx == -2) return 0; // propagate some error assert(idx >= 0 && idx < 256); TRY(compop(cm, Oupval) && compbyte(cm, idx)); cm->lvalue = 1; @@ -2677,7 +2687,9 @@ primaryexpr(Comp *cm) // enum-like string int i = 0; while (!aissep2((c = peekchr(cm)))) { - assert(i < sizeof buf - 2); + if (i >= sizeof buf - 2) { + return comperr(cm, c, "enum-like string too long"), 0; + } buf[i++] = c; nextchr(cm); } @@ -2701,10 +2713,16 @@ primaryexpr(Comp *cm) if (c == '"') { // string int i = 0; + vec_of(char) big = {0}; + bool bigp = 0; while ((c = nextchr(cm)) != '"') { - assert(i < sizeof buf - 2); + if (i >= sizeof buf - 2) { + bigp = 1; + vecpush(cm->cx, &big, buf, i); + } if (c == EOF) { Eof: + delvec(cm->cx, &big); return comperr(cm, c, "unterminated string constant"), 0; } if (c == '\\') { @@ -2732,13 +2750,30 @@ primaryexpr(Comp *cm) break; } case EOF: goto Eof; - default: Bad: comperr(cm, c, "bad escape sequence"); return 0; + default: Bad: + delvec(cm->cx, &big); + return comperr(cm, c, "bad escape sequence"), 0; } } - buf[i++] = c; + if (bigp) { + if (!vecpush(cm->cx, &big, &c, 1)) { + delvec(cm->cx, &big); + return 0; + } + } else { + buf[i++] = c; + } } - buf[i] = 0; - TRY(box_str(cm->cx, &cm->k, buf, i)); + if (bigp) { + vecpush(cm->cx, &big, "", 1); + } else { + buf[i] = 0; + } + if (!box_str(cm->cx, &cm->k, buf, i)) { + delvec(cm->cx, &big); + return 0; + } + delvec(cm->cx, &big); cm->has_k = 1; return 1; } @@ -3210,7 +3245,9 @@ logicexpr(Comp *cm) TRY(flushconst(cm)); off = diff = *ip - br_jumpfrom; - assert(off == diff); + if (off != diff) { + return comperr(cm, peekchr(cm), "branch target too far"), 0; + } memcpy(cm->code.at + br_arg, &off, 2); resetlastops(cm); @@ -3275,13 +3312,17 @@ condexpr(Comp *cm) TRY(expectspchr(cm, ':')); off = diff = *ip - bf_jumpfrom; - assert(off == diff); + if (off != diff) { + return comperr(cm, peekchr(cm), "branch target too far"), 0; + } memcpy(&cm->code.at[bf_arg], &off, 2); TRY(condexpr(cm) && flushconst(cm)); off = diff = *ip - b_jumpfrom; - assert(off == diff); + if (off != diff) { + return comperr(cm, peekchr(cm), "branch target too far"), 0; + } memcpy(&cm->code.at[b_arg], &off, 2); resetlastops(cm); @@ -3532,11 +3573,15 @@ forstmt(Comp *cm) TRY(compop(cm, Ob)); off = diff = b_jumpto - (*ip + 2); - assert(off == diff); + if (off != diff) { + return comperr(cm, peekchr(cm), "branch target too far"), 0; + } TRY(compbytes(cm, &off, 2)); off = diff = *ip - bf_jumpfrom; - assert(off == diff); + if (off != diff) { + return comperr(cm, peekchr(cm), "branch target too far"), 0; + } memcpy(cm->code.at + bf_arg, &off, 2); } else { // FOR [@x: ini][cond][cont] body @@ -3562,6 +3607,9 @@ forstmt(Comp *cm) beginscope(cm); TRY(decl(cm, &local, /* nofold */ 1) && discard(cm)); assert(local); + if (local->index >= 256) { + return comperr(cm, cm->spool.at[local->sref], "too many locals"), 0; + } ilocal = local - cm->fenv.locals.at; TRY(expectspchr(cm, ']')); @@ -3591,7 +3639,9 @@ forstmt(Comp *cm) assert(!cm->has_k); ncont = *ip - cont; assert(ncont > 0 && "?"); - assert(ncont < 256 && "cont too big"); + if (ncont > 256) { + return comperr(cm, peekchr(cm), "internal error: FOR cont expression too big"), 0; + } memcpy(tmp, cm->code.at + cont, ncont); *ip -= ncont; resetlastops(cm); @@ -3604,19 +3654,22 @@ forstmt(Comp *cm) resetlastops(cm); local = &cm->fenv.locals.at[ilocal]; TRY(compop(cm, local->isparam ? Osetarg : Osetloc)); - assert(local->index < 256); TRY(compbyte(cm, local->index)); TRY(compop(cm, Ob)); off = diff = b_jumpto - (*ip + 2); - assert(off == diff); + if (off != diff) { + return comperr(cm, peekchr(cm), "branch target too far"), 0; + } TRY(compbytes(cm, &off, 2)); off = diff = *ip - bf_jumpfrom; - assert(off == diff); + if (off != diff) { + return comperr(cm, peekchr(cm), "branch target too far"), 0; + } memcpy(cm->code.at + bf_arg, &off, 2); - endscope(cm); + TRY(endscope(cm)); } resetlastops(cm); @@ -3688,7 +3741,7 @@ block(Comp *cm, int endchr) return comperr(cm, EOF, "unexpected end of input"), 0; } nextchr(cm); - endscope(cm); + TRY(endscope(cm)); return 1; } diff --git a/t/emanyloc.pez b/t/emanyloc.pez new file mode 100644 index 0000000..c3cfd28 --- /dev/null +++ b/t/emanyloc.pez @@ -0,0 +1,29 @@ +@a0 = 0 @a1 = 0 @a2 = 0 @a3 = 0 @a4 = 0 @a5 = 0 @a6 = 0 @a7 = 0 @a8 = 0 @a9 = 0 +@a10 = 0 @a11 = 0 @a12 = 0 @a13 = 0 @a14 = 0 @a15 = 0 @a16 = 0 @a17 = 0 @a18 = 0 @a19 = 0 +@a20 = 0 @a21 = 0 @a22 = 0 @a23 = 0 @a24 = 0 @a25 = 0 @a26 = 0 @a27 = 0 @a28 = 0 @a29 = 0 +@a30 = 0 @a31 = 0 @a32 = 0 @a33 = 0 @a34 = 0 @a35 = 0 @a36 = 0 @a37 = 0 @a38 = 0 @a39 = 0 +@a40 = 0 @a41 = 0 @a42 = 0 @a43 = 0 @a44 = 0 @a45 = 0 @a46 = 0 @a47 = 0 @a48 = 0 @a49 = 0 +@a50 = 0 @a51 = 0 @a52 = 0 @a53 = 0 @a54 = 0 @a55 = 0 @a56 = 0 @a57 = 0 @a58 = 0 @a59 = 0 +@a60 = 0 @a61 = 0 @a62 = 0 @a63 = 0 @a64 = 0 @a65 = 0 @a66 = 0 @a67 = 0 @a68 = 0 @a69 = 0 +@a70 = 0 @a71 = 0 @a72 = 0 @a73 = 0 @a74 = 0 @a75 = 0 @a76 = 0 @a77 = 0 @a78 = 0 @a79 = 0 +@a80 = 0 @a81 = 0 @a82 = 0 @a83 = 0 @a84 = 0 @a85 = 0 @a86 = 0 @a87 = 0 @a88 = 0 @a89 = 0 +@a90 = 0 @a91 = 0 @a92 = 0 @a93 = 0 @a94 = 0 @a95 = 0 @a96 = 0 @a97 = 0 @a98 = 0 @a99 = 0 +@a100 = 0 @a101 = 0 @a102 = 0 @a103 = 0 @a104 = 0 @a105 = 0 @a106 = 0 @a107 = 0 @a108 = 0 @a109 = 0 +@a110 = 0 @a111 = 0 @a112 = 0 @a113 = 0 @a114 = 0 @a115 = 0 @a116 = 0 @a117 = 0 @a118 = 0 @a119 = 0 +@a120 = 0 @a121 = 0 @a122 = 0 @a123 = 0 @a124 = 0 @a125 = 0 @a126 = 0 @a127 = 0 @a128 = 0 @a129 = 0 +@a130 = 0 @a131 = 0 @a132 = 0 @a133 = 0 @a134 = 0 @a135 = 0 @a136 = 0 @a137 = 0 @a138 = 0 @a139 = 0 +@a140 = 0 @a141 = 0 @a142 = 0 @a143 = 0 @a144 = 0 @a145 = 0 @a146 = 0 @a147 = 0 @a148 = 0 @a149 = 0 +@a150 = 0 @a151 = 0 @a152 = 0 @a153 = 0 @a154 = 0 @a155 = 0 @a156 = 0 @a157 = 0 @a158 = 0 @a159 = 0 +@a160 = 0 @a161 = 0 @a162 = 0 @a163 = 0 @a164 = 0 @a165 = 0 @a166 = 0 @a167 = 0 @a168 = 0 @a169 = 0 +@a170 = 0 @a171 = 0 @a172 = 0 @a173 = 0 @a174 = 0 @a175 = 0 @a176 = 0 @a177 = 0 @a178 = 0 @a179 = 0 +@a180 = 0 @a181 = 0 @a182 = 0 @a183 = 0 @a184 = 0 @a185 = 0 @a186 = 0 @a187 = 0 @a188 = 0 @a189 = 0 +@a190 = 0 @a191 = 0 @a192 = 0 @a193 = 0 @a194 = 0 @a195 = 0 @a196 = 0 @a197 = 0 @a198 = 0 @a199 = 0 +@a200 = 0 @a201 = 0 @a202 = 0 @a203 = 0 @a204 = 0 @a205 = 0 @a206 = 0 @a207 = 0 @a208 = 0 @a209 = 0 +@a210 = 0 @a211 = 0 @a212 = 0 @a213 = 0 @a214 = 0 @a215 = 0 @a216 = 0 @a217 = 0 @a218 = 0 @a219 = 0 +@a220 = 0 @a221 = 0 @a222 = 0 @a223 = 0 @a224 = 0 @a225 = 0 @a226 = 0 @a227 = 0 @a228 = 0 @a229 = 0 +@a230 = 0 @a231 = 0 @a232 = 0 @a233 = 0 @a234 = 0 @a235 = 0 @a236 = 0 @a237 = 0 @a238 = 0 @a239 = 0 +@a240 = 0 @a241 = 0 @a242 = 0 @a243 = 0 @a244 = 0 @a245 = 0 @a246 = 0 @a247 = 0 @a248 = 0 @a249 = 0 +@a250 = 0 @a251 = 0 @a252 = 0 @a253 = 0 @a254 = 0 @a255 = 0 + +@K : 0 ; this is ok (constant folded) +@a256 = 0 ; this tips it diff --git a/t/emanyupval.pez b/t/emanyupval.pez new file mode 100644 index 0000000..99e213a --- /dev/null +++ b/t/emanyupval.pez @@ -0,0 +1,49 @@ +@a0 = 0 @a1 = 0 @a2 = 0 @a3 = 0 @a4 = 0 @a5 = 0 @a6 = 0 @a7 = 0 @a8 = 0 @a9 = 0 +@a10 = 0 @a11 = 0 @a12 = 0 @a13 = 0 @a14 = 0 @a15 = 0 @a16 = 0 @a17 = 0 @a18 = 0 @a19 = 0 +@a20 = 0 @a21 = 0 @a22 = 0 @a23 = 0 @a24 = 0 @a25 = 0 @a26 = 0 @a27 = 0 @a28 = 0 @a29 = 0 +@a30 = 0 @a31 = 0 @a32 = 0 @a33 = 0 @a34 = 0 @a35 = 0 @a36 = 0 @a37 = 0 @a38 = 0 @a39 = 0 +@a40 = 0 @a41 = 0 @a42 = 0 @a43 = 0 @a44 = 0 @a45 = 0 @a46 = 0 @a47 = 0 @a48 = 0 @a49 = 0 +@a50 = 0 @a51 = 0 @a52 = 0 @a53 = 0 @a54 = 0 @a55 = 0 @a56 = 0 @a57 = 0 @a58 = 0 @a59 = 0 +@a60 = 0 @a61 = 0 @a62 = 0 @a63 = 0 @a64 = 0 @a65 = 0 @a66 = 0 @a67 = 0 @a68 = 0 @a69 = 0 +@a70 = 0 @a71 = 0 @a72 = 0 @a73 = 0 @a74 = 0 @a75 = 0 @a76 = 0 @a77 = 0 @a78 = 0 @a79 = 0 +@a80 = 0 @a81 = 0 @a82 = 0 @a83 = 0 @a84 = 0 @a85 = 0 @a86 = 0 @a87 = 0 @a88 = 0 @a89 = 0 +@a90 = 0 @a91 = 0 @a92 = 0 @a93 = 0 @a94 = 0 @a95 = 0 @a96 = 0 @a97 = 0 @a98 = 0 @a99 = 0 +@a100 = 0 @a101 = 0 @a102 = 0 @a103 = 0 @a104 = 0 @a105 = 0 @a106 = 0 @a107 = 0 @a108 = 0 @a109 = 0 +@a110 = 0 @a111 = 0 @a112 = 0 @a113 = 0 @a114 = 0 @a115 = 0 @a116 = 0 @a117 = 0 @a118 = 0 @a119 = 0 +@a120 = 0 @a121 = 0 @a122 = 0 @a123 = 0 @a124 = 0 @a125 = 0 @a126 = 0 @a127 = 0 @a128 = 0 @a129 = 0 +@a130 = 0 @a131 = 0 @a132 = 0 @a133 = 0 @a134 = 0 @a135 = 0 @a136 = 0 @a137 = 0 @a138 = 0 @a139 = 0 +@a140 = 0 @a141 = 0 @a142 = 0 @a143 = 0 @a144 = 0 @a145 = 0 @a146 = 0 @a147 = 0 @a148 = 0 @a149 = 0 +@a150 = 0 @a151 = 0 @a152 = 0 @a153 = 0 @a154 = 0 @a155 = 0 @a156 = 0 @a157 = 0 @a158 = 0 @a159 = 0 +@a160 = 0 @a161 = 0 @a162 = 0 @a163 = 0 @a164 = 0 @a165 = 0 @a166 = 0 @a167 = 0 @a168 = 0 @a169 = 0 +@a170 = 0 @a171 = 0 @a172 = 0 @a173 = 0 @a174 = 0 @a175 = 0 @a176 = 0 @a177 = 0 @a178 = 0 @a179 = 0 +@a180 = 0 @a181 = 0 @a182 = 0 @a183 = 0 @a184 = 0 @a185 = 0 @a186 = 0 @a187 = 0 @a188 = 0 @a189 = 0 +@a190 = 0 @a191 = 0 @a192 = 0 @a193 = 0 @a194 = 0 @a195 = 0 @a196 = 0 @a197 = 0 @a198 = 0 @a199 = 0 +@a200 = 0 @a201 = 0 @a202 = 0 @a203 = 0 @a204 = 0 @a205 = 0 @a206 = 0 @a207 = 0 @a208 = 0 @a209 = 0 +@a210 = 0 @a211 = 0 @a212 = 0 @a213 = 0 @a214 = 0 @a215 = 0 @a216 = 0 @a217 = 0 @a218 = 0 @a219 = 0 +@a220 = 0 @a221 = 0 @a222 = 0 @a223 = 0 @a224 = 0 @a225 = 0 @a226 = 0 @a227 = 0 @a228 = 0 @a229 = 0 +@a230 = 0 @a231 = 0 @a232 = 0 @a233 = 0 @a234 = 0 @a235 = 0 @a236 = 0 @a237 = 0 @a238 = 0 @a239 = 0 +@a240 = 0 @a241 = 0 @a242 = 0 @a243 = 0 @a244 = 0 @a245 = 0 @a246 = 0 @a247 = 0 @a248 = 0 @a249 = 0 +@a250 = 0 @a251 = 0 @a252 = 0 @a253 = 0 @a254 = 0 @a255 = 0 + +{ + @K : 1 + @x = 0 + { + a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 + a20 a21 a22 a23 a24 a25 a26 a27 a28 a29 a30 a31 a32 a33 a34 a35 a36 a37 a38 a39 + a40 a41 a42 a43 a44 a45 a46 a47 a48 a49 a50 a51 a52 a53 a54 a55 a56 a57 a58 a59 + a60 a61 a62 a63 a64 a65 a66 a67 a68 a69 a70 a71 a72 a73 a74 a75 a76 a77 a78 a79 + a80 a81 a82 a83 a84 a85 a86 a87 a88 a89 a90 a91 a92 a93 a94 a95 a96 a97 a98 a99 + a100 a101 a102 a103 a104 a105 a106 a107 a108 a109 a110 a111 a112 a113 a114 a115 a116 a117 a118 a119 + a120 a121 a122 a123 a124 a125 a126 a127 a128 a129 a130 a131 a132 a133 a134 a135 a136 a137 a138 a139 + a140 a141 a142 a143 a144 a145 a146 a147 a148 a149 a150 a151 a152 a153 a154 a155 a156 a157 a158 a159 + a160 a161 a162 a163 a164 a165 a166 a167 a168 a169 a170 a171 a172 a173 a174 a175 a176 a177 a178 a179 + a180 a181 a182 a183 a184 a185 a186 a187 a188 a189 a190 a191 a192 a193 a194 a195 a196 a197 a198 a199 + a200 a201 a202 a203 a204 a205 a206 a207 a208 a209 a210 a211 a212 a213 a214 a215 a216 a217 a218 a219 + a220 a221 a222 a223 a224 a225 a226 a227 a228 a229 a230 a231 a232 a233 a234 a235 a236 a237 a238 a239 + a240 a241 a242 a243 a244 a245 a246 a247 a248 a249 a250 a251 a252 a253 a254 a255 + + K+K + x+x + } +} |