diff --git a/src/bytecode.rs b/src/bytecode.rs index c87bc0a..e41441c 100644 --- a/src/bytecode.rs +++ b/src/bytecode.rs @@ -51,9 +51,11 @@ pub enum Instruction { Import { name: String, symbols: Vec, + level: usize, }, ImportStar { name: String, + level: usize, }, LoadName { name: String, @@ -327,11 +329,25 @@ impl Instruction { ($variant:ident, $var1:expr, $var2:expr) => { write!(f, "{:20} ({}, {})\n", stringify!($variant), $var1, $var2) }; + ($variant:ident, $var1:expr, $var2:expr, $var3:expr) => { + write!( + f, + "{:20} ({}, {}, {})\n", + stringify!($variant), + $var1, + $var2, + $var3 + ) + }; } match self { - Import { name, symbols } => w!(Import, name, format!("{:?}", symbols)), - ImportStar { name } => w!(ImportStar, name), + Import { + name, + symbols, + level, + } => w!(Import, name, format!("{:?}", symbols), level), + ImportStar { name, level } => w!(ImportStar, name, level), LoadName { name, scope } => w!(LoadName, name, format!("{:?}", scope)), StoreName { name, scope } => w!(StoreName, name, format!("{:?}", scope)), DeleteName { name } => w!(DeleteName, name), diff --git a/src/compile.rs b/src/compile.rs index 8b806b1..c4e4a1a 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -252,13 +252,16 @@ impl Compiler { module, symbols, alias, + level, } in import_parts { + let level = *level; if let Some(alias) = alias { // import module as alias self.emit(Instruction::Import { name: module.clone(), symbols: vec![], + level, }); self.store_name(&alias); } else if symbols.is_empty() { @@ -266,6 +269,7 @@ impl Compiler { self.emit(Instruction::Import { name: module.clone(), symbols: vec![], + level, }); self.store_name(&module.clone()); } else { @@ -276,6 +280,7 @@ impl Compiler { // from module import * self.emit(Instruction::ImportStar { name: module.clone(), + level, }); } else { // from module import symbol @@ -292,6 +297,7 @@ impl Compiler { self.emit(Instruction::Import { name: module.clone(), symbols: symbols_strings, + level, }); names.iter().rev().for_each(|name| self.store_name(&name)); }