107 lines
2.7 KiB
C++
107 lines
2.7 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef jit_BaselineFrame_inl_h
|
|
#define jit_BaselineFrame_inl_h
|
|
|
|
#include "jit/BaselineFrame.h"
|
|
|
|
#include "jscntxt.h"
|
|
#include "jscompartment.h"
|
|
|
|
#include "vm/EnvironmentObject.h"
|
|
|
|
#include "jsscriptinlines.h"
|
|
|
|
#include "vm/EnvironmentObject-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::create(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;
|
|
}
|
|
|
|
} // namespace jit
|
|
} // namespace js
|
|
|
|
#endif /* jit_BaselineFrame_inl_h */
|