aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock79
-rw-r--r--Cargo.toml5
-rw-r--r--components/script/dom/bindings/codegen/CodegenRust.py67
-rw-r--r--components/script/dom/bindings/conversions.rs12
-rw-r--r--components/script/dom/bindings/interface.rs2
-rw-r--r--components/script/dom/bindings/proxyhandler.rs85
-rw-r--r--components/script/dom/bindings/record.rs7
-rw-r--r--components/script/dom/bindings/structuredclone.rs2
-rw-r--r--components/script/dom/bindings/trace.rs3
-rw-r--r--components/script/dom/bindings/utils.rs20
-rw-r--r--components/script/dom/globalscope.rs11
-rw-r--r--components/script/dom/htmlscriptelement.rs24
-rw-r--r--components/script/dom/readablestream.rs8
-rw-r--r--components/script/dom/windowproxy.rs37
-rw-r--r--components/script/script_module.rs54
-rw-r--r--components/script/script_runtime.rs15
16 files changed, 245 insertions, 186 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 3d7fd60b335..51bb4fabb48 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -307,7 +307,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f8523b410d7187a43085e7e064416ea32ded16bd0a4e6fc025e21616d01258f"
dependencies = [
"bitflags",
- "cexpr",
+ "cexpr 0.4.0",
"clang-sys",
"clap",
"env_logger",
@@ -320,7 +320,28 @@ dependencies = [
"regex",
"rustc-hash",
"shlex",
- "which",
+ "which 3.1.1",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.62.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6720a8b7b2d39dd533285ed438d458f65b31b5c257e6ac7bb3d7e82844dd722"
+dependencies = [
+ "bitflags",
+ "cexpr 0.6.0",
+ "clang-sys",
+ "lazy_static",
+ "lazycell",
+ "peeking_take_while",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash",
+ "shlex",
+ "syn",
+ "which 4.3.0",
]
[[package]]
@@ -680,6 +701,15 @@ dependencies = [
]
[[package]]
+name = "cexpr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
+dependencies = [
+ "nom 7.1.1",
+]
+
+[[package]]
name = "cfg-if"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3924,7 +3954,6 @@ dependencies = [
[[package]]
name = "mozjs"
version = "0.14.1"
-source = "git+https://github.com/servo/rust-mozjs#a10ab915532bb3e334e564364ed3630561bccacb"
dependencies = [
"cc",
"lazy_static",
@@ -3937,9 +3966,8 @@ dependencies = [
[[package]]
name = "mozjs_sys"
version = "0.68.2"
-source = "git+https://github.com/servo/mozjs?rev=72ce2c95d24b225e3c87364608822b498b2312fb#72ce2c95d24b225e3c87364608822b498b2312fb"
dependencies = [
- "bindgen",
+ "bindgen 0.62.0",
"cc",
"encoding_c",
"encoding_c_mem",
@@ -4932,11 +4960,11 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
[[package]]
name = "proc-macro2"
-version = "1.0.37"
+version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1"
+checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
dependencies = [
- "unicode-xid",
+ "unicode-ident",
]
[[package]]
@@ -5209,9 +5237,9 @@ checksum = "2b5ceb840e4009da4841ed22a15eb49f64fdd00a2138945c5beacf506b2fb5ed"
[[package]]
name = "regex"
-version = "1.4.5"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "957056ecddbeba1b26965114e191d2e8589ce74db242b6ea25fc4062427a5c19"
+checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
dependencies = [
"aho-corasick",
"memchr",
@@ -5220,9 +5248,9 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.6.23"
+version = "0.6.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548"
+checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
[[package]]
name = "remove_dir_all"
@@ -6276,7 +6304,7 @@ dependencies = [
"app_units",
"arrayvec 0.7.1",
"atomic_refcell",
- "bindgen",
+ "bindgen 0.58.1",
"bitflags",
"byteorder",
"cssparser",
@@ -6452,13 +6480,13 @@ checksum = "e454d048db5527d000bfddb77bd072bbf3a1e2ae785f16d9bd116e07c2ab45eb"
[[package]]
name = "syn"
-version = "1.0.67"
+version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702"
+checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d"
dependencies = [
"proc-macro2",
"quote",
- "unicode-xid",
+ "unicode-ident",
]
[[package]]
@@ -6940,6 +6968,12 @@ dependencies = [
]
[[package]]
+name = "unicode-ident"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
+
+[[package]]
name = "unicode-normalization"
version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -7403,7 +7437,7 @@ version = "0.0.1"
source = "git+https://github.com/servo/webxr#af2e84a28d52521212816584e0553aaf364a9162"
dependencies = [
"android_injected_glue",
- "bindgen",
+ "bindgen 0.58.1",
"crossbeam-channel 0.4.4",
"euclid",
"gl_generator 0.13.1",
@@ -7485,6 +7519,17 @@ dependencies = [
]
[[package]]
+name = "which"
+version = "4.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b"
+dependencies = [
+ "either",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 63496aed8a3..eca471744e2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -34,6 +34,11 @@ winit = { git = "https://github.com/rust-windowing/winit.git", rev = "4192d04a53
[patch."https://github.com/jrmuizel/raqote"]
raqote = { git = "https://github.com/jdm/raqote", branch = "fkup" }
+[patch."https://github.com/servo/mozjs"]
+mozjs_sys = { path = "../mozjs/mozjs" }
+[patch."https://github.com/servo/rust-mozjs"]
+mozjs = { path = "../mozjs/rust-mozjs" }
+
# https://github.com/servo/servo/issues/27515#issuecomment-671474054
[patch."https://github.com/servo/webrender"]
webrender = { git = "https://github.com/jdm/webrender", branch = "crash-backtrace" }
diff --git a/components/script/dom/bindings/codegen/CodegenRust.py b/components/script/dom/bindings/codegen/CodegenRust.py
index 046f7984858..1242de82fa1 100644
--- a/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1886,7 +1886,7 @@ class AttrDefiner(PropertyDefiner):
"name": m.identifier.name,
"attr": m,
"flags": "JSPROP_ENUMERATE",
- "is_accessor": "true",
+ "kind": "JSPropertySpec_Kind::NativeAccessor",
}
for m in descriptor.interface.members if
m.isAttr() and m.isStatic() == static
@@ -1906,7 +1906,7 @@ class AttrDefiner(PropertyDefiner):
"name": "@@toStringTag",
"attr": None,
"flags": "JSPROP_READONLY",
- "is_accessor": "false",
+ "kind": "JSPropertySpec_Kind::Value",
})
def generateArray(self, array, name):
@@ -1963,13 +1963,13 @@ class AttrDefiner(PropertyDefiner):
def specData(attr):
if attr["name"] == "@@toStringTag":
- return (attr["name"][2:], attr["flags"], attr["is_accessor"],
+ return (attr["name"][2:], attr["flags"], attr["kind"],
str_to_const_array(self.descriptor.interface.getClassName()))
flags = attr["flags"]
if self.unforgeable:
flags += " | JSPROP_PERMANENT"
- return (str_to_const_array(attr["attr"].identifier.name), flags, attr["is_accessor"], getter(attr),
+ return (str_to_const_array(attr["attr"].identifier.name), flags, attr["kind"], getter(attr),
setter(attr))
def template(m):
@@ -1977,7 +1977,7 @@ class AttrDefiner(PropertyDefiner):
return """ JSPropertySpec {
name: JSPropertySpec_Name { symbol_: SymbolCode::%s as usize + 1 },
attributes_: (%s) as u8,
- isAccessor_: (%s),
+ kind_: (%s),
u: JSPropertySpec_AccessorsOrValue {
value: JSPropertySpec_ValueWrapper {
type_: JSPropertySpec_ValueWrapper_Type::String,
@@ -1991,7 +1991,7 @@ class AttrDefiner(PropertyDefiner):
return """ JSPropertySpec {
name: JSPropertySpec_Name { string_: %s as *const u8 as *const libc::c_char },
attributes_: (%s) as u8,
- isAccessor_: (%s),
+ kind_: (%s),
u: JSPropertySpec_AccessorsOrValue {
accessors: JSPropertySpec_AccessorsOrValue_Accessors {
getter: JSPropertySpec_Accessor {
@@ -2361,7 +2361,6 @@ static CLASS_OPS: js::jsapi::JSClassOps = js::jsapi::JSClassOps {
mayResolve: None,
finalize: Some(%(finalizeHook)s),
call: None,
- hasInstance: None,
construct: None,
trace: Some(%(traceHook)s),
};
@@ -3620,7 +3619,6 @@ let traps = ProxyTraps {
hasOwn: Some(hasOwn),
getOwnEnumerablePropertyKeys: Some(%(getOwnEnumerablePropertyKeys)s),
nativeCall: None,
- hasInstance: None,
objectClassIs: None,
className: Some(className),
fun_toString: None,
@@ -5368,7 +5366,7 @@ class CGProxySpecialOperation(CGPerSignatureCall):
}
self.cgRoot.prepend(instantiateJSToNativeConversionTemplate(
template, templateValues, declType, argument.identifier.name))
- self.cgRoot.prepend(CGGeneric("rooted!(in(*cx) let value = desc.value);"))
+ self.cgRoot.prepend(CGGeneric("rooted!(in(*cx) let value = desc.value_);"))
def getArguments(self):
args = [(a, process_arg(a.identifier.name, a)) for a in self.arguments]
@@ -5471,7 +5469,8 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
def __init__(self, descriptor):
args = [Argument('*mut JSContext', 'cx'), Argument('RawHandleObject', 'proxy'),
Argument('RawHandleId', 'id'),
- Argument('RawMutableHandle<PropertyDescriptor>', 'mut desc')]
+ Argument('RawMutableHandle<PropertyDescriptor>', 'mut desc'),
+ Argument('*mut bool', 'is_none')]
CGAbstractExternMethod.__init__(self, descriptor, "getOwnPropertyDescriptor",
"bool", args)
self.descriptor = descriptor
@@ -5487,12 +5486,12 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
"""
if !proxyhandler::is_platform_object_same_origin(cx, proxy) {
if !proxyhandler::cross_origin_get_own_property_helper(
- cx, proxy, &CROSS_ORIGIN_PROPERTIES, id, desc
+ cx, proxy, &CROSS_ORIGIN_PROPERTIES, id, desc, &mut *is_none
) {
return false;
}
- if desc.obj.is_null() {
- return proxyhandler::cross_origin_property_fallback(cx, proxy, id, desc);
+ if *is_none {
+ return proxyhandler::cross_origin_property_fallback(cx, proxy, id, desc, &mut *is_none);
}
return true;
}
@@ -5507,8 +5506,12 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
attrs = "JSPROP_ENUMERATE"
if self.descriptor.operations['IndexedSetter'] is None:
attrs += " | JSPROP_READONLY"
- fillDescriptor = ("desc.value = result_root.get();\n"
- "fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), (%s) as u32);\n"
+ fillDescriptor = ("set_property_descriptor(\n"
+ " MutableHandle::from_raw(desc),\n"
+ " result_root.handle(),\n"
+ " (%s) as u32,\n"
+ " &mut *is_none\n"
+ ");\n"
"return true;" % attrs)
templateValues = {
'jsvalRef': 'result_root.handle_mut()',
@@ -5532,8 +5535,12 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
attrs = " | ".join(attrs)
else:
attrs = "0"
- fillDescriptor = ("desc.value = result_root.get();\n"
- "fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), (%s) as u32);\n"
+ fillDescriptor = ("set_property_descriptor(\n"
+ " MutableHandle::from_raw(desc),\n"
+ " result_root.handle(),\n"
+ " (%s) as u32,\n"
+ " &mut *is_none\n"
+ ");\n"
"return true;" % attrs)
templateValues = {
'jsvalRef': 'result_root.handle_mut()',
@@ -5542,7 +5549,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod):
}
# See the similar-looking in CGDOMJSProxyHandler_get for the spec quote.
- condition = "RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id)"
+ condition = "id.is_string() || id.is_int()"
if indexedGetter:
condition = "index.is_none() && (%s)" % condition
# Once we start supporting OverrideBuiltins we need to make
@@ -5569,17 +5576,16 @@ get_expando_object(proxy, expando.handle_mut());
let proxy_lt = Handle::from_raw(proxy);
let id_lt = Handle::from_raw(id);
if !expando.is_null() {
- if !JS_GetPropertyDescriptorById(*cx, expando.handle().into(), id, desc) {
+ rooted!(in(*cx) let mut ignored = ptr::null_mut::<JSObject>());
+ if !JS_GetPropertyDescriptorById(*cx, expando.handle().into(), id, desc, ignored.handle_mut().into(), is_none) {
return false;
}
- if !desc.obj.is_null() {
+ if !*is_none {
// Pretend the property lives on the wrapper.
- desc.obj = proxy.get();
return true;
}
}
""" + namedGet + """\
-desc.obj = ptr::null_mut();
return true;"""
def definition_body(self):
@@ -5628,12 +5634,12 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod):
if self.descriptor.hasUnforgeableMembers:
raise TypeError("Can't handle a named setter on an interface that has "
"unforgeables. Figure out how that should work!")
- set += ("if RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id) {\n"
+ set += ("if id.is_string() || id.is_int() {\n"
+ CGIndenter(CGProxyNamedSetter(self.descriptor)).define()
+ " return (*opresult).succeed();\n"
+ "}\n")
elif self.descriptor.operations['NamedGetter']:
- set += ("if RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id) {\n"
+ set += ("if id.is_string() || id.is_int() {\n"
+ CGIndenter(CGProxyNamedGetter(self.descriptor)).define()
+ " if result.is_some() {\n"
" return (*opresult).failNoNamedSetter();\n"
@@ -5839,7 +5845,7 @@ class CGDOMJSProxyHandler_hasOwn(CGAbstractExternMethod):
+ "}\n\n")
namedGetter = self.descriptor.operations['NamedGetter']
- condition = "RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id)"
+ condition = "id.is_string() || id.is_int()"
if indexedGetter:
condition = "index.is_none() && (%s)" % condition
if namedGetter:
@@ -5939,7 +5945,7 @@ if !expando.is_null() {
namedGetter = self.descriptor.operations['NamedGetter']
if namedGetter:
- condition = "RUST_JSID_IS_STRING(id) || RUST_JSID_IS_INT(id)"
+ condition = "id.is_string() || id.is_int()"
# From step 1:
# If O supports indexed properties and P is an array index, then:
#
@@ -6139,7 +6145,7 @@ class CGClassFinalizeHook(CGAbstractClassHook):
A hook for finalize, used to release our native object.
"""
def __init__(self, descriptor):
- args = [Argument('*mut JSFreeOp', '_fop'), Argument('*mut JSObject', 'obj')]
+ args = [Argument('*mut GCContext', '_cx'), Argument('*mut JSObject', 'obj')]
CGAbstractClassHook.__init__(self, descriptor, FINALIZE_HOOK_NAME,
'void', args)
@@ -6302,6 +6308,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
'js::jsapi::CallArgs',
'js::jsapi::CurrentGlobalOrNull',
'js::rust::wrappers::GetPropertyKeys',
+ 'js::jsapi::GCContext',
'js::jsapi::GetWellKnownSymbol',
'js::rust::Handle',
'js::jsapi::Handle as RawHandle',
@@ -6320,7 +6327,6 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
'js::jsapi::JSCLASS_RESERVED_SLOTS_SHIFT',
'js::jsapi::JSClass',
'js::jsapi::JSContext',
- 'js::jsapi::JSFreeOp',
'js::jsapi::JSFunctionSpec',
'js::jsapi::JSITER_HIDDEN',
'js::jsapi::JSITER_OWNONLY',
@@ -6345,6 +6351,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
'js::jsapi::JSPropertySpec_Accessor',
'js::jsapi::JSPropertySpec_AccessorsOrValue',
'js::jsapi::JSPropertySpec_AccessorsOrValue_Accessors',
+ 'js::jsapi::JSPropertySpec_Kind',
'js::jsapi::JSPropertySpec_Name',
'js::jsapi::JSPropertySpec_ValueWrapper',
'js::jsapi::JSPropertySpec_ValueWrapper_Type',
@@ -6414,8 +6421,6 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
'js::glue::SetProxyReservedSlot',
'js::rust::wrappers::NewProxyObject',
'js::glue::ProxyTraps',
- 'js::glue::RUST_JSID_IS_INT',
- 'js::glue::RUST_JSID_IS_STRING',
'js::rust::wrappers::RUST_SYMBOL_TO_JSID',
'js::rust::wrappers::int_to_jsid',
'js::glue::UnwrapObjectDynamic',
@@ -6521,7 +6526,7 @@ def generate_imports(config, cgthings, descriptors, callbacks=None, dictionaries
'crate::dom::bindings::inheritance::Castable',
'crate::dom::bindings::proxyhandler',
'crate::dom::bindings::proxyhandler::ensure_expando_object',
- 'crate::dom::bindings::proxyhandler::fill_property_descriptor',
+ 'crate::dom::bindings::proxyhandler::set_property_descriptor',
'crate::dom::bindings::proxyhandler::get_expando_object',
'crate::dom::bindings::record::Record',
'std::ptr::NonNull',
diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs
index 4964180753d..25cd0f206b7 100644
--- a/components/script/dom/bindings/conversions.rs
+++ b/components/script/dom/bindings/conversions.rs
@@ -53,8 +53,6 @@ use js::error::throw_type_error;
use js::glue::GetProxyReservedSlot;
use js::glue::JS_GetReservedSlot;
use js::glue::{IsWrapper, UnwrapObjectDynamic};
-use js::glue::{RUST_JSID_IS_INT, RUST_JSID_TO_INT};
-use js::glue::{RUST_JSID_IS_STRING, RUST_JSID_TO_STRING};
use js::jsapi::{Heap, JSContext, JSObject, JSString};
use js::jsapi::{IsWindowProxy, JS_DeprecatedStringHasLatin1Chars, JS_NewStringCopyN};
use js::jsapi::{
@@ -160,13 +158,13 @@ where
///
/// Handling of invalid UTF-16 in strings depends on the relevant option.
pub unsafe fn jsid_to_string(cx: *mut JSContext, id: HandleId) -> Option<DOMString> {
- let id_raw = id.into();
- if RUST_JSID_IS_STRING(id_raw) {
- return Some(jsstring_to_str(cx, RUST_JSID_TO_STRING(id_raw)));
+ let id_raw = *id;
+ if id_raw.is_string() {
+ return Some(jsstring_to_str(cx, id_raw.to_string()));
}
- if RUST_JSID_IS_INT(id_raw) {
- return Some(RUST_JSID_TO_INT(id_raw).to_string().into());
+ if id_raw.is_int() {
+ return Some(id_raw.to_int().to_string().into());
}
None
diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs
index f73152c9df7..e6d0b9d0df5 100644
--- a/components/script/dom/bindings/interface.rs
+++ b/components/script/dom/bindings/interface.rs
@@ -105,7 +105,6 @@ impl InterfaceConstructorBehavior {
finalize: None,
call: Some(invalid_constructor),
construct: Some(invalid_constructor),
- hasInstance: None, // heycam/webidl#356
trace: None,
})
}
@@ -122,7 +121,6 @@ impl InterfaceConstructorBehavior {
finalize: None,
call: Some(non_new_constructor),
construct: Some(hook),
- hasInstance: None, // heycam/webidl#356
trace: None,
})
}
diff --git a/components/script/dom/bindings/proxyhandler.rs b/components/script/dom/bindings/proxyhandler.rs
index 3650df6186b..1d9e8155104 100644
--- a/components/script/dom/bindings/proxyhandler.rs
+++ b/components/script/dom/bindings/proxyhandler.rs
@@ -44,8 +44,8 @@ use js::jsval::ObjectValue;
use js::jsval::UndefinedValue;
use js::rust::wrappers::JS_AlreadyHasOwnPropertyById;
use js::rust::wrappers::JS_NewObjectWithGivenProto;
-use js::rust::wrappers::{AppendToIdVector, RUST_INTERNED_STRING_TO_JSID};
-use js::rust::{get_context_realm, Handle, HandleObject, MutableHandle, MutableHandleObject};
+use js::rust::wrappers::{AppendToIdVector, RUST_INTERNED_STRING_TO_JSID, SetDataPropertyDescriptor};
+use js::rust::{get_context_realm, Handle, HandleObject, HandleValue, MutableHandle, MutableHandleObject};
use std::{ffi::CStr, os::raw::c_char, ptr};
/// Determine if this id shadows any existing properties for this proxy.
@@ -189,15 +189,16 @@ pub unsafe fn ensure_expando_object(
/// Set the property descriptor's object to `obj` and set it to enumerable,
/// and writable if `readonly` is true.
-pub fn fill_property_descriptor(
- mut desc: MutableHandle<PropertyDescriptor>,
- obj: *mut JSObject,
+pub fn set_property_descriptor(
+ desc: MutableHandle<PropertyDescriptor>,
+ value: HandleValue,
attrs: u32,
+ is_none: &mut bool,
) {
- desc.obj = obj;
- desc.attrs = attrs;
- desc.getter = None;
- desc.setter = None;
+ unsafe {
+ SetDataPropertyDescriptor(desc, value, attrs);
+ }
+ *is_none = false;
}
/// <https://html.spec.whatwg.org/multipage/#isplatformobjectsameorigin-(-o-)>
@@ -333,12 +334,14 @@ pub unsafe extern "C" fn maybe_cross_origin_set_rawcx(
// OrdinarySet
// <https://tc39.es/ecma262/#sec-ordinaryset>
rooted!(in(*cx) let mut own_desc = PropertyDescriptor::default());
+ let mut is_none = false;
if !InvokeGetOwnPropertyDescriptor(
GetProxyHandler(*proxy),
*cx,
proxy,
id,
own_desc.handle_mut().into(),
+ &mut is_none,
) {
return false;
}
@@ -439,26 +442,28 @@ pub unsafe fn cross_origin_get(
) -> bool {
// > 1. Let `desc` be `? O.[[GetOwnProperty]](P)`.
rooted!(in(*cx) let mut descriptor = PropertyDescriptor::default());
+ let mut is_none = false;
if !InvokeGetOwnPropertyDescriptor(
GetProxyHandler(*proxy),
*cx,
proxy,
id,
descriptor.handle_mut().into(),
+ &mut is_none,
) {
return false;
}
// > 2. Assert: `desc` is not undefined.
assert!(
- !descriptor.obj.is_null(),
+ !is_none,
"Callees should throw in all cases when they are not finding \
a property decriptor"
);
// > 3. If `! IsDataDescriptor(desc)` is true, then return `desc.[[Value]]`.
if is_data_descriptor(&descriptor) {
- vp.set(descriptor.value);
+ vp.set(descriptor.value_);
return true;
}
@@ -504,19 +509,21 @@ pub unsafe fn cross_origin_set(
) -> bool {
// > 1. Let desc be ? O.[[GetOwnProperty]](P).
rooted!(in(*cx) let mut descriptor = PropertyDescriptor::default());
+ let mut is_none = false;
if !InvokeGetOwnPropertyDescriptor(
GetProxyHandler(*proxy),
*cx,
proxy,
id,
descriptor.handle_mut().into(),
+ &mut is_none,
) {
return false;
}
// > 2. Assert: desc is not undefined.
assert!(
- !descriptor.obj.is_null(),
+ !is_none,
"Callees should throw in all cases when they are not finding \
a property decriptor"
);
@@ -557,32 +564,25 @@ pub unsafe fn cross_origin_set(
}
unsafe fn get_getter_object(d: &PropertyDescriptor, out: RawMutableHandleObject) {
- if (d.attrs & jsapi::JSPROP_GETTER as u32) != 0 {
- out.set(std::mem::transmute(d.getter));
+ if d.hasGetter_() {
+ out.set(std::mem::transmute(d.getter_));
}
}
unsafe fn get_setter_object(d: &PropertyDescriptor, out: RawMutableHandleObject) {
- if (d.attrs & jsapi::JSPROP_SETTER as u32) != 0 {
- out.set(std::mem::transmute(d.setter));
+ if d.hasSetter_() {
+ out.set(std::mem::transmute(d.setter_));
}
}
/// <https://tc39.es/ecma262/#sec-isaccessordescriptor>
fn is_accessor_descriptor(d: &PropertyDescriptor) -> bool {
- d.attrs & (jsapi::JSPROP_GETTER as u32 | jsapi::JSPROP_SETTER as u32) != 0
+ d.hasSetter_() || d.hasGetter_()
}
/// <https://tc39.es/ecma262/#sec-isdatadescriptor>
fn is_data_descriptor(d: &PropertyDescriptor) -> bool {
- let is_accessor = is_accessor_descriptor(d);
- let is_generic = d.attrs &
- (jsapi::JSPROP_GETTER as u32 |
- jsapi::JSPROP_SETTER as u32 |
- jsapi::JSPROP_IGNORE_READONLY |
- jsapi::JSPROP_IGNORE_VALUE) ==
- jsapi::JSPROP_IGNORE_READONLY | jsapi::JSPROP_IGNORE_VALUE;
- !is_accessor && !is_generic
+ d.hasWritable_() || d.hasValue_()
}
/// Evaluate `CrossOriginGetOwnPropertyHelper(proxy, id) != null`.
@@ -621,7 +621,8 @@ pub unsafe fn cross_origin_get_own_property_helper(
proxy: RawHandleObject,
cross_origin_properties: &'static CrossOriginProperties,
id: RawHandleId,
- mut desc: RawMutableHandle<PropertyDescriptor>,
+ desc: RawMutableHandle<PropertyDescriptor>,
+ is_none: &mut bool,
) -> bool {
rooted!(in(*cx) let mut holder = ptr::null_mut::<JSObject>());
@@ -632,15 +633,7 @@ pub unsafe fn cross_origin_get_own_property_helper(
holder.handle_mut().into(),
);
- if !JS_GetOwnPropertyDescriptorById(*cx, holder.handle().into(), id, desc) {
- return false;
- }
-
- if !desc.obj.is_null() {
- desc.obj = proxy.get();
- }
-
- true
+ return JS_GetOwnPropertyDescriptorById(*cx, holder.handle().into(), id, desc, is_none);
}
/// Implementation of [`CrossOriginPropertyFallback`].
@@ -651,24 +644,24 @@ pub unsafe fn cross_origin_get_own_property_helper(
/// [`CrossOriginPropertyFallback`]: https://html.spec.whatwg.org/multipage/#crossoriginpropertyfallback-(-p-)
pub unsafe fn cross_origin_property_fallback(
cx: SafeJSContext,
- proxy: RawHandleObject,
+ _proxy: RawHandleObject,
id: RawHandleId,
- mut desc: RawMutableHandle<PropertyDescriptor>,
+ desc: RawMutableHandle<PropertyDescriptor>,
+ is_none: &mut bool,
) -> bool {
- assert!(desc.obj.is_null(), "why are we being called?");
+ assert!(*is_none, "why are we being called?");
// > 1. If P is `then`, `@@toStringTag`, `@@hasInstance`, or
// > `@@isConcatSpreadable`, then return `PropertyDescriptor{ [[Value]]:
// > undefined, [[Writable]]: false, [[Enumerable]]: false,
// > [[Configurable]]: true }`.
if is_cross_origin_allowlisted_prop(cx, id) {
- *desc = PropertyDescriptor {
- getter: None,
- setter: None,
- value: UndefinedValue(),
- attrs: jsapi::JSPROP_READONLY as u32,
- obj: proxy.get(),
- };
+ set_property_descriptor(
+ MutableHandle::from_raw(desc),
+ HandleValue::undefined(),
+ jsapi::JSPROP_READONLY as u32,
+ is_none,
+ );
return true;
}
@@ -695,7 +688,7 @@ unsafe fn is_cross_origin_allowlisted_prop(cx: SafeJSContext, id: RawHandleId) -
);
// `jsid`s containing `JS::Symbol *` can be compared by
// referential equality
- allowed_id.get().asBits == id.asBits
+ allowed_id.get().asBits_ == id.asBits_
})
}
diff --git a/components/script/dom/bindings/record.rs b/components/script/dom/bindings/record.rs
index c54a2403d70..1cd727c0c71 100644
--- a/components/script/dom/bindings/record.rs
+++ b/components/script/dom/bindings/record.rs
@@ -20,7 +20,7 @@ use js::jsval::ObjectValue;
use js::jsval::UndefinedValue;
use js::rust::wrappers::GetPropertyKeys;
use js::rust::wrappers::JS_DefineUCProperty2;
-use js::rust::wrappers::JS_GetOwnPropertyDescriptorById;
+use js::jsapi::glue::JS_GetOwnPropertyDescriptorById;
use js::rust::wrappers::JS_GetPropertyById;
use js::rust::wrappers::JS_IdToValue;
use js::rust::HandleId;
@@ -135,12 +135,13 @@ where
rooted!(in(cx) let id = *id);
rooted!(in(cx) let mut desc = PropertyDescriptor::default());
- if !JS_GetOwnPropertyDescriptorById(cx, object.handle(), id.handle(), desc.handle_mut())
+ let mut is_none = false;
+ if !JS_GetOwnPropertyDescriptorById(cx, object.handle().into(), id.handle().into(), desc.handle_mut().into(), &mut is_none)
{
return Err(());
}
- if (JSPROP_ENUMERATE as u32) & desc.attrs == 0 {
+ if !desc.enumerable_() {
continue;
}
diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs
index 132f3f78222..19dcf78ccd4 100644
--- a/components/script/dom/bindings/structuredclone.rs
+++ b/components/script/dom/bindings/structuredclone.rs
@@ -306,6 +306,7 @@ pub fn write(
let policy = CloneDataPolicy {
allowIntraClusterClonableSharedObjects_: false,
allowSharedMemoryObjects_: false,
+ allowErrorStackFrames_: false,
};
let result = JS_WriteStructuredClone(
*cx,
@@ -382,6 +383,7 @@ pub fn read(
&CloneDataPolicy {
allowIntraClusterClonableSharedObjects_: false,
allowSharedMemoryObjects_: false,
+ allowErrorStackFrames_: false,
},
&STRUCTURED_CLONE_CALLBACKS,
sc_holder_ptr as *mut raw::c_void,
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs
index efba7c718d1..a9b5733c9ff 100644
--- a/components/script/dom/bindings/trace.rs
+++ b/components/script/dom/bindings/trace.rs
@@ -82,7 +82,7 @@ use js::jsapi::{
GCTraceKindToAscii, Heap, JSObject, JSScript, JSString, JSTracer, JobQueue, TraceKind,
};
use js::jsval::JSVal;
-use js::rust::{GCMethods, Handle, Runtime};
+use js::rust::{GCMethods, Handle, Runtime, Stencil};
use js::typedarray::TypedArray;
use js::typedarray::TypedArrayElement;
use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
@@ -677,6 +677,7 @@ unsafe_no_jsmanaged_fields!(MediaMetadata);
unsafe_no_jsmanaged_fields!(WebrenderIpcSender);
unsafe_no_jsmanaged_fields!(StreamConsumer);
unsafe_no_jsmanaged_fields!(DocumentAnimationSet);
+unsafe_no_jsmanaged_fields!(Stencil);
unsafe impl<'a> JSTraceable for &'a str {
#[inline]
diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs
index 77192291416..e7b3845cae3 100644
--- a/components/script/dom/bindings/utils.rs
+++ b/components/script/dom/bindings/utils.rs
@@ -19,10 +19,8 @@ use crate::script_runtime::JSContext as SafeJSContext;
use js::conversions::ToJSValConvertible;
use js::glue::JS_GetReservedSlot;
use js::glue::{CallJitGetterOp, CallJitMethodOp, CallJitSetterOp, IsWrapper};
-use js::glue::{UnwrapObjectDynamic, UnwrapObjectStatic, RUST_JSID_TO_INT, RUST_JSID_TO_STRING};
-use js::glue::{
- RUST_FUNCTION_VALUE_TO_JITINFO, RUST_JSID_IS_INT, RUST_JSID_IS_STRING, RUST_JSID_IS_VOID,
-};
+use js::glue::{UnwrapObjectDynamic, UnwrapObjectStatic};
+use js::glue::RUST_FUNCTION_VALUE_TO_JITINFO;
use js::jsapi::HandleId as RawHandleId;
use js::jsapi::HandleObject as RawHandleObject;
use js::jsapi::MutableHandleIdVector as RawMutableHandleIdVector;
@@ -192,16 +190,16 @@ pub unsafe fn get_property_on_prototype(
/// Get an array index from the given `jsid`. Returns `None` if the given
/// `jsid` is not an integer.
pub unsafe fn get_array_index_from_id(_cx: *mut JSContext, id: HandleId) -> Option<u32> {
- let raw_id = id.into();
- if RUST_JSID_IS_INT(raw_id) {
- return Some(RUST_JSID_TO_INT(raw_id) as u32);
+ let raw_id = *id;
+ if raw_id.is_int() {
+ return Some(raw_id.to_int() as u32);
}
- if RUST_JSID_IS_VOID(raw_id) || !RUST_JSID_IS_STRING(raw_id) {
+ if raw_id.is_void() || !raw_id.is_string() {
return None;
}
- let atom = RUST_JSID_TO_STRING(raw_id) as *mut JSAtom;
+ let atom = raw_id.to_string() as *mut JSAtom;
let s = AtomToLinearString(atom);
if GetLinearStringLength(s) == 0 {
return None;
@@ -451,12 +449,12 @@ pub unsafe extern "C" fn resolve_global(
if *rval {
return true;
}
- if !RUST_JSID_IS_STRING(id) {
+ if !id.is_string() {
*rval = false;
return true;
}
- let string = RUST_JSID_TO_STRING(id);
+ let string = id.to_string();
if !JS_DeprecatedStringHasLatin1Chars(string) {
*rval = false;
return true;
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index 6e576c036f7..93d1b90abe5 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -82,7 +82,7 @@ use js::glue::{IsWrapper, UnwrapObjectDynamic};
use js::jsapi::Compile1;
use js::jsapi::SetScriptPrivate;
use js::jsapi::{CurrentGlobalOrNull, GetNonCCWObjectGlobal};
-use js::jsapi::{HandleObject, Heap};
+use js::jsapi::{HandleObject, Heap, InstantiateOptions, InstantiateGlobalStencil};
use js::jsapi::{JSContext, JSObject, JSScript};
use js::jsval::PrivateValue;
use js::jsval::{JSVal, UndefinedValue};
@@ -120,6 +120,7 @@ use std::collections::hash_map::Entry;
use std::collections::{HashMap, VecDeque};
use std::mem;
use std::ops::Index;
+use std::ptr;
use std::rc::Rc;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
@@ -2625,7 +2626,13 @@ impl GlobalScope {
}
},
SourceCode::Compiled(pre_compiled_script) => {
- compiled_script.set(pre_compiled_script.source_code.get());
+ let options = InstantiateOptions {
+ skipFilenameValidation: false,
+ hideScriptFromDebugger: false,
+ deferDebugMetadata: false,
+ };
+ let script = InstantiateGlobalStencil(*cx, &options, *pre_compiled_script.source_code, ptr::null_mut());
+ compiled_script.set(script);
},
};
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index d27fee98fb5..0b867750d14 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -13,7 +13,6 @@ use crate::dom::bindings::reflector::DomObject;
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::settings_stack::AutoEntryScript;
use crate::dom::bindings::str::{DOMString, USVString};
-use crate::dom::bindings::trace::RootedTraceableBox;
use crate::dom::document::Document;
use crate::dom::element::{
cors_setting_for_element, referrer_policy_for_element, reflect_cross_origin_attribute,
@@ -44,10 +43,10 @@ use html5ever::{LocalName, Prefix};
use ipc_channel::ipc;
use ipc_channel::router::ROUTER;
use js::jsapi::{
- CanCompileOffThread, CompileOffThread1, FinishOffThreadScript, Heap, JSScript, OffThreadToken,
+ CanCompileOffThread, CompileToStencilOffThread1, OffThreadToken,
};
use js::jsval::UndefinedValue;
-use js::rust::{transform_str_to_source_text, CompileOptionsWrapper};
+use js::rust::{transform_str_to_source_text, CompileOptionsWrapper, FinishOffThreadStencil, Stencil};
use msg::constellation_msg::PipelineId;
use net_traits::request::{
CorsSettings, CredentialsMode, Destination, ParserMetadata, RequestBuilder,
@@ -66,6 +65,7 @@ use std::io::{Read, Seek, Write};
use std::mem::replace;
use std::path::PathBuf;
use std::process::Command;
+use std::ptr;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS};
@@ -113,21 +113,16 @@ unsafe extern "C" fn off_thread_compilation_callback(
let cx = global.get_cx();
let _ar = enter_realm(&*global);
- rooted!(in(*cx)
- let compiled_script = FinishOffThreadScript(*cx, token.0)
- );
+ let compiled_script = FinishOffThreadStencil(*cx, token.0, ptr::null_mut());
- let load = if compiled_script.get().is_null() {
+ let load = if compiled_script.is_null() {
Err(NetworkError::Internal(
"Off-thread compilation failed.".into(),
))
} else {
let script_text = DOMString::from(script);
- let heap = Heap::default();
- let source_code = RootedTraceableBox::new(heap);
- source_code.set(compiled_script.get());
let code = SourceCode::Compiled(CompiledSourceCode {
- source_code: source_code,
+ source_code: compiled_script,
original_text: Rc::new(script_text),
});
@@ -244,7 +239,7 @@ pub enum ScriptType {
#[derive(JSTraceable, MallocSizeOf)]
pub struct CompiledSourceCode {
#[ignore_malloc_size_of = "SM handles JS values"]
- pub source_code: RootedTraceableBox<Heap<*mut JSScript>>,
+ pub source_code: Stencil,
#[ignore_malloc_size_of = "Rc is hard"]
pub original_text: Rc<DOMString>,
}
@@ -446,7 +441,7 @@ impl FetchResponseListener for ClassicContext {
});
unsafe {
- assert!(!CompileOffThread1(
+ assert!(!CompileToStencilOffThread1(
*cx,
options.ptr as *const _,
&mut transform_str_to_source_text(&context.script_text) as *mut _,
@@ -1113,7 +1108,8 @@ impl HTMLScriptElement {
.map(|record| record.handle());
if let Some(record) = record {
- let evaluated = module_tree.execute_module(global, record);
+ rooted!(in(*global.get_cx()) let mut rval = UndefinedValue());
+ let evaluated = module_tree.execute_module(global, record, rval.handle_mut().into());
if let Err(exception) = evaluated {
module_tree.set_rethrow_error(exception);
diff --git a/components/script/dom/readablestream.rs b/components/script/dom/readablestream.rs
index 90e6c72da70..e8c56ac813e 100644
--- a/components/script/dom/readablestream.rs
+++ b/components/script/dom/readablestream.rs
@@ -24,7 +24,8 @@ use js::jsapi::{
ReadableStreamDefaultReaderRead, ReadableStreamError, ReadableStreamGetReader,
ReadableStreamIsDisturbed, ReadableStreamIsLocked, ReadableStreamIsReadable,
ReadableStreamReaderMode, ReadableStreamReaderReleaseLock, ReadableStreamUnderlyingSource,
- ReadableStreamUpdateDataAvailableFromSource, UnwrapReadableStream,
+ ReadableStreamUpdateDataAvailableFromSource, UnwrapReadableStream, JS_GetArrayBufferViewData,
+ AutoRequireNoGC,
};
use js::jsval::JSVal;
use js::jsval::UndefinedValue;
@@ -332,11 +333,14 @@ unsafe extern "C" fn write_into_read_request_buffer(
source: *const c_void,
_cx: *mut JSContext,
_stream: HandleObject,
- buffer: *mut c_void,
+ chunk: HandleObject,
length: usize,
bytes_written: *mut usize,
) {
let source = &*(source as *const ExternalUnderlyingSourceController);
+ let mut is_shared_memory = false;
+ let buffer = JS_GetArrayBufferViewData(*chunk, &mut is_shared_memory, &AutoRequireNoGC { _address: 0 });
+ assert!(!is_shared_memory);
let slice = slice::from_raw_parts_mut(buffer as *mut u8, length);
source.write_into_buffer(slice);
diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs
index bccded0f43c..43240ed1040 100644
--- a/components/script/dom/windowproxy.rs
+++ b/components/script/dom/windowproxy.rs
@@ -6,7 +6,7 @@ use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::conversions::{root_from_handleobject, ToJSValConvertible};
use crate::dom::bindings::error::{throw_dom_exception, Error, Fallible};
use crate::dom::bindings::inheritance::Castable;
-use crate::dom::bindings::proxyhandler::fill_property_descriptor;
+use crate::dom::bindings::proxyhandler::set_property_descriptor;
use crate::dom::bindings::reflector::{DomObject, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::bindings::str::{DOMString, USVString};
@@ -25,7 +25,9 @@ use embedder_traits::EmbedderMsg;
use indexmap::map::IndexMap;
use ipc_channel::ipc;
use js::glue::{CreateWrapperProxyHandler, ProxyTraps};
-use js::glue::{GetProxyPrivate, GetProxyReservedSlot, SetProxyReservedSlot};
+use js::glue::{
+ GetProxyPrivate, GetProxyReservedSlot, SetProxyReservedSlot,
+};
use js::jsapi::Handle as RawHandle;
use js::jsapi::HandleId as RawHandleId;
use js::jsapi::HandleObject as RawHandleObject;
@@ -33,7 +35,7 @@ use js::jsapi::HandleValue as RawHandleValue;
use js::jsapi::MutableHandle as RawMutableHandle;
use js::jsapi::MutableHandleObject as RawMutableHandleObject;
use js::jsapi::MutableHandleValue as RawMutableHandleValue;
-use js::jsapi::{JSAutoRealm, JSContext, JSErrNum, JSFreeOp, JSObject};
+use js::jsapi::{JSAutoRealm, JSContext, JSErrNum, JSObject, GCContext};
use js::jsapi::{JSTracer, JS_DefinePropertyById, JSPROP_ENUMERATE, JSPROP_READONLY};
use js::jsapi::{JS_ForwardGetPropertyTo, JS_ForwardSetPropertyTo};
use js::jsapi::{JS_GetOwnPropertyDescriptorById, JS_IsExceptionPending};
@@ -901,30 +903,26 @@ unsafe extern "C" fn getOwnPropertyDescriptor(
cx: *mut JSContext,
proxy: RawHandleObject,
id: RawHandleId,
- mut desc: RawMutableHandle<PropertyDescriptor>,
+ desc: RawMutableHandle<PropertyDescriptor>,
+ is_none: *mut bool,
) -> bool {
let window = GetSubframeWindowProxy(cx, proxy, id);
if let Some((window, attrs)) = window {
rooted!(in(cx) let mut val = UndefinedValue());
window.to_jsval(cx, val.handle_mut());
- desc.value = val.get();
- fill_property_descriptor(MutableHandle::from_raw(desc), proxy.get(), attrs);
+ set_property_descriptor(
+ MutableHandle::from_raw(desc),
+ val.handle().into(),
+ attrs,
+ &mut *is_none,
+ );
return true;
}
let mut slot = UndefinedValue();
GetProxyPrivate(proxy.get(), &mut slot);
rooted!(in(cx) let target = slot.to_object());
- if !JS_GetOwnPropertyDescriptorById(cx, target.handle().into(), id, desc) {
- return false;
- }
-
- assert!(desc.obj.is_null() || desc.obj == target.get());
- if desc.obj == target.get() {
- desc.obj = proxy.get();
- }
-
- true
+ return JS_GetOwnPropertyDescriptorById(cx, target.handle().into(), id, desc, is_none);
}
#[allow(unsafe_code, non_snake_case)]
@@ -1062,7 +1060,6 @@ static PROXY_HANDLER: ProxyTraps = ProxyTraps {
hasOwn: None,
getOwnEnumerablePropertyKeys: None,
nativeCall: None,
- hasInstance: None,
objectClassIs: None,
className: None,
fun_toString: None,
@@ -1161,10 +1158,11 @@ unsafe extern "C" fn getOwnPropertyDescriptor_xorigin(
proxy: RawHandleObject,
id: RawHandleId,
desc: RawMutableHandle<PropertyDescriptor>,
+ is_none: *mut bool,
) -> bool {
let mut found = false;
has_xorigin(cx, proxy, id, &mut found);
- found && getOwnPropertyDescriptor(cx, proxy, id, desc)
+ found && getOwnPropertyDescriptor(cx, proxy, id, desc, is_none)
}
#[allow(unsafe_code, non_snake_case)]
@@ -1210,7 +1208,6 @@ static XORIGIN_PROXY_HANDLER: ProxyTraps = ProxyTraps {
hasOwn: Some(has_xorigin),
getOwnEnumerablePropertyKeys: None,
nativeCall: None,
- hasInstance: None,
objectClassIs: None,
className: None,
fun_toString: None,
@@ -1226,7 +1223,7 @@ static XORIGIN_PROXY_HANDLER: ProxyTraps = ProxyTraps {
// How WindowProxy objects are garbage collected.
#[allow(unsafe_code)]
-unsafe extern "C" fn finalize(_fop: *mut JSFreeOp, obj: *mut JSObject) {
+unsafe extern "C" fn finalize(_fop: *mut GCContext, obj: *mut JSObject) {
let mut slot = UndefinedValue();
GetProxyReservedSlot(obj, 0, &mut slot);
let this = slot.to_private() as *mut WindowProxy;
diff --git a/components/script/script_module.rs b/components/script/script_module.rs
index 4f1cfe1430a..b554e156209 100644
--- a/components/script/script_module.rs
+++ b/components/script/script_module.rs
@@ -44,15 +44,16 @@ use ipc_channel::router::ROUTER;
use js::jsapi::Handle as RawHandle;
use js::jsapi::HandleObject;
use js::jsapi::HandleValue as RawHandleValue;
+use js::jsapi::MutableHandleValue;
use js::jsapi::Value;
-use js::jsapi::{CompileModule1, ExceptionStackBehavior, FinishDynamicModuleImport_NoTLA};
-use js::jsapi::{DynamicImportStatus, SetModuleDynamicImportHook, SetScriptPrivateReferenceHooks};
+use js::jsapi::{CompileModule1, ExceptionStackBehavior, FinishDynamicModuleImport};
+use js::jsapi::{SetModuleDynamicImportHook, SetScriptPrivateReferenceHooks};
use js::jsapi::{GetModuleResolveHook, JSRuntime, SetModuleResolveHook};
-use js::jsapi::{GetRequestedModules, SetModuleMetadataHook};
+use js::jsapi::{GetRequestedModules, SetModuleMetadataHook, GetModuleRequestSpecifier};
use js::jsapi::{Heap, JSContext, JS_ClearPendingException, SetModulePrivate};
use js::jsapi::{JSAutoRealm, JSObject, JSString};
use js::jsapi::{JS_DefineProperty4, JS_IsExceptionPending, JS_NewStringCopyN, JSPROP_ENUMERATE};
-use js::jsapi::{ModuleEvaluate, ModuleInstantiate};
+use js::jsapi::{ModuleEvaluate, ModuleLink};
use js::jsval::{JSVal, PrivateValue, UndefinedValue};
use js::rust::jsapi_wrapped::{GetArrayLength, JS_GetElement};
use js::rust::jsapi_wrapped::{GetRequestedModuleSpecifier, JS_GetPendingException};
@@ -71,6 +72,7 @@ use net_traits::{ResourceFetchTiming, ResourceTimingType};
use servo_url::ServoUrl;
use std::collections::{HashMap, HashSet};
use std::mem;
+use std::ptr;
use std::rc::Rc;
use std::str::FromStr;
use std::sync::{Arc, Mutex};
@@ -475,8 +477,8 @@ impl ModuleTree {
let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject());
unsafe {
- if !ModuleInstantiate(*global.get_cx(), module_record) {
- warn!("fail to instantiate module");
+ if !ModuleLink(*global.get_cx(), module_record) {
+ warn!("fail to link & instantiate module");
rooted!(in(*global.get_cx()) let mut exception = UndefinedValue());
assert!(JS_GetPendingException(
@@ -501,12 +503,12 @@ impl ModuleTree {
&self,
global: &GlobalScope,
module_record: HandleObject,
+ eval_result: MutableHandleValue,
) -> Result<(), RethrowError> {
let _ac = JSAutoRealm::new(*global.get_cx(), *global.reflector().get_jsobject());
unsafe {
- rooted!(in(*global.get_cx()) let mut rval = UndefinedValue());
- if !ModuleEvaluate(*global.get_cx(), module_record, rval.handle_mut().into()) {
+ if !ModuleEvaluate(*global.get_cx(), module_record, eval_result) {
warn!("fail to evaluate module");
rooted!(in(*global.get_cx()) let mut exception = UndefinedValue());
@@ -973,6 +975,7 @@ impl ModuleOwner {
let network_error = module_tree.get_network_error().borrow().as_ref().cloned();
let existing_rethrow_error = module_tree.get_rethrow_error().borrow().as_ref().cloned();
+ rooted!(in(*global.get_cx()) let mut rval = UndefinedValue());
let execution_err = if network_error.is_none() && existing_rethrow_error.is_none() {
let record = module_tree
.get_record()
@@ -981,7 +984,7 @@ impl ModuleOwner {
.map(|record| record.handle());
if let Some(record) = record {
- let evaluated = module_tree.execute_module(&global, record).err();
+ let evaluated = module_tree.execute_module(&global, record, rval.handle_mut().into()).err();
if let Some(exception) = evaluated.clone() {
module_tree.set_rethrow_error(exception);
@@ -996,11 +999,10 @@ impl ModuleOwner {
};
// Ensure any failures related to importing this dynamic module are immediately reported.
- let status = match (network_error, existing_rethrow_error, execution_err) {
+ match (network_error, existing_rethrow_error, execution_err) {
(Some(_), _, _) => unsafe {
let err = gen_type_error(&global, "Dynamic import failed".to_owned());
JS_SetPendingException(*cx, err.handle(), ExceptionStackBehavior::Capture);
- DynamicImportStatus::Failed
},
(None, _, Some(execution_err)) => unsafe {
JS_SetPendingException(
@@ -1008,7 +1010,6 @@ impl ModuleOwner {
execution_err.handle(),
ExceptionStackBehavior::Capture,
);
- DynamicImportStatus::Failed
},
(None, Some(rethrow_error), _) => unsafe {
JS_SetPendingException(
@@ -1016,18 +1017,22 @@ impl ModuleOwner {
rethrow_error.handle(),
ExceptionStackBehavior::Capture,
);
- DynamicImportStatus::Failed
},
// do nothing if there's no errors
- (None, None, None) => DynamicImportStatus::Ok,
+ (None, None, None) => {}
};
debug!("Finishing dynamic import for {:?}", module_identity);
+ rooted!(in(*cx) let mut evaluation_promise = ptr::null_mut::<JSObject>());
+ if rval.is_object() {
+ evaluation_promise.set(rval.to_object());
+ }
+
unsafe {
- FinishDynamicModuleImport_NoTLA(
+ FinishDynamicModuleImport(
*cx,
- status,
+ evaluation_promise.handle().into(),
module.referencing_private.handle(),
module.specifier.handle(),
module.promise.reflector().get_jsobject().into_handle(),
@@ -1249,7 +1254,7 @@ unsafe extern "C" fn host_release_top_level_script(value: *const Value) {
pub unsafe extern "C" fn host_import_module_dynamically(
cx: *mut JSContext,
reference_private: RawHandleValue,
- specifier: RawHandle<*mut JSString>,
+ specifier: RawHandle<*mut JSObject>,
promise: RawHandle<*mut JSObject>,
) -> bool {
// Step 1.
@@ -1339,14 +1344,16 @@ unsafe fn module_script_from_reference_private<'a>(
#[allow(unsafe_code)]
fn fetch_an_import_module_script_graph(
global: &GlobalScope,
- specifier: RawHandle<*mut JSString>,
+ module_request: RawHandle<*mut JSObject>,
reference_private: RawHandleValue,
base_url: ServoUrl,
options: ScriptFetchOptions,
promise: Rc<Promise>,
) -> Result<(), RethrowError> {
// Step 1.
- let url = ModuleTree::resolve_module_specifier(*global.get_cx(), &base_url, specifier);
+ let cx = global.get_cx();
+ rooted!(in(*cx) let specifier = unsafe { GetModuleRequestSpecifier(*cx, module_request) });
+ let url = ModuleTree::resolve_module_specifier(*cx, &base_url, specifier.handle().into());
// Step 2.
if url.is_err() {
@@ -1373,7 +1380,7 @@ fn fetch_an_import_module_script_graph(
referencing_private: Heap::default(),
id: dynamic_module_id,
});
- dynamic_module.specifier.set(specifier.get());
+ dynamic_module.specifier.set(module_request.get());
dynamic_module
.referencing_private
.set(reference_private.get());
@@ -1402,7 +1409,7 @@ fn fetch_an_import_module_script_graph(
unsafe extern "C" fn HostResolveImportedModule(
cx: *mut JSContext,
reference_private: RawHandleValue,
- specifier: RawHandle<*mut JSString>,
+ specifier: RawHandle<*mut JSObject>,
) -> *mut JSObject {
let in_realm_proof = AlreadyInRealm::assert_for_cx(SafeJSContext::from_ptr(cx));
let global_scope = GlobalScope::from_context(cx, InRealm::Already(&in_realm_proof));
@@ -1417,7 +1424,8 @@ unsafe extern "C" fn HostResolveImportedModule(
}
// Step 5.
- let url = ModuleTree::resolve_module_specifier(*global_scope.get_cx(), &base_url, specifier);
+ rooted!(in(*global_scope.get_cx()) let specifier = GetModuleRequestSpecifier(cx, specifier));
+ let url = ModuleTree::resolve_module_specifier(*global_scope.get_cx(), &base_url, specifier.handle().into());
// Step 6.
assert!(url.is_ok());
@@ -1542,7 +1550,7 @@ struct DynamicModule {
#[ignore_malloc_size_of = "Rc is hard"]
promise: Rc<Promise>,
#[ignore_malloc_size_of = "GC types are hard"]
- specifier: Heap<*mut JSString>,
+ specifier: Heap<*mut JSObject>,
#[ignore_malloc_size_of = "GC types are hard"]
referencing_private: Heap<JSVal>,
#[ignore_malloc_size_of = "Defined in uuid"]
diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs
index 5ce21f01366..e712fb8d90f 100644
--- a/components/script/script_runtime.rs
+++ b/components/script/script_runtime.rs
@@ -52,7 +52,7 @@ use js::jsapi::StreamConsumer as JSStreamConsumer;
use js::jsapi::{BuildIdCharVector, DisableIncrementalGC, GCDescription, GCProgress};
use js::jsapi::{Dispatchable as JSRunnable, Dispatchable_MaybeShuttingDown};
use js::jsapi::{
- GCReason, JSGCInvocationKind, JSGCStatus, JS_AddExtraGCRootsTracer,
+ GCReason, GCOptions, JSGCStatus, JS_AddExtraGCRootsTracer,
JS_RequestInterruptCallback, JS_SetGCCallback,
};
use js::jsapi::{HandleObject, Heap, JobQueue};
@@ -791,13 +791,14 @@ unsafe extern "C" fn gc_slice_callback(
};
if !desc.is_null() {
let desc: &GCDescription = &*desc;
- let invocation_kind = match desc.invocationKind_ {
- JSGCInvocationKind::GC_NORMAL => "GC_NORMAL",
- JSGCInvocationKind::GC_SHRINK => "GC_SHRINK",
- };
+ let options = match desc.options_ {
+ GCOptions::Normal => "Normal",
+ GCOptions::Shrink => "Shrink",
+ GCOptions::Shutdown => "Shutdown",
+ };
println!(
- " isZone={}, invocation_kind={}",
- desc.isZone_, invocation_kind
+ " isZone={}, options={}",
+ desc.isZone_, options
);
}
let _ = stdout().flush();