diff --git a/CHANGELOG.md b/CHANGELOG.md index 2873c736..00b1d8e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 ------------ diff --git a/src/eval/stmt.rs b/src/eval/stmt.rs index 726b661f..77e39dea 100644 --- a/src/eval/stmt.rs +++ b/src/eval/stmt.rs @@ -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; diff --git a/src/parser.rs b/src/parser.rs index 798067c9..23f96d7b 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -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.