From af9f9302058d4d1f7d643effc86a9b48c2619ac5 Mon Sep 17 00:00:00 2001 From: Tooru Fujisawa Date: Tue, 1 Sep 2020 19:32:38 +0900 Subject: [PATCH] Remove EmitResult.top_level_script and use EmitResult.scripts for both top level script and functions (fixes #629) --- crates/driver/src/demo.rs | 20 +++------- crates/emitter/src/ast_emitter.rs | 7 ++-- crates/emitter/src/compilation_info.rs | 6 +-- .../src/function_declaration_emitter.rs | 2 +- crates/emitter/src/lib.rs | 7 ++-- crates/interpreter/src/evaluate.rs | 2 +- crates/scope/src/builder.rs | 16 ++++---- crates/scope/src/pass.rs | 6 +-- crates/stencil/src/result.rs | 9 ++--- crates/stencil/src/script.rs | 38 +++++++++++++++++++ gecko-patches.txt | 2 +- 11 files changed, 71 insertions(+), 44 deletions(-) diff --git a/crates/driver/src/demo.rs b/crates/driver/src/demo.rs index 96bf0a823..3be0858d4 100644 --- a/crates/driver/src/demo.rs +++ b/crates/driver/src/demo.rs @@ -160,25 +160,15 @@ fn handle_script<'alloc>( } if verbosity.bytecode { - let script_data_index: usize = result - .top_level_script - .immutable_script_data - .expect("Top level script should have ImmutableScriptData") - .into(); - let script_data = &result.script_data_list[script_data_index]; - println!("\n# Bytecode\n{}", emitter::dis(&script_data.bytecode)); - } - - for (i, fun) in result.functions.iter().enumerate() { - if verbosity.bytecode { - if fun.is_non_lazy_function() { - let script_data_index: usize = fun + for (i, script) in result.scripts.iter().enumerate() { + if !script.is_function() || script.is_non_lazy_function() { + let script_data_index: usize = script .immutable_script_data - .expect("Non-lazy function should have ImmutableScriptData") + .expect("Non-lazy script should have ImmutableScriptData") .into(); let script_data = &result.script_data_list[script_data_index]; println!( - "\n# bytecode for functions[{}]\n{}", + "\n# bytecode for script[{}]\n{}", i, emitter::dis(&script_data.bytecode) ); diff --git a/crates/emitter/src/ast_emitter.rs b/crates/emitter/src/ast_emitter.rs index 1b3480b95..a2b345a8b 100644 --- a/crates/emitter/src/ast_emitter.rs +++ b/crates/emitter/src/ast_emitter.rs @@ -46,13 +46,14 @@ pub fn emit_program<'alloc>( } }; + compilation_info.scripts.set_top_level(script); + Ok(EmitResult::new( compilation_info.atoms.into(), compilation_info.slices.into(), compilation_info.scope_data_map.into(), compilation_info.regexps.into(), - script, - compilation_info.functions.into(), + compilation_info.scripts.into(), compilation_info.script_data_list.into(), )) } @@ -163,7 +164,7 @@ impl<'alloc, 'opt> AstEmitter<'alloc, 'opt> { let name = self .compilation_info - .functions + .scripts .get(stencil_index) .fun_name() .expect("Function declaration should have name"); diff --git a/crates/emitter/src/compilation_info.rs b/crates/emitter/src/compilation_info.rs index 38e3d6915..1feeb7086 100644 --- a/crates/emitter/src/compilation_info.rs +++ b/crates/emitter/src/compilation_info.rs @@ -16,7 +16,7 @@ pub struct CompilationInfo<'alloc> { pub function_declarations: HashMap>, pub function_stencil_indices: AssociatedData, pub function_declaration_properties: FunctionDeclarationPropertyMap, - pub functions: ScriptStencilList, + pub scripts: ScriptStencilList, pub script_data_list: ImmutableScriptDataList, } @@ -28,7 +28,7 @@ impl<'alloc> CompilationInfo<'alloc> { function_declarations: HashMap>, function_stencil_indices: AssociatedData, function_declaration_properties: FunctionDeclarationPropertyMap, - functions: ScriptStencilList, + scripts: ScriptStencilList, ) -> Self { Self { atoms, @@ -38,7 +38,7 @@ impl<'alloc> CompilationInfo<'alloc> { function_declarations, function_stencil_indices, function_declaration_properties, - functions, + scripts, script_data_list: ImmutableScriptDataList::new(), } } diff --git a/crates/emitter/src/function_declaration_emitter.rs b/crates/emitter/src/function_declaration_emitter.rs index e9531d4da..2e41c3481 100644 --- a/crates/emitter/src/function_declaration_emitter.rs +++ b/crates/emitter/src/function_declaration_emitter.rs @@ -15,7 +15,7 @@ impl LazyFunctionEmitter { pub fn emit(self, emitter: &mut AstEmitter) -> GCThingIndex { emitter .compilation_info - .functions + .scripts .get_mut(self.stencil_index) .set_function_emitted(); emitter.emit.get_function_gcthing_index(self.stencil_index) diff --git a/crates/emitter/src/lib.rs b/crates/emitter/src/lib.rs index 4e6ececb3..6c4b1513b 100644 --- a/crates/emitter/src/lib.rs +++ b/crates/emitter/src/lib.rs @@ -37,7 +37,7 @@ pub fn emit<'alloc>( function_declarations, function_stencil_indices, function_declaration_properties, - functions, + scripts, error, } = scope::generate_scope_data(ast); @@ -57,7 +57,7 @@ pub fn emit<'alloc>( function_declarations, function_stencil_indices, function_declaration_properties, - functions, + scripts, ); ast_emitter::emit_program(ast, options, compilation_info) } @@ -100,8 +100,7 @@ mod tests { ) .expect("Should work!"); - let script_data_index: usize = result - .top_level_script + let script_data_index: usize = result.scripts[0] .immutable_script_data .expect("Top level script should have ImmutableScriptData") .into(); diff --git a/crates/interpreter/src/evaluate.rs b/crates/interpreter/src/evaluate.rs index 0d70a6415..5b9855f5a 100644 --- a/crates/interpreter/src/evaluate.rs +++ b/crates/interpreter/src/evaluate.rs @@ -88,7 +88,7 @@ pub fn evaluate(result: &EmitResult, global: Rc>) -> Result, - functions: ScriptStencilList, + scripts: ScriptStencilList, /// The stack of functions that the current context is in. /// @@ -2441,9 +2441,11 @@ pub struct FunctionScriptStencilBuilder { impl FunctionScriptStencilBuilder { fn new() -> Self { + let scripts = ScriptStencilList::new_with_empty_top_level(); + Self { function_stencil_indices: AssociatedData::new(), - functions: ScriptStencilList::new(), + scripts, function_stack: Vec::new(), } } @@ -2483,7 +2485,7 @@ impl FunctionScriptStencilBuilder { FunctionFlags::interpreted(syntax_kind), enclosing_scope_index, ); - let index = self.functions.push(function_stencil); + let index = self.scripts.push(function_stencil); self.function_stencil_indices.insert(fun, index); match self.maybe_current_mut() { @@ -2524,7 +2526,7 @@ impl FunctionScriptStencilBuilder { /// Returns a immutable reference to the innermost function. None otherwise. fn maybe_current<'a>(&'a self) -> Option<&'a ScriptStencil> { let maybe_index = self.function_stack.last(); - maybe_index.map(move |index| self.functions.get(*index)) + maybe_index.map(move |index| self.scripts.get(*index)) } /// Returns a immutable reference to the current function. @@ -2536,7 +2538,7 @@ impl FunctionScriptStencilBuilder { /// Returns a mutable reference to the innermost function. None otherwise. fn maybe_current_mut<'a>(&'a mut self) -> Option<&'a mut ScriptStencil> { let maybe_index = self.function_stack.last().cloned(); - maybe_index.map(move |index| self.functions.get_mut(index)) + maybe_index.map(move |index| self.scripts.get_mut(index)) } /// Returns a mutable reference to the current function. @@ -3460,7 +3462,7 @@ pub struct ScopeDataMapAndScriptStencilList { pub scope_data_map: ScopeDataMap, pub function_stencil_indices: AssociatedData, pub function_declaration_properties: FunctionDeclarationPropertyMap, - pub functions: ScriptStencilList, + pub scripts: ScriptStencilList, pub error: Option, } @@ -3474,7 +3476,7 @@ impl From for ScopeDataMapAndScriptStencilList { ), function_stencil_indices: builder.function_stencil_builder.function_stencil_indices, function_declaration_properties: builder.function_declaration_properties, - functions: builder.function_stencil_builder.functions, + scripts: builder.function_stencil_builder.scripts, error: builder.error, } } diff --git a/crates/scope/src/pass.rs b/crates/scope/src/pass.rs index e924e6838..810d34f77 100644 --- a/crates/scope/src/pass.rs +++ b/crates/scope/src/pass.rs @@ -23,7 +23,7 @@ pub struct ScopePassResult<'alloc> { pub function_declarations: HashMap>, pub function_stencil_indices: AssociatedData, pub function_declaration_properties: FunctionDeclarationPropertyMap, - pub functions: ScriptStencilList, + pub scripts: ScriptStencilList, pub error: Option, } @@ -53,7 +53,7 @@ impl<'alloc> From> for ScopePassResult<'alloc> { scope_data_map, function_stencil_indices, function_declaration_properties, - functions, + scripts, error, } = pass.builder.into(); ScopePassResult { @@ -61,7 +61,7 @@ impl<'alloc> From> for ScopePassResult<'alloc> { function_declarations: pass.function_declarations, function_stencil_indices, function_declaration_properties, - functions, + scripts, error, } } diff --git a/crates/stencil/src/result.rs b/crates/stencil/src/result.rs index 94cefc3a9..6cb2fb771 100644 --- a/crates/stencil/src/result.rs +++ b/crates/stencil/src/result.rs @@ -10,8 +10,7 @@ pub struct EmitResult<'alloc> { pub scopes: Vec, pub regexps: Vec, - pub top_level_script: ScriptStencil, - pub functions: Vec, + pub scripts: Vec, pub script_data_list: Vec, } @@ -21,8 +20,7 @@ impl<'alloc> EmitResult<'alloc> { slices: Vec<&'alloc str>, scopes: Vec, regexps: Vec, - top_level_script: ScriptStencil, - functions: Vec, + scripts: Vec, script_data_list: Vec, ) -> Self { Self { @@ -30,8 +28,7 @@ impl<'alloc> EmitResult<'alloc> { slices, scopes, regexps, - top_level_script, - functions, + scripts, script_data_list, } } diff --git a/crates/stencil/src/script.rs b/crates/stencil/src/script.rs index 84a45faa1..70cdda73f 100644 --- a/crates/stencil/src/script.rs +++ b/crates/stencil/src/script.rs @@ -231,6 +231,18 @@ pub struct SourceExtent { } impl SourceExtent { + fn new() -> Self { + Self { + source_start: 0, + source_end: 0, + to_string_start: 0, + to_string_end: 0, + + lineno: 0, + column: 0, + } + } + pub fn top_level_script(length: u32, lineno: u32, column: u32) -> Self { Self { source_start: 0, @@ -315,6 +327,22 @@ pub struct ScriptStencil { } impl ScriptStencil { + fn empty_top_level_script() -> Self { + Self { + immutable_flags: ImmutableScriptFlags::new(), + gcthings: Vec::new(), + immutable_script_data: None, + extent: SourceExtent::new(), + fun_name: None, + fun_nargs: 0, + fun_flags: FunctionFlags::empty(), + lazy_function_enclosing_scope_index: None, + is_standalone_function: false, + was_function_emitted: false, + is_singleton_function: false, + } + } + pub fn top_level_script( gcthings: Vec, immutable_script_data: ImmutableScriptDataIndex, @@ -513,6 +541,12 @@ impl ScriptStencilList { } } + pub fn new_with_empty_top_level() -> Self { + Self { + scripts: vec![ScriptStencil::empty_top_level_script()], + } + } + pub fn push(&mut self, script: ScriptStencil) -> ScriptStencilIndex { let index = self.scripts.len(); self.scripts.push(script); @@ -526,6 +560,10 @@ impl ScriptStencilList { pub fn get_mut<'a>(&'a mut self, index: ScriptStencilIndex) -> &'a mut ScriptStencil { &mut self.scripts[usize::from(index)] } + + pub fn set_top_level(&mut self, top_level: ScriptStencil) { + self.scripts[0] = top_level; + } } impl From for Vec { diff --git a/gecko-patches.txt b/gecko-patches.txt index 17858e08f..30c51f01a 100644 --- a/gecko-patches.txt +++ b/gecko-patches.txt @@ -1 +1 @@ -D85363:1648574 +D88970:1662383