Fix assert fail on non-object import metadata (fix #900)
This commit is contained in:
1 parent
a5b2c55a70
commit
5479d7f2dc
5 files changed
+1014
-1069
No files matched your search
@@ -495,23 +495,26 @@ jv block_module_meta(block b) {
|
|||||||
return jv_null();
|
return jv_null();
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
assert(metadata.first == NULL || block_is_const(metadata));
|
|
||||||
inst* i = inst_new(DEPS);
|
inst* i = inst_new(DEPS);
|
||||||
jv meta;
|
jv meta = jv_object();
|
||||||
if (block_is_const(metadata))
|
|
||||||
meta = block_const(metadata);
|
|
||||||
else
|
|
||||||
meta = jv_object();
|
|
||||||
if (as != NULL)
|
if (as != NULL)
|
||||||
meta = jv_object_set(meta, jv_string("as"), jv_string(as));
|
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("is_data"), is_data ? jv_true() : jv_false());
|
||||||
meta = jv_object_set(meta, jv_string("relpath"), jv_string(name));
|
meta = jv_object_set(meta, jv_string("relpath"), jv_string(name));
|
||||||
i->imm.constant = meta;
|
i->imm.constant = meta;
|
||||||
block_free(metadata);
|
|
||||||
return inst_block(i);
|
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) {
|
block gen_function(const char* name, block formals, block body) {
|
||||||
inst* i = inst_new(CLOSURE_CREATE);
|
inst* i = inst_new(CLOSURE_CREATE);
|
||||||
for (inst* i = formals.last; i; i = i->prev) {
|
for (inst* i = formals.last; i; i = i->prev) {
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ block gen_op_var_fresh(opcode op, const char* name);
|
|||||||
|
|
||||||
block gen_module(block metadata);
|
block gen_module(block metadata);
|
||||||
jv block_module_meta(block b);
|
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_function(const char* name, block formals, block body);
|
||||||
block gen_param_regular(const char* name);
|
block gen_param_regular(const char* name);
|
||||||
block gen_param(const char* name);
|
block gen_param(const char* name);
|
||||||
|
|||||||
@@ -111,8 +111,8 @@ struct lexer_param;
|
|||||||
%precedence "catch"
|
%precedence "catch"
|
||||||
|
|
||||||
|
|
||||||
%type <blk> Exp Term MkDict MkDictPair ExpD ElseBody QQString
|
%type <blk> Exp Term MkDict MkDictPair ExpD ElseBody QQString String
|
||||||
%type <blk> FuncDef FuncDefs String Import Imports Param Params
|
%type <blk> FuncDef FuncDefs Import Imports ImportWhat Param Params
|
||||||
%type <blk> Arg Args Module Pattern ArrayPats ObjPats ObjPat
|
%type <blk> Arg Args Module Pattern ArrayPats ObjPats ObjPat
|
||||||
%type <literal> Keyword
|
%type <literal> Keyword
|
||||||
%{
|
%{
|
||||||
@@ -286,7 +286,7 @@ Module:
|
|||||||
} |
|
} |
|
||||||
"module" Exp ';' {
|
"module" Exp ';' {
|
||||||
if (!block_is_const($2)) {
|
if (!block_is_const($2)) {
|
||||||
FAIL(@$, "Module metadata must be constant.");
|
FAIL(@$, "Module metadata must be constant");
|
||||||
$$ = gen_noop();
|
$$ = gen_noop();
|
||||||
} else {
|
} else {
|
||||||
$$ = gen_module($2);
|
$$ = gen_module($2);
|
||||||
@@ -471,62 +471,47 @@ Term {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Import:
|
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);
|
jv v = block_const($2);
|
||||||
// XXX Make gen_import take only blocks and the int is_data so we
|
// XXX Make gen_import take only blocks and the int is_data so we
|
||||||
// don't have to free so much stuff here
|
// 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);
|
block_free($2);
|
||||||
jv_free($5);
|
jv_free($5);
|
||||||
jv_free(v);
|
jv_free(v);
|
||||||
} |
|
} |
|
||||||
"import" String "as" IDENT ';' {
|
"import" String "as" IDENT {
|
||||||
jv v = block_const($2);
|
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);
|
block_free($2);
|
||||||
jv_free($4);
|
jv_free($4);
|
||||||
jv_free(v);
|
jv_free(v);
|
||||||
} |
|
} |
|
||||||
"include" String ';' {
|
"include" String {
|
||||||
jv v = block_const($2);
|
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);
|
block_free($2);
|
||||||
jv_free(v);
|
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:
|
FuncDef:
|
||||||
|
|||||||
@@ -1181,6 +1181,14 @@ include "c"; [a, c]
|
|||||||
null
|
null
|
||||||
[0,"acmehbah"]
|
[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
|
modulemeta
|
||||||
"c"
|
"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"}]}
|
{"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"}]}
|
||||||
|
|||||||
Reference in new issue
Block a user