mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Update to SpiderMonkey 137.
Signed-off-by: Josh Matthews <josh@joshmatthews.net>
This commit is contained in:
parent
0774025d89
commit
b9238c5025
9 changed files with 115 additions and 47 deletions
|
@ -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
|
||||
}
|
||||
|
||||
/// <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
|
||||
pub(crate) const DOM_CALLBACKS: DOMCallbacks = DOMCallbacks {
|
||||
instanceClassMatchesProto: Some(instance_class_has_proto_at_depth),
|
||||
instanceClassIsError: Some(instance_class_is_error),
|
||||
};
|
||||
|
||||
/// Eagerly define all relevant WebIDL interface constructors on the
|
||||
|
|
|
@ -14,12 +14,10 @@ use std::rc::Rc;
|
|||
use deny_public_fields::DenyPublicFields;
|
||||
use dom_struct::dom_struct;
|
||||
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::rust::wrappers::CompileFunction;
|
||||
use js::rust::{
|
||||
CompileOptionsWrapper, HandleObject, RootedObjectVectorWrapper, transform_u16_to_source_text,
|
||||
};
|
||||
use js::rust::{CompileOptionsWrapper, HandleObject, transform_u16_to_source_text};
|
||||
use libc::c_char;
|
||||
use servo_url::ServoUrl;
|
||||
use style::str::HTML_SPACE_CHARACTERS;
|
||||
|
@ -646,7 +644,8 @@ impl EventTarget {
|
|||
};
|
||||
|
||||
// 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 {
|
||||
scopechain.append(document.reflector().get_jsobject().get());
|
||||
|
@ -659,7 +658,7 @@ impl EventTarget {
|
|||
rooted!(in(*cx) let mut handler = unsafe {
|
||||
CompileFunction(
|
||||
*cx,
|
||||
scopechain.handle(),
|
||||
scopechain.get(),
|
||||
options.ptr,
|
||||
name.as_ptr(),
|
||||
args.len() as u32,
|
||||
|
|
|
@ -30,7 +30,7 @@ use ipc_channel::ipc::{self, IpcSender};
|
|||
use ipc_channel::router::ROUTER;
|
||||
use js::glue::{IsWrapper, UnwrapObjectDynamic};
|
||||
use js::jsapi::{
|
||||
Compile1, CurrentGlobalOrNull, GetNonCCWObjectGlobal, HandleObject, Heap,
|
||||
Compile1, CurrentGlobalOrNull, DelazificationOption, GetNonCCWObjectGlobal, HandleObject, Heap,
|
||||
InstantiateGlobalStencil, InstantiateOptions, JSContext, JSObject, JSScript, SetScriptPrivate,
|
||||
};
|
||||
use js::jsval::{PrivateValue, UndefinedValue};
|
||||
|
@ -2802,6 +2802,7 @@ impl GlobalScope {
|
|||
skipFilenameValidation: false,
|
||||
hideScriptFromDebugger: false,
|
||||
deferDebugMetadata: false,
|
||||
eagerDelazificationStrategy_: DelazificationOption::OnDemandOnly,
|
||||
};
|
||||
let script = InstantiateGlobalStencil(
|
||||
*cx,
|
||||
|
|
|
@ -21,24 +21,26 @@ use std::{os, ptr, thread};
|
|||
use background_hang_monitor_api::ScriptHangAnnotation;
|
||||
use js::conversions::jsstr_to_string;
|
||||
use js::glue::{
|
||||
CollectServoSizes, CreateJobQueue, DeleteJobQueue, DispatchableRun, JobQueueTraps,
|
||||
RUST_js_GetErrorMessage, SetBuildId, StreamConsumerConsumeChunk,
|
||||
CollectServoSizes, CreateJobQueue, DeleteJobQueue, DispatchableRun, JS_GetReservedSlot,
|
||||
JobQueueTraps, RUST_js_GetErrorMessage, SetBuildId, StreamConsumerConsumeChunk,
|
||||
StreamConsumerNoteResponseURLs, StreamConsumerStreamEnd, StreamConsumerStreamError,
|
||||
};
|
||||
use js::jsapi::{
|
||||
AsmJSOption, BuildIdCharVector, ContextOptionsRef, DisableIncrementalGC,
|
||||
Dispatchable as JSRunnable, Dispatchable_MaybeShuttingDown, GCDescription, GCOptions,
|
||||
GCProgress, GCReason, GetPromiseUserInputEventHandlingState, HandleObject, HandleString, Heap,
|
||||
AsmJSOption, BuildIdCharVector, CompilationType, ContextOptionsRef, Dispatchable as JSRunnable,
|
||||
Dispatchable_MaybeShuttingDown, GCDescription, GCOptions, GCProgress, GCReason,
|
||||
GetPromiseUserInputEventHandlingState, HandleObject, HandleString, HandleValue, Heap,
|
||||
InitConsumeStreamCallback, InitDispatchToEventLoop, JS_AddExtraGCRootsTracer,
|
||||
JS_InitDestroyPrincipalsCallback, JS_InitReadPrincipalsCallback, JS_SetGCCallback,
|
||||
JS_SetGCParameter, JS_SetGlobalJitCompilerOption, JS_SetOffthreadIonCompilationEnabled,
|
||||
JS_SetParallelParsingEnabled, JS_SetSecurityCallbacks, JSContext as RawJSContext, JSGCParamKey,
|
||||
JSGCStatus, JSJitCompilerOption, JSObject, JSSecurityCallbacks, JSTracer, JobQueue, MimeType,
|
||||
JS_InitDestroyPrincipalsCallback, JS_InitReadPrincipalsCallback, JS_NewObject,
|
||||
JS_SetGCCallback, JS_SetGCParameter, JS_SetGlobalJitCompilerOption,
|
||||
JS_SetOffthreadIonCompilationEnabled, JS_SetParallelParsingEnabled, JS_SetReservedSlot,
|
||||
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,
|
||||
SetDOMCallbacks, SetGCSliceCallback, SetJobQueue, SetPreserveWrapperCallbacks,
|
||||
SetProcessBuildIdOp, SetPromiseRejectionTrackerCallback, StreamConsumer as JSStreamConsumer,
|
||||
};
|
||||
use js::jsval::UndefinedValue;
|
||||
use js::jsval::{ObjectValue, UndefinedValue};
|
||||
use js::panic::wrap_panic;
|
||||
pub(crate) use js::rust::ThreadSafeJSContext;
|
||||
use js::rust::wrappers::{GetPromiseIsHandled, JS_GetPromiseResult};
|
||||
|
@ -79,19 +81,20 @@ use crate::dom::promise::Promise;
|
|||
use crate::dom::promiserejectionevent::PromiseRejectionEvent;
|
||||
use crate::dom::response::Response;
|
||||
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_thread::trace_thread;
|
||||
use crate::task_source::SendableTaskSource;
|
||||
|
||||
static JOB_QUEUE_TRAPS: JobQueueTraps = JobQueueTraps {
|
||||
getIncumbentGlobal: Some(get_incumbent_global),
|
||||
getHostDefinedData: Some(get_host_defined_data),
|
||||
enqueuePromiseJob: Some(enqueue_promise_job),
|
||||
empty: Some(empty),
|
||||
};
|
||||
|
||||
static SECURITY_CALLBACKS: JSSecurityCallbacks = JSSecurityCallbacks {
|
||||
contentSecurityPolicyAllows: Some(content_security_policy_allows),
|
||||
codeForEvalGets: None, //TODO
|
||||
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)]
|
||||
unsafe extern "C" fn get_incumbent_global(_: *const c_void, _: *mut RawJSContext) -> *mut JSObject {
|
||||
let mut result = ptr::null_mut();
|
||||
unsafe extern "C" fn get_host_defined_data(
|
||||
_: *const c_void,
|
||||
cx: *mut RawJSContext,
|
||||
data: MutableHandleObject,
|
||||
) -> bool {
|
||||
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
|
||||
.map(|g| g.reflector().get_jsobject().get())
|
||||
.unwrap_or(ptr::null_mut())
|
||||
rooted!(in(cx) let result = JS_NewObject(cx, &HOST_DEFINED_DATA_CLASS));
|
||||
assert!(!result.is_null());
|
||||
|
||||
JS_SetReservedSlot(
|
||||
*result,
|
||||
INCUMBENT_SETTING_SLOT,
|
||||
&ObjectValue(*incumbent_global.reflector().get_jsobject()),
|
||||
);
|
||||
|
||||
data.set(result.get());
|
||||
});
|
||||
result
|
||||
true
|
||||
}
|
||||
|
||||
#[allow(unsafe_code)]
|
||||
|
@ -257,14 +298,20 @@ unsafe extern "C" fn enqueue_promise_job(
|
|||
promise: HandleObject,
|
||||
job: HandleObject,
|
||||
_allocation_site: HandleObject,
|
||||
incumbent_global: HandleObject,
|
||||
host_defined_data: HandleObject,
|
||||
) -> bool {
|
||||
let cx = JSContext::from_ptr(cx);
|
||||
let mut result = false;
|
||||
wrap_panic(&mut || {
|
||||
let microtask_queue = &*(extra as *const MicrotaskQueue);
|
||||
let global = if !incumbent_global.is_null() {
|
||||
GlobalScope::from_object(incumbent_global.get())
|
||||
let global = if !host_defined_data.is_null() {
|
||||
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 {
|
||||
let realm = AlreadyInRealm::assert_for_cx(cx);
|
||||
GlobalScope::from_context(*cx, InRealm::already(&realm))
|
||||
|
@ -374,6 +421,12 @@ unsafe extern "C" fn content_security_policy_allows(
|
|||
cx: *mut RawJSContext,
|
||||
runtime_code: RuntimeCode,
|
||||
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 {
|
||||
let mut allowed = false;
|
||||
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),
|
||||
};
|
||||
});
|
||||
allowed
|
||||
*can_compile_strings = allowed;
|
||||
true
|
||||
}
|
||||
|
||||
#[allow(unsafe_code)]
|
||||
|
@ -550,7 +604,7 @@ impl Runtime {
|
|||
Some(empty_has_released_callback),
|
||||
);
|
||||
// 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(
|
||||
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) {
|
||||
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 {
|
||||
rt: runtime,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue