summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-10-10 20:41:55 +0200
committerlemon <lsof@mailbox.org>2022-10-10 20:43:18 +0200
commit61ac668a962d265a0394fcab6ac534ed13784ef5 (patch)
tree3dc3d47af9ac4abd7dcaf8169a925db3b238badf
parent6c8f7191e4366676ca7ba2cac7259d57aade0dea (diff)
better error reporting
-rw-r--r--pez.c99
-rw-r--r--t/emanyloc.pez29
-rw-r--r--t/emanyupval.pez49
3 files changed, 154 insertions, 23 deletions
diff --git a/pez.c b/pez.c
index e000efa..3632544 100644
--- a/pez.c
+++ b/pez.c
@@ -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
+ }
+}