Bug 979730 part 5 - Remove saved frame chains. r=luke
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -5005,32 +5005,16 @@ JS_RequestInterruptCallback(JSRuntime* r
}
JS_PUBLIC_API(bool)
JS_IsRunning(JSContext* cx)
{
return cx->currentlyRunning();
}
-JS_PUBLIC_API(bool)
-JS_SaveFrameChain(JSContext* cx)
-{
- AssertHeapIsIdleOrIterating(cx);
- CHECK_REQUEST(cx);
- return cx->saveFrameChain();
-}
-
-JS_PUBLIC_API(void)
-JS_RestoreFrameChain(JSContext* cx)
-{
- AssertHeapIsIdleOrIterating(cx);
- CHECK_REQUEST(cx);
- cx->restoreFrameChain();
-}
-
JS::AutoSetAsyncStackForNewCalls::AutoSetAsyncStackForNewCalls(
JSContext* cx, HandleObject stack, const char* asyncCause,
JS::AutoSetAsyncStackForNewCalls::AsyncCallKind kind)
: cx(cx),
oldAsyncStack(cx, cx->runtime()->asyncStackForNewActivations),
oldAsyncCause(cx->runtime()->asyncCauseForNewActivations),
oldAsyncCallIsExplicit(cx->runtime()->asyncCallIsExplicit)
{
--- a/js/src/jsapi.h
+++ b/js/src/jsapi.h
@@ -4569,33 +4569,16 @@ AddPromiseReactions(JSContext* cx, JS::H
extern JS_PUBLIC_API(JSObject*)
GetWaitForAllPromise(JSContext* cx, const JS::AutoObjectVector& promises);
} // namespace JS
extern JS_PUBLIC_API(bool)
JS_IsRunning(JSContext* cx);
-/*
- * Saving and restoring frame chains.
- *
- * These two functions are used to set aside cx's call stack while that stack
- * is inactive. After a call to JS_SaveFrameChain, it looks as if there is no
- * code running on cx. Before calling JS_RestoreFrameChain, cx's call stack
- * must be balanced and all nested calls to JS_SaveFrameChain must have had
- * matching JS_RestoreFrameChain calls.
- *
- * JS_SaveFrameChain deals with cx not having any code running on it.
- */
-extern JS_PUBLIC_API(bool)
-JS_SaveFrameChain(JSContext* cx);
-
-extern JS_PUBLIC_API(void)
-JS_RestoreFrameChain(JSContext* cx);
-
namespace JS {
/**
* This class can be used to store a pointer to the youngest frame of a saved
* stack in the specified JSContext. This reference will be picked up by any new
* calls performed until the class is destroyed, with the specified asyncCause,
* that must not be empty.
*
--- a/js/src/jscntxt.cpp
+++ b/js/src/jscntxt.cpp
@@ -963,17 +963,16 @@ JSContext::JSContext(JSRuntime* rt)
unwrappedException_(this),
options_(),
overRecursed_(false),
propagatingForcedReturn_(false),
liveVolatileJitFrameIterators_(nullptr),
reportGranularity(JS_DEFAULT_JITREPORT_GRANULARITY),
resolvingList(nullptr),
generatingError(false),
- savedFrameChains_(),
cycleDetectorSet(this),
data(nullptr),
data2(nullptr),
outstandingRequests(0),
jitIsBroken(false)
{
MOZ_ASSERT(static_cast<ContextFriendFields*>(this) ==
ContextFriendFields::get(this));
@@ -1019,44 +1018,16 @@ JSContext::isThrowingDebuggeeWouldRun()
{
return throwing &&
unwrappedException_.isObject() &&
unwrappedException_.toObject().is<ErrorObject>() &&
unwrappedException_.toObject().as<ErrorObject>().type() == JSEXN_DEBUGGEEWOULDRUN;
}
bool
-JSContext::saveFrameChain()
-{
- if (!savedFrameChains_.append(SavedFrameChain(compartment(), enterCompartmentDepth_)))
- return false;
-
- if (Activation* act = runtime()->activation())
- act->saveFrameChain();
-
- setCompartment(nullptr);
- enterCompartmentDepth_ = 0;
-
- return true;
-}
-
-void
-JSContext::restoreFrameChain()
-{
- MOZ_ASSERT(enterCompartmentDepth_ == 0); // We're about to clobber it, and it
- // will be wrong forevermore.
- SavedFrameChain sfc = savedFrameChains_.popCopy();
- setCompartment(sfc.compartment);
- enterCompartmentDepth_ = sfc.enterCompartmentCount;
-
- if (Activation* act = runtime()->activation())
- act->restoreFrameChain();
-}
-
-bool
JSContext::currentlyRunning() const
{
for (ActivationIterator iter(runtime()); !iter.done(); ++iter) {
if (iter->cx() == this)
return true;
}
return false;
--- a/js/src/jscntxt.h
+++ b/js/src/jscntxt.h
@@ -339,31 +339,16 @@ struct JSContext : public js::ExclusiveC
public:
int32_t reportGranularity; /* see vm/Probes.h */
js::AutoResolving* resolvingList;
/* True if generating an error, to prevent runaway recursion. */
bool generatingError;
- /* See JS_SaveFrameChain/JS_RestoreFrameChain. */
- private:
- struct SavedFrameChain {
- SavedFrameChain(JSCompartment* comp, unsigned count)
- : compartment(comp), enterCompartmentCount(count) {}
- JSCompartment* compartment;
- unsigned enterCompartmentCount;
- };
- typedef js::Vector<SavedFrameChain, 1, js::SystemAllocPolicy> SaveStack;
- SaveStack savedFrameChains_;
- public:
- bool saveFrameChain();
- void restoreFrameChain();
-
- public:
/* State for object and array toSource conversion. */
js::AutoCycleDetector::Set cycleDetectorSet;
/* Client opaque pointers. */
void* data;
void* data2;
public:
--- a/js/src/vm/Stack-inl.h
+++ b/js/src/vm/Stack-inl.h
@@ -864,17 +864,16 @@ ActivationEntryMonitor::~ActivationEntry
cx_->runtime()->entryMonitor = entryMonitor_;
}
Activation::Activation(JSContext* cx, Kind kind)
: cx_(cx),
compartment_(cx->compartment()),
prev_(cx->runtime_->activation_),
prevProfiling_(prev_ ? prev_->mostRecentProfiling() : nullptr),
- savedFrameChain_(0),
hideScriptedCallerCount_(0),
frameCache_(cx),
asyncStack_(cx, cx->runtime_->asyncStackForNewActivations),
asyncCause_(cx->runtime_->asyncCauseForNewActivations),
asyncCallIsExplicit_(cx->runtime_->asyncCallIsExplicit),
kind_(kind)
{
cx->runtime_->asyncStackForNewActivations = nullptr;
--- a/js/src/vm/Stack.h
+++ b/js/src/vm/Stack.h
@@ -1206,20 +1206,16 @@ class MOZ_RAII ActivationEntryMonitor
class Activation
{
protected:
JSContext* cx_;
JSCompartment* compartment_;
Activation* prev_;
Activation* prevProfiling_;
- // Counter incremented by JS_SaveFrameChain on the top-most activation and
- // decremented by JS_RestoreFrameChain.
- size_t savedFrameChain_;
-
// Counter incremented by JS::HideScriptedCaller and decremented by
// JS::UnhideScriptedCaller. If > 0 for the top activation,
// DescribeScriptedCaller will return null instead of querying that
// activation, which should prompt the caller to consult embedding-specific
// data structures instead.
size_t hideScriptedCallerCount_;
// The cache of SavedFrame objects we have already captured when walking
@@ -1282,27 +1278,16 @@ class Activation
MOZ_ASSERT(isJit());
return (jit::JitActivation*)this;
}
WasmActivation* asWasm() const {
MOZ_ASSERT(isWasm());
return (WasmActivation*)this;
}
- void saveFrameChain() {
- savedFrameChain_++;
- }
- void restoreFrameChain() {
- MOZ_ASSERT(savedFrameChain_ > 0);
- savedFrameChain_--;
- }
- bool hasSavedFrameChain() const {
- return savedFrameChain_ > 0;
- }
-
void hideScriptedCaller() {
hideScriptedCallerCount_++;
}
void unhideScriptedCaller() {
MOZ_ASSERT(hideScriptedCallerCount_ > 0);
hideScriptedCallerCount_--;
}
bool scriptedCallerIsHidden() const {