summaryrefslogtreecommitdiffstats
path: root/parser.y
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2015-08-12 00:46:34 -0700
committerDavid Tolnay <dtolnay@gmail.com>2015-08-13 21:42:35 -0700
commit7b5c6a9224413eb8d74728e66e25b0be62709cc9 (patch)
treee186a6cef41939c933e512882f7905f9543d0fa6 /parser.y
parent5479d7f2dc39c138fc8f5606c4538b4c3fbb6bc3 (diff)
Fix assert fail on invalid import path (fix #899)
Diffstat (limited to 'parser.y')
-rw-r--r--parser.y29
1 files changed, 25 insertions, 4 deletions
diff --git a/parser.y b/parser.y
index 45009c29..2b30cb68 100644
--- a/parser.y
+++ b/parser.y
@@ -112,7 +112,7 @@ struct lexer_param;
%type <blk> Exp Term MkDict MkDictPair ExpD ElseBody QQString String
-%type <blk> FuncDef FuncDefs Import Imports ImportWhat Param Params
+%type <blk> FuncDef FuncDefs Import Imports ImportWhat ImportFrom Param Params
%type <blk> Arg Args Module Pattern ArrayPats ObjPats ObjPat
%type <literal> Keyword
%{
@@ -186,6 +186,16 @@ static block constant_fold(block a, block b, int op) {
if (!block_is_single(a) || !block_is_const(a) ||
!block_is_single(b) || !block_is_const(b))
return gen_noop();
+ if (op == '+') {
+ if (block_const_kind(a) == JV_KIND_NULL) {
+ block_free(a);
+ return b;
+ }
+ if (block_const_kind(b) == JV_KIND_NULL) {
+ block_free(b);
+ return a;
+ }
+ }
if (block_const_kind(a) != block_const_kind(b))
return gen_noop();
@@ -491,7 +501,7 @@ ImportWhat Exp ';' {
}
ImportWhat:
-"import" String "as" '$' IDENT {
+"import" ImportFrom "as" '$' IDENT {
jv v = block_const($2);
// XXX Make gen_import take only blocks and the int is_data so we
// don't have to free so much stuff here
@@ -500,20 +510,31 @@ ImportWhat:
jv_free($5);
jv_free(v);
} |
-"import" String "as" IDENT {
+"import" ImportFrom "as" IDENT {
jv v = block_const($2);
$$ = gen_import(jv_string_value(v), jv_string_value($4), 0);
block_free($2);
jv_free($4);
jv_free(v);
} |
-"include" String {
+"include" ImportFrom {
jv v = block_const($2);
$$ = gen_import(jv_string_value(v), NULL, 0);
block_free($2);
jv_free(v);
}
+ImportFrom:
+String {
+ if (!block_is_const($1)) {
+ FAIL(@$, "Import path must be constant");
+ $$ = gen_const(jv_string(""));
+ block_free($1);
+ } else {
+ $$ = $1;
+ }
+}
+
FuncDef:
"def" IDENT ':' Exp ';' {
$$ = gen_function(jv_string_value($2), gen_noop(), $4);