From 16dc9f4c337c62db27cd1b4eec488303bd8c99af Mon Sep 17 00:00:00 2001 From: Lukas Tenbrink Date: Thu, 18 Jul 2024 20:43:12 +0200 Subject: [PATCH] Store a reusable scope in Runtime once it's set up, to increase performance somewhat. --- src/interpreter/runtime.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/interpreter/runtime.rs b/src/interpreter/runtime.rs index 37df347..967738e 100644 --- a/src/interpreter/runtime.rs +++ b/src/interpreter/runtime.rs @@ -5,6 +5,7 @@ use std::rc::Rc; use itertools::Itertools; use crate::{ast, parser, program, resolver}; +use crate::cli::run::run; use crate::error::{RResult, RuntimeError}; use crate::interpreter::builtins; use crate::interpreter::compile::compile_server::CompileServer; @@ -24,6 +25,7 @@ pub struct Runtime { pub primitives: Option>>, pub traits: Option, + pub base_scope: Option>>, pub compile_server: CompileServer, pub vm: VM, @@ -42,6 +44,7 @@ impl Runtime { Metatype: Rc::clone(&Metatype), primitives: None, traits: None, + base_scope: None, compile_server: CompileServer::new(), vm: VM::new(), source: Source::new(), @@ -60,10 +63,12 @@ impl Runtime { runtime.source.module_by_name.insert(builtins_module.name.clone(), builtins_module); builtins::vm::load(&mut runtime)?; + runtime.base_scope = Some(Rc::new(runtime.make_scope()?)); + Ok(runtime) } - pub fn make_scope(&mut self) -> RResult> { + fn make_scope(&mut self) -> RResult> { let mut scope = scopes::Scope::new(); let builtins_name = module_name("builtins"); @@ -113,10 +118,16 @@ impl Runtime { } pub fn load_ast_as_module(&mut self, syntax: &ast::Block, name: ModuleName) -> RResult> { - let scope = self.make_scope()?; - let mut module = Box::new(Module::new(name)); - resolver::resolve_file(syntax, &scope, self, &mut module)?; + + if let Some(scope) = self.base_scope.as_ref() { + resolver::resolve_file(syntax, &Rc::clone(scope), self, &mut module)?; + } + else { + let scope = self.make_scope()?; + resolver::resolve_file(syntax, &scope, self, &mut module)?; + } + Ok(module) }