Update to SpiderMonkey 137.

Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
Josh Matthews 2025-05-22 00:48:46 -04:00
parent 0774025d89
commit b9238c5025
9 changed files with 115 additions and 47 deletions

16
Cargo.lock generated
View file

@ -1357,7 +1357,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c"
dependencies = [ dependencies = [
"lazy_static", "lazy_static",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -2385,7 +2385,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -3014,7 +3014,7 @@ dependencies = [
"gobject-sys", "gobject-sys",
"libc", "libc",
"system-deps", "system-deps",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -4518,7 +4518,7 @@ checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
dependencies = [ dependencies = [
"hermit-abi 0.5.0", "hermit-abi 0.5.0",
"libc", "libc",
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]
@ -5211,7 +5211,7 @@ dependencies = [
[[package]] [[package]]
name = "mozjs" name = "mozjs"
version = "0.14.1" version = "0.14.1"
source = "git+https://github.com/servo/mozjs#728acdf3d4ce0604e9f75dd1d539dc6f291ccec7" source = "git+https://github.com/jdm/mozjs?branch=137up#ec7a8ab49d5dcc8e0282ce5097868ea1b0da2a20"
dependencies = [ dependencies = [
"bindgen 0.71.1", "bindgen 0.71.1",
"cc", "cc",
@ -5222,8 +5222,8 @@ dependencies = [
[[package]] [[package]]
name = "mozjs_sys" name = "mozjs_sys"
version = "0.128.9-2" version = "0.137.0-0"
source = "git+https://github.com/servo/mozjs#728acdf3d4ce0604e9f75dd1d539dc6f291ccec7" source = "git+https://github.com/jdm/mozjs?branch=137up#ec7a8ab49d5dcc8e0282ce5097868ea1b0da2a20"
dependencies = [ dependencies = [
"bindgen 0.71.1", "bindgen 0.71.1",
"cc", "cc",
@ -9734,7 +9734,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [ dependencies = [
"windows-sys 0.59.0", "windows-sys 0.52.0",
] ]
[[package]] [[package]]

View file

@ -248,3 +248,8 @@ codegen-units = 1
# #
# [patch."https://github.com/servo/rust-content-security-policy"] # [patch."https://github.com/servo/rust-content-security-policy"]
# content-security-policy = { path = "../rust-content-security-policy/" } # content-security-policy = { path = "../rust-content-security-policy/" }
[patch."https://github.com/servo/mozjs"]
#mozjs = { path = "../mozjs/mozjs" }
#mozjs_sys = { path = "../mozjs/mozjs-sys" }
mozjs = { git = "https://github.com/jdm/mozjs", branch = "137up" }
mozjs_sys = { git = "https://github.com/jdm/mozjs", branch = "137up" }

View file

@ -170,7 +170,6 @@ pub struct Preferences {
pub js_mem_gc_decommit_threshold_mb: i64, pub js_mem_gc_decommit_threshold_mb: i64,
pub js_mem_gc_dynamic_heap_growth_enabled: bool, pub js_mem_gc_dynamic_heap_growth_enabled: bool,
pub js_mem_gc_dynamic_mark_slice_enabled: bool, pub js_mem_gc_dynamic_mark_slice_enabled: bool,
pub js_mem_gc_empty_chunk_count_max: i64,
pub js_mem_gc_empty_chunk_count_min: i64, pub js_mem_gc_empty_chunk_count_min: i64,
pub js_mem_gc_high_frequency_heap_growth_max: i64, pub js_mem_gc_high_frequency_heap_growth_max: i64,
pub js_mem_gc_high_frequency_heap_growth_min: i64, pub js_mem_gc_high_frequency_heap_growth_min: i64,
@ -345,7 +344,6 @@ impl Preferences {
js_mem_gc_decommit_threshold_mb: 32, js_mem_gc_decommit_threshold_mb: 32,
js_mem_gc_dynamic_heap_growth_enabled: true, js_mem_gc_dynamic_heap_growth_enabled: true,
js_mem_gc_dynamic_mark_slice_enabled: true, js_mem_gc_dynamic_mark_slice_enabled: true,
js_mem_gc_empty_chunk_count_max: 30,
js_mem_gc_empty_chunk_count_min: 1, js_mem_gc_empty_chunk_count_min: 1,
js_mem_gc_high_frequency_heap_growth_max: 300, js_mem_gc_high_frequency_heap_growth_max: 300,
js_mem_gc_high_frequency_heap_growth_min: 150, js_mem_gc_high_frequency_heap_growth_min: 150,

View file

@ -113,9 +113,22 @@ unsafe extern "C" fn instance_class_has_proto_at_depth(
domclass.dom_class.interface_chain[depth as usize] as u32 == proto_id domclass.dom_class.interface_chain[depth as usize] as u32 == proto_id
} }
/// <https://searchfox.org/mozilla-central/rev/c18faaae88b30182e487fa3341bc7d923e22f23a/xpcom/base/CycleCollectedJSRuntime.cpp#792>
unsafe extern "C" fn instance_class_is_error(clasp: *const js::jsapi::JSClass) -> bool {
if !is_dom_class(&*clasp) {
return false;
}
let domclass: *const DOMJSClass = clasp as *const _;
let domclass = &*domclass;
let root_interface = domclass.dom_class.interface_chain[0] as u32;
// TODO: support checking bare Exception prototype as well.
root_interface == PrototypeList::ID::DOMException as u32
}
#[allow(missing_docs)] // FIXME #[allow(missing_docs)] // FIXME
pub(crate) const DOM_CALLBACKS: DOMCallbacks = DOMCallbacks { pub(crate) const DOM_CALLBACKS: DOMCallbacks = DOMCallbacks {
instanceClassMatchesProto: Some(instance_class_has_proto_at_depth), instanceClassMatchesProto: Some(instance_class_has_proto_at_depth),
instanceClassIsError: Some(instance_class_is_error),
}; };
/// Eagerly define all relevant WebIDL interface constructors on the /// Eagerly define all relevant WebIDL interface constructors on the

View file

@ -14,12 +14,10 @@ use std::rc::Rc;
use deny_public_fields::DenyPublicFields; use deny_public_fields::DenyPublicFields;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use fnv::FnvHasher; use fnv::FnvHasher;
use js::jsapi::JS_GetFunctionObject; use js::jsapi::JS::CompileFunction;
use js::jsapi::{JS_GetFunctionObject, SupportUnscopables};
use js::jsval::JSVal; use js::jsval::JSVal;
use js::rust::wrappers::CompileFunction; use js::rust::{CompileOptionsWrapper, HandleObject, transform_u16_to_source_text};
use js::rust::{
CompileOptionsWrapper, HandleObject, RootedObjectVectorWrapper, transform_u16_to_source_text,
};
use libc::c_char; use libc::c_char;
use servo_url::ServoUrl; use servo_url::ServoUrl;
use style::str::HTML_SPACE_CHARACTERS; use style::str::HTML_SPACE_CHARACTERS;
@ -646,7 +644,8 @@ impl EventTarget {
}; };
// Step 3.9, subsection Scope steps 1-6 // Step 3.9, subsection Scope steps 1-6
let scopechain = RootedObjectVectorWrapper::new(*cx); //let scopechain = RootedObjectVectorWrapper::new(*cx);
let scopechain = js::rust::EnvironmentChain::new(*cx, SupportUnscopables::Yes);
if let Some(element) = element { if let Some(element) = element {
scopechain.append(document.reflector().get_jsobject().get()); scopechain.append(document.reflector().get_jsobject().get());
@ -659,7 +658,7 @@ impl EventTarget {
rooted!(in(*cx) let mut handler = unsafe { rooted!(in(*cx) let mut handler = unsafe {
CompileFunction( CompileFunction(
*cx, *cx,
scopechain.handle(), scopechain.get(),
options.ptr, options.ptr,
name.as_ptr(), name.as_ptr(),
args.len() as u32, args.len() as u32,

View file

@ -30,7 +30,7 @@ use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::router::ROUTER; use ipc_channel::router::ROUTER;
use js::glue::{IsWrapper, UnwrapObjectDynamic}; use js::glue::{IsWrapper, UnwrapObjectDynamic};
use js::jsapi::{ use js::jsapi::{
Compile1, CurrentGlobalOrNull, GetNonCCWObjectGlobal, HandleObject, Heap, Compile1, CurrentGlobalOrNull, DelazificationOption, GetNonCCWObjectGlobal, HandleObject, Heap,
InstantiateGlobalStencil, InstantiateOptions, JSContext, JSObject, JSScript, SetScriptPrivate, InstantiateGlobalStencil, InstantiateOptions, JSContext, JSObject, JSScript, SetScriptPrivate,
}; };
use js::jsval::{PrivateValue, UndefinedValue}; use js::jsval::{PrivateValue, UndefinedValue};
@ -2802,6 +2802,7 @@ impl GlobalScope {
skipFilenameValidation: false, skipFilenameValidation: false,
hideScriptFromDebugger: false, hideScriptFromDebugger: false,
deferDebugMetadata: false, deferDebugMetadata: false,
eagerDelazificationStrategy_: DelazificationOption::OnDemandOnly,
}; };
let script = InstantiateGlobalStencil( let script = InstantiateGlobalStencil(
*cx, *cx,

View file

@ -21,24 +21,26 @@ use std::{os, ptr, thread};
use background_hang_monitor_api::ScriptHangAnnotation; use background_hang_monitor_api::ScriptHangAnnotation;
use js::conversions::jsstr_to_string; use js::conversions::jsstr_to_string;
use js::glue::{ use js::glue::{
CollectServoSizes, CreateJobQueue, DeleteJobQueue, DispatchableRun, JobQueueTraps, CollectServoSizes, CreateJobQueue, DeleteJobQueue, DispatchableRun, JS_GetReservedSlot,
RUST_js_GetErrorMessage, SetBuildId, StreamConsumerConsumeChunk, JobQueueTraps, RUST_js_GetErrorMessage, SetBuildId, StreamConsumerConsumeChunk,
StreamConsumerNoteResponseURLs, StreamConsumerStreamEnd, StreamConsumerStreamError, StreamConsumerNoteResponseURLs, StreamConsumerStreamEnd, StreamConsumerStreamError,
}; };
use js::jsapi::{ use js::jsapi::{
AsmJSOption, BuildIdCharVector, ContextOptionsRef, DisableIncrementalGC, AsmJSOption, BuildIdCharVector, CompilationType, ContextOptionsRef, Dispatchable as JSRunnable,
Dispatchable as JSRunnable, Dispatchable_MaybeShuttingDown, GCDescription, GCOptions, Dispatchable_MaybeShuttingDown, GCDescription, GCOptions, GCProgress, GCReason,
GCProgress, GCReason, GetPromiseUserInputEventHandlingState, HandleObject, HandleString, Heap, GetPromiseUserInputEventHandlingState, HandleObject, HandleString, HandleValue, Heap,
InitConsumeStreamCallback, InitDispatchToEventLoop, JS_AddExtraGCRootsTracer, InitConsumeStreamCallback, InitDispatchToEventLoop, JS_AddExtraGCRootsTracer,
JS_InitDestroyPrincipalsCallback, JS_InitReadPrincipalsCallback, JS_SetGCCallback, JS_InitDestroyPrincipalsCallback, JS_InitReadPrincipalsCallback, JS_NewObject,
JS_SetGCParameter, JS_SetGlobalJitCompilerOption, JS_SetOffthreadIonCompilationEnabled, JS_SetGCCallback, JS_SetGCParameter, JS_SetGlobalJitCompilerOption,
JS_SetParallelParsingEnabled, JS_SetSecurityCallbacks, JSContext as RawJSContext, JSGCParamKey, JS_SetOffthreadIonCompilationEnabled, JS_SetParallelParsingEnabled, JS_SetReservedSlot,
JSGCStatus, JSJitCompilerOption, JSObject, JSSecurityCallbacks, JSTracer, JobQueue, MimeType, JS_SetSecurityCallbacks, JSCLASS_RESERVED_SLOTS_MASK, JSCLASS_RESERVED_SLOTS_SHIFT, JSClass,
JSClassOps, JSContext as RawJSContext, JSGCParamKey, JSGCStatus, JSJitCompilerOption, JSObject,
JSSecurityCallbacks, JSTracer, JobQueue, MimeType, MutableHandleObject,
PromiseRejectionHandlingState, PromiseUserInputEventHandlingState, RuntimeCode, PromiseRejectionHandlingState, PromiseUserInputEventHandlingState, RuntimeCode,
SetDOMCallbacks, SetGCSliceCallback, SetJobQueue, SetPreserveWrapperCallbacks, SetDOMCallbacks, SetGCSliceCallback, SetJobQueue, SetPreserveWrapperCallbacks,
SetProcessBuildIdOp, SetPromiseRejectionTrackerCallback, StreamConsumer as JSStreamConsumer, SetProcessBuildIdOp, SetPromiseRejectionTrackerCallback, StreamConsumer as JSStreamConsumer,
}; };
use js::jsval::UndefinedValue; use js::jsval::{ObjectValue, UndefinedValue};
use js::panic::wrap_panic; use js::panic::wrap_panic;
pub(crate) use js::rust::ThreadSafeJSContext; pub(crate) use js::rust::ThreadSafeJSContext;
use js::rust::wrappers::{GetPromiseIsHandled, JS_GetPromiseResult}; use js::rust::wrappers::{GetPromiseIsHandled, JS_GetPromiseResult};
@ -79,19 +81,20 @@ use crate::dom::promise::Promise;
use crate::dom::promiserejectionevent::PromiseRejectionEvent; use crate::dom::promiserejectionevent::PromiseRejectionEvent;
use crate::dom::response::Response; use crate::dom::response::Response;
use crate::microtask::{EnqueuedPromiseCallback, Microtask, MicrotaskQueue}; use crate::microtask::{EnqueuedPromiseCallback, Microtask, MicrotaskQueue};
use crate::realms::{AlreadyInRealm, InRealm}; use crate::realms::{AlreadyInRealm, InRealm, enter_realm};
use crate::script_module::EnsureModuleHooksInitialized; use crate::script_module::EnsureModuleHooksInitialized;
use crate::script_thread::trace_thread; use crate::script_thread::trace_thread;
use crate::task_source::SendableTaskSource; use crate::task_source::SendableTaskSource;
static JOB_QUEUE_TRAPS: JobQueueTraps = JobQueueTraps { static JOB_QUEUE_TRAPS: JobQueueTraps = JobQueueTraps {
getIncumbentGlobal: Some(get_incumbent_global), getHostDefinedData: Some(get_host_defined_data),
enqueuePromiseJob: Some(enqueue_promise_job), enqueuePromiseJob: Some(enqueue_promise_job),
empty: Some(empty), empty: Some(empty),
}; };
static SECURITY_CALLBACKS: JSSecurityCallbacks = JSSecurityCallbacks { static SECURITY_CALLBACKS: JSSecurityCallbacks = JSSecurityCallbacks {
contentSecurityPolicyAllows: Some(content_security_policy_allows), contentSecurityPolicyAllows: Some(content_security_policy_allows),
codeForEvalGets: None, //TODO
subsumes: Some(principals::subsumes), subsumes: Some(principals::subsumes),
}; };
@ -223,19 +226,57 @@ impl From<ScriptThreadEventCategory> for ScriptHangAnnotation {
} }
} }
static HOST_DEFINED_DATA: JSClassOps = JSClassOps {
addProperty: None,
delProperty: None,
enumerate: None,
newEnumerate: None,
resolve: None,
mayResolve: None,
finalize: None,
call: None,
construct: None,
trace: None,
};
static HOST_DEFINED_DATA_CLASS: JSClass = JSClass {
name: c"HostDefinedData".as_ptr(),
flags: (HOST_DEFINED_DATA_SLOTS & JSCLASS_RESERVED_SLOTS_MASK) << JSCLASS_RESERVED_SLOTS_SHIFT,
cOps: &HOST_DEFINED_DATA,
spec: ptr::null(),
ext: ptr::null(),
oOps: ptr::null(),
};
const INCUMBENT_SETTING_SLOT: u32 = 0;
const HOST_DEFINED_DATA_SLOTS: u32 = 1;
#[allow(unsafe_code)] #[allow(unsafe_code)]
unsafe extern "C" fn get_incumbent_global(_: *const c_void, _: *mut RawJSContext) -> *mut JSObject { unsafe extern "C" fn get_host_defined_data(
let mut result = ptr::null_mut(); _: *const c_void,
cx: *mut RawJSContext,
data: MutableHandleObject,
) -> bool {
wrap_panic(&mut || { wrap_panic(&mut || {
let incumbent_global = GlobalScope::incumbent(); let Some(incumbent_global) = GlobalScope::incumbent() else {
data.set(ptr::null_mut());
return;
};
assert!(incumbent_global.is_some()); let _realm = enter_realm(&*incumbent_global);
result = incumbent_global rooted!(in(cx) let result = JS_NewObject(cx, &HOST_DEFINED_DATA_CLASS));
.map(|g| g.reflector().get_jsobject().get()) assert!(!result.is_null());
.unwrap_or(ptr::null_mut())
JS_SetReservedSlot(
*result,
INCUMBENT_SETTING_SLOT,
&ObjectValue(*incumbent_global.reflector().get_jsobject()),
);
data.set(result.get());
}); });
result true
} }
#[allow(unsafe_code)] #[allow(unsafe_code)]
@ -257,14 +298,20 @@ unsafe extern "C" fn enqueue_promise_job(
promise: HandleObject, promise: HandleObject,
job: HandleObject, job: HandleObject,
_allocation_site: HandleObject, _allocation_site: HandleObject,
incumbent_global: HandleObject, host_defined_data: HandleObject,
) -> bool { ) -> bool {
let cx = JSContext::from_ptr(cx); let cx = JSContext::from_ptr(cx);
let mut result = false; let mut result = false;
wrap_panic(&mut || { wrap_panic(&mut || {
let microtask_queue = &*(extra as *const MicrotaskQueue); let microtask_queue = &*(extra as *const MicrotaskQueue);
let global = if !incumbent_global.is_null() { let global = if !host_defined_data.is_null() {
GlobalScope::from_object(incumbent_global.get()) let mut incumbent_global = UndefinedValue();
JS_GetReservedSlot(
host_defined_data.get(),
INCUMBENT_SETTING_SLOT,
&mut incumbent_global,
);
GlobalScope::from_object(incumbent_global.to_object())
} else { } else {
let realm = AlreadyInRealm::assert_for_cx(cx); let realm = AlreadyInRealm::assert_for_cx(cx);
GlobalScope::from_context(*cx, InRealm::already(&realm)) GlobalScope::from_context(*cx, InRealm::already(&realm))
@ -374,6 +421,12 @@ unsafe extern "C" fn content_security_policy_allows(
cx: *mut RawJSContext, cx: *mut RawJSContext,
runtime_code: RuntimeCode, runtime_code: RuntimeCode,
sample: HandleString, sample: HandleString,
_compilation_type: CompilationType,
_parameter_strings: u8, //FIXME in bindings generation
_body_string: HandleString,
_parameter_args: u8, //FIXME in bindings generation
_body_arg: HandleValue,
can_compile_strings: *mut bool,
) -> bool { ) -> bool {
let mut allowed = false; let mut allowed = false;
let cx = JSContext::from_ptr(cx); let cx = JSContext::from_ptr(cx);
@ -395,7 +448,8 @@ unsafe extern "C" fn content_security_policy_allows(
RuntimeCode::WASM => global.get_csp_list().is_wasm_evaluation_allowed(global), RuntimeCode::WASM => global.get_csp_list().is_wasm_evaluation_allowed(global),
}; };
}); });
allowed *can_compile_strings = allowed;
true
} }
#[allow(unsafe_code)] #[allow(unsafe_code)]
@ -550,7 +604,7 @@ impl Runtime {
Some(empty_has_released_callback), Some(empty_has_released_callback),
); );
// Pre barriers aren't working correctly at the moment // Pre barriers aren't working correctly at the moment
DisableIncrementalGC(cx); JS_SetGCParameter(cx, JSGCParamKey::JSGC_INCREMENTAL_GC_ENABLED, 0);
unsafe extern "C" fn dispatch_to_event_loop( unsafe extern "C" fn dispatch_to_event_loop(
closure: *mut c_void, closure: *mut c_void,
@ -721,9 +775,6 @@ impl Runtime {
if let Some(val) = in_range(pref!(js_mem_gc_empty_chunk_count_min), 0, 10_000) { if let Some(val) = in_range(pref!(js_mem_gc_empty_chunk_count_min), 0, 10_000) {
JS_SetGCParameter(cx, JSGCParamKey::JSGC_MIN_EMPTY_CHUNK_COUNT, val as u32); JS_SetGCParameter(cx, JSGCParamKey::JSGC_MIN_EMPTY_CHUNK_COUNT, val as u32);
} }
if let Some(val) = in_range(pref!(js_mem_gc_empty_chunk_count_max), 0, 10_000) {
JS_SetGCParameter(cx, JSGCParamKey::JSGC_MAX_EMPTY_CHUNK_COUNT, val as u32);
}
Runtime { Runtime {
rt: runtime, rt: runtime,

View file

@ -10573,7 +10573,7 @@
[] []
], ],
"interfaces.js": [ "interfaces.js": [
"fbfc396b62c55415c0493b7528bd5e2b959452e6", "29caf5f592034c3b68800ad398f29066335d9f06",
[] []
], ],
"max-session-history-frame.html": [ "max-session-history-frame.html": [

View file

@ -19,6 +19,7 @@ function test_interfaces(interfaceNamesInGlobalScope) {
"Error", "Error",
"EvalError", "EvalError",
"FinalizationRegistry", "FinalizationRegistry",
"Float16Array",
"Float32Array", "Float32Array",
"Float64Array", "Float64Array",
"Function", "Function",