|
@@ -1866,9 +1866,17 @@ node_t *parse_stmt(list_t *tokens, size_t *pos) {
|
|
|
node_t *d = BLOCK();
|
|
|
|
|
|
return NODE4(FOR, a, b, c, d);
|
|
|
- } else if (MATCH(BREAK)) return NODE0(BREAK);
|
|
|
- else if (MATCH(CONTINUE)) return NODE0(CONTINUE);
|
|
|
- else if (MATCH(FUNC))
|
|
|
+ } else if (MATCH(BREAK)) {
|
|
|
+ if (AT(NUMBER) && !CLIFF)
|
|
|
+ return NODET(BREAK, tokens->data[(*pos)++]);
|
|
|
+
|
|
|
+ return NODE0(BREAK);
|
|
|
+ } else if (MATCH(CONTINUE)) {
|
|
|
+ if (AT(NUMBER) && !CLIFF)
|
|
|
+ return NODET(CONTINUE, tokens->data[(*pos)++]);
|
|
|
+
|
|
|
+ return NODE0(CONTINUE);
|
|
|
+ } else if (MATCH(FUNC))
|
|
|
return parse_func(tokens, pos, 0);
|
|
|
else if (MATCH(RETURN)) {
|
|
|
node_t *a = NULL;
|
|
@@ -2710,7 +2718,9 @@ const char *STD[][2] = {
|
|
|
" if type(w) != \"string\"\n"
|
|
|
" throw \"expected second argument to be: string, but got: \" + type(w)\n"
|
|
|
" for var i = 0; i < len(s); i++\n"
|
|
|
- " if slice(s, i, i+len(w)-1) == w\n"
|
|
|
+ " if len(w) == 1 && s[i] == w\n"
|
|
|
+ " return i\n"
|
|
|
+ " elif slice(s, i, i+len(w)-1) == w\n"
|
|
|
" return i\n"
|
|
|
" return -1\n"
|
|
|
"}\n"
|
|
@@ -3499,6 +3509,17 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, stack_t *lstk, sta
|
|
|
if (!INCTX("for") && !INCTX("switch"))
|
|
|
COMPILE_ERROR("break outside of a loop or a switch");
|
|
|
|
|
|
+ if (node->t) {
|
|
|
+ unsigned int offset = abs(atoi(node->t->text)) + 1;
|
|
|
+
|
|
|
+ if (offset < 2 || offset > lstk->length)
|
|
|
+ COMPILE_ERROR("%d is not a valid break loop offset", offset-1);
|
|
|
+
|
|
|
+ EMIT("goto __break%d;", lstk->data[lstk->length-offset]);
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
EMIT("goto __break%d;", in_switch(ctx)? SID: LID);
|
|
|
break;
|
|
|
|
|
@@ -3506,6 +3527,17 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, stack_t *lstk, sta
|
|
|
if (!INCTX("for"))
|
|
|
COMPILE_ERROR("continue outside of a loop");
|
|
|
|
|
|
+ if (node->t) {
|
|
|
+ unsigned int offset = abs(atoi(node->t->text)) + 1;
|
|
|
+
|
|
|
+ if (offset < 2 || offset > lstk->length)
|
|
|
+ COMPILE_ERROR("%d is not a valid continue loop offset", offset-1);
|
|
|
+
|
|
|
+ EMIT("goto __continue%d;", lstk->data[lstk->length-offset]);
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
EMIT("goto __continue%d;", LID);
|
|
|
break;
|
|
|
|