aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/globalscope.rs
diff options
context:
space:
mode:
authorCYBAI <cyb.ai.815@gmail.com>2020-07-11 16:46:38 +0900
committerCYBAI <cyb.ai.815@gmail.com>2020-07-18 00:43:34 +0900
commit99e832a345ae09cdf78b72fb4e37e64194e4cf42 (patch)
tree8bd4b4e5ad35bcf860552a39fdcce06e5f588687 /components/script/dom/globalscope.rs
parent1aef31bb2fe22c4afb3b3cf2fab1a4d8b24056d4 (diff)
downloadservo-99e832a345ae09cdf78b72fb4e37e64194e4cf42.tar.gz
servo-99e832a345ae09cdf78b72fb4e37e64194e4cf42.zip
Move from direct `Evaluate` to `compile then execute` for classic script
Diffstat (limited to 'components/script/dom/globalscope.rs')
-rw-r--r--components/script/dom/globalscope.rs20
1 files changed, 14 insertions, 6 deletions
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs
index 783105af0d2..230f2517397 100644
--- a/components/script/dom/globalscope.rs
+++ b/components/script/dom/globalscope.rs
@@ -77,13 +77,14 @@ use embedder_traits::EmbedderMsg;
use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::router::ROUTER;
use js::glue::{IsWrapper, UnwrapObjectDynamic};
+use js::jsapi::Compile1;
use js::jsapi::{CurrentGlobalOrNull, GetNonCCWObjectGlobal};
use js::jsapi::{HandleObject, Heap};
use js::jsapi::{JSContext, JSObject};
use js::jsval::{JSVal, UndefinedValue};
use js::panic::maybe_resume_unwind;
use js::rust::transform_str_to_source_text;
-use js::rust::wrappers::Evaluate2;
+use js::rust::wrappers::JS_ExecuteScript;
use js::rust::{get_object_class, CompileOptionsWrapper, ParentRuntime, Runtime};
use js::rust::{HandleValue, MutableHandleValue};
use js::{JSCLASS_IS_DOMJSCLASS, JSCLASS_IS_GLOBAL};
@@ -2568,15 +2569,22 @@ impl GlobalScope {
let options =
unsafe { CompileOptionsWrapper::new(*cx, filename.as_ptr(), line_number) };
- debug!("evaluating Dom string");
- let result = unsafe {
- Evaluate2(
+ rooted!(in(*cx) let compiled_script = unsafe {
+ Compile1(
*cx,
options.ptr,
&mut transform_str_to_source_text(code),
- rval,
)
- };
+ });
+
+ if compiled_script.is_null() {
+ debug!("error compiling Dom string");
+ report_pending_exception(*cx, true, InRealm::Entered(&ar));
+ return false;
+ }
+
+ debug!("evaluating Dom string");
+ let result = unsafe { JS_ExecuteScript(*cx, compiled_script.handle(), rval) };
if !result {
debug!("error evaluating Dom string");