diff options
author | David Tolnay <dtolnay@gmail.com> | 2015-09-21 12:09:37 -0700 |
---|---|---|
committer | David Tolnay <dtolnay@gmail.com> | 2015-09-21 12:47:06 -0700 |
commit | 154d0ee4a824c666c056d7fd4e6028e3f3247c22 (patch) | |
tree | f3fecd8167675522bc5bb4b912c334bbc9872256 /src/parser.y | |
parent | 83ab4e273bd6bb046a8721ddbb78419f887b2b2b (diff) |
Fix assert fail if object literal key is not a string (fix #953)
Diffstat (limited to 'src/parser.y')
-rw-r--r-- | src/parser.y | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/parser.y b/src/parser.y index 5d22fca0..a37d217f 100644 --- a/src/parser.y +++ b/src/parser.y @@ -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 { |