Allow global functions in non-aliased imports.

This commit is contained in:
Stephen Chung 2022-10-14 12:14:28 +08:00
parent 31d045279f
commit b65b7b05a5
3 changed files with 28 additions and 23 deletions

View File

@ -9,6 +9,7 @@ Bug fixes
* `Engine::parse_json` now returns an error on unquoted keys to be consistent with JSON specifications.
* `import` statements inside `eval` no longer cause errors in subsequent code.
* Functions marked `global` in `import`ed modules with no alias names now work properly.
New features
------------

View File

@ -952,15 +952,19 @@ impl Engine {
});
if let Ok(module) = module_result {
if !export.is_empty() {
if module.is_indexed() {
global.push_import(export.name.clone(), module);
} else {
// Index the module (making a clone copy if necessary) if it is not indexed
let mut m = crate::func::shared_take_or_clone(module);
m.build_index();
global.push_import(export.name.clone(), m);
}
let (export, must_be_indexed) = if !export.is_empty() {
(export.name.clone(), true)
} else {
(self.get_interned_string(""), false)
};
if !must_be_indexed || module.is_indexed() {
global.push_import(export, module);
} else {
// Index the module (making a clone copy if necessary) if it is not indexed
let mut m = crate::func::shared_take_or_clone(module);
m.build_index();
global.push_import(export, m);
}
global.num_modules_loaded += 1;

View File

@ -2993,24 +2993,24 @@ impl Engine {
// import expr ...
let expr = self.parse_expr(input, state, lib, settings.level_up())?;
// import expr;
if !match_token(input, Token::As).0 {
let empty = Ident {
let export = if !match_token(input, Token::As).0 {
// import expr;
Ident {
name: state.get_interned_string(""),
pos: Position::NONE,
};
return Ok(Stmt::Import((expr, empty).into(), settings.pos));
}
}
} else {
// import expr as name ...
let (name, pos) = parse_var_name(input)?;
Ident {
name: state.get_interned_string(name),
pos,
}
};
// import expr as name ...
let (name, pos) = parse_var_name(input)?;
let name = state.get_interned_string(name);
state.imports.push(name.clone());
state.imports.push(export.name.clone());
Ok(Stmt::Import(
(expr, Ident { name, pos }).into(),
settings.pos,
))
Ok(Stmt::Import((expr, export).into(), settings.pos))
}
/// Parse an export statement.