From cf2954d9a65d12b6dccdc05418874ce32cbcd605 Mon Sep 17 00:00:00 2001 From: y21 <30553356+y21@users.noreply.github.com> Date: Wed, 27 Dec 2023 20:12:23 +0100 Subject: [PATCH] avoid tracing preinterned symbols and instead don't check them during sweep --- crates/dash_middle/src/interner.rs | 3 ++- crates/dash_rt/src/runtime.rs | 10 +++++----- crates/dash_vm/src/js_std/date.rs | 3 ++- crates/dash_vm/src/js_std/math.rs | 3 ++- crates/dash_vm/src/lib.rs | 5 ----- crates/dash_vm/src/params.rs | 9 +++++---- 6 files changed, 16 insertions(+), 17 deletions(-) diff --git a/crates/dash_middle/src/interner.rs b/crates/dash_middle/src/interner.rs index ed9920ff..deb8edf4 100644 --- a/crates/dash_middle/src/interner.rs +++ b/crates/dash_middle/src/interner.rs @@ -363,7 +363,8 @@ impl StringInterner { /// You must mark all reachable symbols before calling this. /// It won't cause undefined behavior if you don't (hence not unsafe), but it can lead to oddities such as panics. pub fn sweep(&mut self) { - for i in 0..self.store.len() { + // Preinterned symbols are always kept, since they can be referred to statically. + for i in sym::PREINTERNED.len()..self.store.len() { if let Some(data) = self.store[i].as_ref() { if !data.visited.get() { self.mapping.remove(&data.value); diff --git a/crates/dash_rt/src/runtime.rs b/crates/dash_rt/src/runtime.rs index f00916e5..f0fce936 100644 --- a/crates/dash_rt/src/runtime.rs +++ b/crates/dash_rt/src/runtime.rs @@ -90,29 +90,29 @@ impl Runtime { } #[cfg(feature = "random")] -fn random_callback(_: &mut Vm) -> Result { +fn random_callback(_: &mut Vm) -> Result { use rand::Rng; let mut rng = rand::thread_rng(); Ok(rng.gen()) } -fn time_callback(_: &mut Vm) -> Result { +fn time_callback(_: &mut Vm) -> Result { Ok(SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .expect("time() < UNIX_EPOCH") .as_millis() as u64) } -fn import_callback(vm: &mut Vm, import_ty: StaticImportKind, path: JsString) -> Result { +fn import_callback(vm: &mut Vm, import_ty: StaticImportKind, path: JsString) -> Result { let mut sc = vm.scope(); let root = State::from_vm(&sc).root_module().clone(); if let Some(module) = &*root.borrow() { match module.import(&mut sc, import_ty, path) { - Ok(Some(module)) => return Ok(module), + Ok(Some(module)) => return Ok(module.into()), Ok(None) => {} - Err(err) => return Err(err), + Err(err) => return Err(err.into()), } } diff --git a/crates/dash_vm/src/js_std/date.rs b/crates/dash_vm/src/js_std/date.rs index 6b0e5f00..32793be5 100644 --- a/crates/dash_vm/src/js_std/date.rs +++ b/crates/dash_vm/src/js_std/date.rs @@ -1,5 +1,6 @@ use crate::throw; use crate::value::function::native::CallContext; +use crate::value::root_ext::RootErrExt; use crate::value::Value; pub fn time_millis(cx: &mut CallContext) -> Result { @@ -8,7 +9,7 @@ pub fn time_millis(cx: &mut CallContext) -> Result { None => throw!(&mut cx.scope, Error, "Failed to get the current time"), }; - callback(cx.scope) + callback(cx.scope).root_err(cx.scope) } pub fn constructor(cx: CallContext) -> Result { diff --git a/crates/dash_vm/src/js_std/math.rs b/crates/dash_vm/src/js_std/math.rs index 912f79c3..e54b355a 100644 --- a/crates/dash_vm/src/js_std/math.rs +++ b/crates/dash_vm/src/js_std/math.rs @@ -1,6 +1,7 @@ use crate::throw; use crate::value::function::native::CallContext; use crate::value::ops::conversions::ValueConversion; +use crate::value::root_ext::RootErrExt; use crate::value::{Value, ValueContext}; pub fn abs(cx: CallContext) -> Result { @@ -210,7 +211,7 @@ pub fn floor(cx: CallContext) -> Result { pub fn random(cx: CallContext) -> Result { let num = match cx.scope.params().math_random_callback() { - Some(cb) => cb(cx.scope)?, + Some(cb) => cb(cx.scope).root_err(cx.scope)?, None => throw!(cx.scope, Error, "Math.random is disabled for this context"), }; diff --git a/crates/dash_vm/src/lib.rs b/crates/dash_vm/src/lib.rs index ee11de19..1de71806 100644 --- a/crates/dash_vm/src/lib.rs +++ b/crates/dash_vm/src/lib.rs @@ -1419,11 +1419,6 @@ impl Vm { fn trace_roots(&mut self) { let mut cx = TraceCtxt::new(&mut self.interner); - - debug!("trace preinterned symbols"); - for (_, sym) in sym::PREINTERNED { - sym.trace(&mut cx); - } debug!("trace frames"); self.frames.trace(&mut cx); diff --git a/crates/dash_vm/src/params.rs b/crates/dash_vm/src/params.rs index 88106f12..8384d78a 100644 --- a/crates/dash_vm/src/params.rs +++ b/crates/dash_vm/src/params.rs @@ -4,14 +4,15 @@ use dash_middle::compiler::StaticImportKind; use crate::localscope::LocalScope; use crate::value::string::JsString; +use crate::value::Unrooted; use super::value::Value; use super::Vm; -pub type MathRandomCallback = fn(vm: &mut Vm) -> Result; -pub type TimeMillisCallback = fn(vm: &mut Vm) -> Result; -pub type StaticImportCallback = fn(vm: &mut Vm, ty: StaticImportKind, path: JsString) -> Result; -pub type DynamicImportCallback = fn(vm: &mut Vm, val: Value) -> Result; +pub type MathRandomCallback = fn(vm: &mut Vm) -> Result; +pub type TimeMillisCallback = fn(vm: &mut Vm) -> Result; +pub type StaticImportCallback = fn(vm: &mut Vm, ty: StaticImportKind, path: JsString) -> Result; +pub type DynamicImportCallback = fn(vm: &mut Vm, val: Value) -> Result; pub type DebuggerCallback = fn(vm: &mut Vm) -> Result<(), Value>; pub type UnhandledTaskException = fn(vm: &mut LocalScope, exception: Value);