summaryrefslogtreecommitdiffstats
path: root/js/src/debugger/Debugger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/debugger/Debugger.cpp')
-rw-r--r--js/src/debugger/Debugger.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/js/src/debugger/Debugger.cpp b/js/src/debugger/Debugger.cpp
index 37c1e79a9d..44bd1a8eaa 100644
--- a/js/src/debugger/Debugger.cpp
+++ b/js/src/debugger/Debugger.cpp
@@ -536,6 +536,7 @@ Debugger::Debugger(JSContext* cx, NativeObject* dbg)
exclusiveDebuggerOnEval(false),
inspectNativeCallArguments(false),
collectCoverageInfo(false),
+ shouldAvoidSideEffects(false),
observedGCs(cx->zone()),
allocationsLog(cx),
trackingAllocationSites(false),
@@ -1049,6 +1050,12 @@ NativeResumeMode DebugAPI::slowPathOnNativeCall(JSContext* cx,
return NativeResumeMode::Continue;
}
+/* static */
+bool DebugAPI::slowPathShouldAvoidSideEffects(JSContext* cx) {
+ return DebuggerExists(
+ cx->global(), [=](Debugger* dbg) { return dbg->shouldAvoidSideEffects; });
+}
+
/*
* RAII class to mark a generator as "running" temporarily while running
* debugger code.
@@ -4187,6 +4194,8 @@ struct MOZ_STACK_CLASS Debugger::CallData {
bool setOnEnterFrame();
bool getOnNativeCall();
bool setOnNativeCall();
+ bool getShouldAvoidSideEffects();
+ bool setShouldAvoidSideEffects();
bool getOnNewGlobalObject();
bool setOnNewGlobalObject();
bool getOnNewPromise();
@@ -4405,6 +4414,22 @@ bool Debugger::CallData::setOnNativeCall() {
return true;
}
+bool Debugger::CallData::getShouldAvoidSideEffects() {
+ args.rval().setBoolean(dbg->shouldAvoidSideEffects);
+ return true;
+}
+
+bool Debugger::CallData::setShouldAvoidSideEffects() {
+ if (!args.requireAtLeast(cx, "Debugger.set shouldAvoidSideEffects", 1)) {
+ return false;
+ }
+
+ dbg->shouldAvoidSideEffects = ToBoolean(args[0]);
+
+ args.rval().setUndefined();
+ return true;
+}
+
bool Debugger::CallData::getOnNewGlobalObject() {
return getHookImpl(cx, args, *dbg, OnNewGlobalObject);
}
@@ -4608,6 +4633,11 @@ GlobalObject* Debugger::unwrapDebuggeeArgument(JSContext* cx, const Value& v) {
return nullptr;
}
+ if (JS_IsDeadWrapper(obj)) {
+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_DEAD_OBJECT);
+ return nullptr;
+ }
+
// If that didn't produce a global object, it's an error.
if (!obj->is<GlobalObject>()) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
@@ -6518,6 +6548,8 @@ const JSPropertySpec Debugger::properties[] = {
JS_DEBUG_PSGS("onPromiseSettled", getOnPromiseSettled, setOnPromiseSettled),
JS_DEBUG_PSGS("onEnterFrame", getOnEnterFrame, setOnEnterFrame),
JS_DEBUG_PSGS("onNativeCall", getOnNativeCall, setOnNativeCall),
+ JS_DEBUG_PSGS("shouldAvoidSideEffects", getShouldAvoidSideEffects,
+ setShouldAvoidSideEffects),
JS_DEBUG_PSGS("onNewGlobalObject", getOnNewGlobalObject,
setOnNewGlobalObject),
JS_DEBUG_PSGS("uncaughtExceptionHook", getUncaughtExceptionHook,
@@ -7259,5 +7291,9 @@ JS_PUBLIC_API bool FireOnGarbageCollectionHook(
return true;
}
+bool ShouldAvoidSideEffects(JSContext* cx) {
+ return DebugAPI::shouldAvoidSideEffects(cx);
+}
+
} // namespace dbg
} // namespace JS