#ifndef jit_BaselineFrame_inl_h
#define jit_BaselineFrame_inl_h
#include "jit/BaselineFrame.h"
#include "vm/EnvironmentObject.h"
#include "vm/JSContext.h"
#include "vm/Realm.h"
#include "vm/EnvironmentObject-inl.h"
#include "vm/JSScript-inl.h"
namespace js {
namespace jit {
template <typename SpecificEnvironment>
inline void BaselineFrame::pushOnEnvironmentChain(SpecificEnvironment& env) {
MOZ_ASSERT(*environmentChain() == env.enclosingEnvironment());
envChain_ = &env;
if (IsFrameInitialEnvironment(this, env)) {
flags_ |= HAS_INITIAL_ENV;
}
}
template <typename SpecificEnvironment>
inline void BaselineFrame::popOffEnvironmentChain() {
MOZ_ASSERT(envChain_->is<SpecificEnvironment>());
envChain_ = &envChain_->as<SpecificEnvironment>().enclosingEnvironment();
}
inline void BaselineFrame::replaceInnermostEnvironment(EnvironmentObject& env) {
MOZ_ASSERT(env.enclosingEnvironment() ==
envChain_->as<EnvironmentObject>().enclosingEnvironment());
envChain_ = &env;
}
inline bool BaselineFrame::pushLexicalEnvironment(JSContext* cx,
Handle<LexicalScope*> scope) {
LexicalEnvironmentObject* env =
LexicalEnvironmentObject::createForFrame(cx, scope, this);
if (!env) {
return false;
}
pushOnEnvironmentChain(*env);
return true;
}
inline bool BaselineFrame::freshenLexicalEnvironment(JSContext* cx) {
Rooted<LexicalEnvironmentObject*> current(
cx, &envChain_->as<LexicalEnvironmentObject>());
LexicalEnvironmentObject* clone =
LexicalEnvironmentObject::clone(cx, current);
if (!clone) {
return false;
}
replaceInnermostEnvironment(*clone);
return true;
}
inline bool BaselineFrame::recreateLexicalEnvironment(JSContext* cx) {
Rooted<LexicalEnvironmentObject*> current(
cx, &envChain_->as<LexicalEnvironmentObject>());
LexicalEnvironmentObject* clone =
LexicalEnvironmentObject::recreate(cx, current);
if (!clone) {
return false;
}
replaceInnermostEnvironment(*clone);
return true;
}
inline CallObject& BaselineFrame::callObj() const {
MOZ_ASSERT(hasInitialEnvironment());
MOZ_ASSERT(callee()->needsCallObject());
JSObject* obj = environmentChain();
while (!obj->is<CallObject>()) {
obj = obj->enclosingEnvironment();
}
return obj->as<CallObject>();
}
inline void BaselineFrame::unsetIsDebuggee() {
MOZ_ASSERT(!script()->isDebuggee());
flags_ &= ~DEBUGGEE;
}
} }
#endif