Fix assert fail if object literal key is not a string (fix #953)

This commit is contained in:
David Tolnay committed 2015-09-21 12:47:06 -07:00
1 parent 83ab4e273b
commit 154d0ee4a8
5 files changed
+455 -399

No files matched your search

+22
View File
@@ -164,6 +164,18 @@ int yylex(YYSTYPE* yylval, YYLTYPE* yylloc, block* answer, int* errors,
return tok;
}
/* Returns string message if the block is a constant that is not valid as an
* object key. */
static jv check_object_key(block k) {
if (block_is_const(k) && block_const_kind(k) != JV_KIND_STRING) {
char errbuf[15];
return jv_string_fmt("Cannot use %s (%s) as object key",
jv_kind_name(block_const_kind(k)),
jv_dump_string_trunc(jv_copy(block_const(k)), errbuf, sizeof(errbuf)));
}
return jv_invalid();
}
static block gen_dictpair(block k, block v) {
return BLOCK(gen_subexp(k), gen_subexp(v), gen_op_simple(INSERT));
}
@@ -808,6 +820,11 @@ String ':' Pattern {
$$ = gen_object_matcher($1, $3);
} |
'(' Exp ')' ':' Pattern {
jv msg = check_object_key($2);
if (jv_is_valid(msg)) {
FAIL(@$, jv_string_value(msg));
}
jv_free(msg);
$$ = gen_object_matcher($2, $5);
} |
error ':' Pattern {
@@ -905,6 +922,11 @@ IDENT ':' ExpD {
gen_index(gen_noop(), gen_const($1)));
}
| '(' Exp ')' ':' ExpD {
jv msg = check_object_key($2);
if (jv_is_valid(msg)) {
FAIL(@$, jv_string_value(msg));
}
jv_free(msg);
$$ = gen_dictpair($2, $5);
}
| error ':' ExpD {