Fix assert fail on non-object import metadata (fix #900)

This commit is contained in:
David Tolnay committed 2015-08-13 21:42:35 -07:00
1 parent a5b2c55a70
commit 5479d7f2dc
5 files changed
+1014 -1069

No files matched your search

+11 -8
View File
@@ -495,23 +495,26 @@ jv block_module_meta(block b) {
return jv_null();
}
block gen_import(const char* name, block metadata, const char* as, int is_data) {
assert(metadata.first == NULL || block_is_const(metadata));
block gen_import(const char* name, const char* as, int is_data) {
inst* i = inst_new(DEPS);
jv meta;
if (block_is_const(metadata))
meta = block_const(metadata);
else
meta = jv_object();
jv meta = jv_object();
if (as != NULL)
meta = jv_object_set(meta, jv_string("as"), jv_string(as));
meta = jv_object_set(meta, jv_string("is_data"), is_data ? jv_true() : jv_false());
meta = jv_object_set(meta, jv_string("relpath"), jv_string(name));
i->imm.constant = meta;
block_free(metadata);
return inst_block(i);
}
block gen_import_meta(block import, block metadata) {
assert(block_is_single(import) && import.first->op == DEPS);
assert(block_is_const(metadata) && block_const_kind(metadata) == JV_KIND_OBJECT);
inst *i = import.first;
i->imm.constant = jv_object_merge(block_const(metadata), i->imm.constant);
block_free(metadata);
return import;
}
block gen_function(const char* name, block formals, block body) {
inst* i = inst_new(CLOSURE_CREATE);
for (inst* i = formals.last; i; i = i->prev) {
+2 -1
View File
@@ -32,7 +32,8 @@ block gen_op_var_fresh(opcode op, const char* name);
block gen_module(block metadata);
jv block_module_meta(block b);
block gen_import(const char* name, block metadata, const char *as, int is_data);
block gen_import(const char* name, const char *as, int is_data);
block gen_import_meta(block import, block metadata);
block gen_function(const char* name, block formals, block body);
block gen_param_regular(const char* name);
block gen_param(const char* name);
+964 -1016
View File
File diff suppressed because it is too large. Load diff
+29 -44
View File
@@ -111,8 +111,8 @@ struct lexer_param;
%precedence "catch"
%type <blk> Exp Term MkDict MkDictPair ExpD ElseBody QQString
%type <blk> FuncDef FuncDefs String Import Imports Param Params
%type <blk> Exp Term MkDict MkDictPair ExpD ElseBody QQString String
%type <blk> FuncDef FuncDefs Import Imports ImportWhat Param Params
%type <blk> Arg Args Module Pattern ArrayPats ObjPats ObjPat
%type <literal> Keyword
%{
@@ -286,7 +286,7 @@ Module:
} |
"module" Exp ';' {
if (!block_is_const($2)) {
FAIL(@$, "Module metadata must be constant.");
FAIL(@$, "Module metadata must be constant");
$$ = gen_noop();
} else {
$$ = gen_module($2);
@@ -471,62 +471,47 @@ Term {
}
Import:
"import" String "as" '$' IDENT ';' {
ImportWhat ';' {
$$ = $1;
} |
ImportWhat Exp ';' {
if (!block_is_const($2)) {
FAIL(@$, "Module metadata must be constant");
$$ = gen_noop();
block_free($1);
block_free($2);
} else if (block_const_kind($2) != JV_KIND_OBJECT) {
FAIL(@$, "Module metadata must be an object");
$$ = gen_noop();
block_free($1);
block_free($2);
} else {
$$ = gen_import_meta($1, $2);
}
}
ImportWhat:
"import" String "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
$$ = gen_import(jv_string_value(v), gen_noop(), jv_string_value($5), 1);
$$ = gen_import(jv_string_value(v), jv_string_value($5), 1);
block_free($2);
jv_free($5);
jv_free(v);
} |
"import" String "as" IDENT ';' {
"import" String "as" IDENT {
jv v = block_const($2);
$$ = gen_import(jv_string_value(v), gen_noop(), jv_string_value($4), 0);
$$ = gen_import(jv_string_value(v), jv_string_value($4), 0);
block_free($2);
jv_free($4);
jv_free(v);
} |
"include" String ';' {
"include" String {
jv v = block_const($2);
$$ = gen_import(jv_string_value(v), gen_noop(), NULL, 0);
$$ = gen_import(jv_string_value(v), NULL, 0);
block_free($2);
jv_free(v);
} |
"import" String "as" IDENT Exp ';' {
if (!block_is_const($5)) {
FAIL(@$, "Module metadata must be constant.");
$$ = gen_noop();
} else {
jv v = block_const($2);
$$ = gen_import(jv_string_value(v), $5, jv_string_value($4), 0);
jv_free(v);
}
block_free($2);
jv_free($4);
} |
"include" String Exp ';' {
if (!block_is_const($3)) {
FAIL(@$, "Module metadata must be constant.");
$$ = gen_noop();
} else {
jv v = block_const($2);
$$ = gen_import(jv_string_value(v), $3, NULL, 0);
jv_free(v);
}
block_free($2);
} |
"import" String "as" '$' IDENT Exp ';' {
if (!block_is_const($6)) {
FAIL(@$, "Module metadata must be constant.");
$$ = gen_noop();
} else {
jv v = block_const($2);
$$ = gen_import(jv_string_value(v), $6, jv_string_value($5), 1);
jv_free(v);
}
block_free($2);
jv_free($5);
}
FuncDef:
+8
View File
@@ -1181,6 +1181,14 @@ include "c"; [a, c]
null
[0,"acmehbah"]
%%FAIL
include "a" (.+1); 0
jq: error: Module metadata must be constant at <top-level>, line 1:
%%FAIL
include "a" []; 0
jq: error: Module metadata must be an object at <top-level>, line 1:
modulemeta
"c"
{"whatever":null,"deps":[{"as":"foo","is_data":false,"relpath":"a"},{"search":"./","as":"d","is_data":false,"relpath":"d"},{"search":"./","as":"d2","is_data":false,"relpath":"d"},{"search":"./../lib/jq","as":"e","is_data":false,"relpath":"e"},{"search":"./../lib/jq","as":"f","is_data":false,"relpath":"f"},{"as":"d","is_data":true,"relpath":"data"}]}