|
@@ -615,7 +615,7 @@ token_t *tokenize_string(char *source, size_t *pos, size_t *size) {
|
|
buf[k++] = source[(*pos)++];
|
|
buf[k++] = source[(*pos)++];
|
|
}
|
|
}
|
|
|
|
|
|
- if (k != 2)
|
|
|
|
|
|
+ if (k != 2 || (!size && strncmp(buf, "00", 2) == 0))
|
|
LEX_ERROR("malformed \\x escape sequence");
|
|
LEX_ERROR("malformed \\x escape sequence");
|
|
|
|
|
|
buf[k] = 0;
|
|
buf[k] = 0;
|
|
@@ -2411,7 +2411,7 @@ node_t *parse_func(list_t *tokens, size_t *pos, int is_expr) {
|
|
char *l = ((token_t *)tokens->data[(*pos)++])->text;
|
|
char *l = ((token_t *)tokens->data[(*pos)++])->text;
|
|
node_t *r = NULL;
|
|
node_t *r = NULL;
|
|
|
|
|
|
- if (!flag && AT(ASSIGN))
|
|
|
|
|
|
+ if (!flag && strcmp(l, "_") != 0 && AT(ASSIGN))
|
|
flag = 1;
|
|
flag = 1;
|
|
|
|
|
|
if (flag) {
|
|
if (flag) {
|
|
@@ -3639,7 +3639,7 @@ void compile_func(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
|
|
entry.key, argc + 1, argc);
|
|
entry.key, argc + 1, argc);
|
|
compile_node(gbuf, tbuf, ctx, ltab, lstk, sstk, lbl, pair->data[1]);
|
|
compile_node(gbuf, tbuf, ctx, ltab, lstk, sstk, lbl, pair->data[1]);
|
|
buffer_fmt(tbuf, ");\n");
|
|
buffer_fmt(tbuf, ");\n");
|
|
- } else
|
|
|
|
|
|
+ } else if (strcmp(entry.key, "_") != 0)
|
|
buffer_fmt(tbuf, "qi_decl(state, \"%s\", qi_list_index(pargs, %d));\n",
|
|
buffer_fmt(tbuf, "qi_decl(state, \"%s\", qi_list_index(pargs, %d));\n",
|
|
entry.key, argc);
|
|
entry.key, argc);
|
|
|
|
|
|
@@ -6232,11 +6232,12 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
|
|
compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, node->a);
|
|
compile_node(gbuf, buf, ctx, ltab, lstk, sstk, lbl, node->a);
|
|
EMIT(");\n");
|
|
EMIT(");\n");
|
|
|
|
|
|
- if (node->tag == N_FOROFVAR) {
|
|
|
|
|
|
+ if (node->tag == N_FOROFVAR && strcmp(node->t->text, "_") != 0) {
|
|
EMIT("qi_decl(state, \"%s\", state->nil);\n", node->t->text);
|
|
EMIT("qi_decl(state, \"%s\", state->nil);\n", node->t->text);
|
|
} else if (node->tag == N_FOROFVARUNPACK) {
|
|
} else if (node->tag == N_FOROFVARUNPACK) {
|
|
for (size_t i = 0; i < node->l->length; i++)
|
|
for (size_t i = 0; i < node->l->length; i++)
|
|
- EMIT("qi_decl(state, \"%s\", state->nil);\n", node->l->data[i]);
|
|
|
|
|
|
+ if (strcmp(node->l->data[i], "_") != 0)
|
|
|
|
+ EMIT("qi_decl(state, \"%s\", state->nil);\n", node->l->data[i]);
|
|
}
|
|
}
|
|
|
|
|
|
EMIT("for (qi_size_t length = _qi_length(state, %s), i = 0; i < length; "
|
|
EMIT("for (qi_size_t length = _qi_length(state, %s), i = 0; i < length; "
|
|
@@ -6245,13 +6246,25 @@ void compile_node(buffer_t *gbuf, buffer_t *buf, list_t *ctx, table_t *ltab,
|
|
|
|
|
|
if (node->tag == N_FOROFUNPACK || node->tag == N_FOROFVARUNPACK) {
|
|
if (node->tag == N_FOROFUNPACK || node->tag == N_FOROFVARUNPACK) {
|
|
for (size_t i = 0; i < node->l->length; i++)
|
|
for (size_t i = 0; i < node->l->length; i++)
|
|
- EMIT("qi_set(state, false, \"%s\", qi_index(state, qi_index(state, %s, "
|
|
|
|
- "qi_make_number(state, i)), qi_make_number(state, %d)));\n",
|
|
|
|
- node->l->data[i], varname, i);
|
|
|
|
- } else
|
|
|
|
- EMIT("qi_set(state, false, \"%s\", qi_index(state, %s, "
|
|
|
|
- "qi_make_number(state, i)));\n",
|
|
|
|
- node->t->text, varname);
|
|
|
|
|
|
+ if (strcmp(node->l->data[i], "_") == 0) {
|
|
|
|
+ EMIT("(void)(qi_index(state, qi_index(state, %s, "
|
|
|
|
+ "qi_make_number(state, i)), qi_make_number(state, %d)));\n",
|
|
|
|
+ varname, i);
|
|
|
|
+ } else {
|
|
|
|
+ EMIT("qi_set(state, false, \"%s\", qi_index(state, qi_index(state, %s, "
|
|
|
|
+ "qi_make_number(state, i)), qi_make_number(state, %d)));\n",
|
|
|
|
+ node->l->data[i], varname, i);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if (strcmp(node->t->text, "_") == 0) {
|
|
|
|
+ EMIT("(void)(qi_index(state, %s, qi_make_number(state, i)));\n",
|
|
|
|
+ varname);
|
|
|
|
+ } else {
|
|
|
|
+ EMIT("qi_set(state, false, \"%s\", qi_index(state, %s, "
|
|
|
|
+ "qi_make_number(state, i)));\n",
|
|
|
|
+ node->t->text, varname);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
CTXPUSH("scope");
|
|
CTXPUSH("scope");
|
|
EMIT("qi_new_scope(state);\n");
|
|
EMIT("qi_new_scope(state);\n");
|