txlyre 1 dienu atpakaļ
vecāks
revīzija
562f0fceef
1 mainītis faili ar 36 papildinājumiem un 4 dzēšanām
  1. 36 4
      qic.c

+ 36 - 4
qic.c

@@ -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;