js/src/ion/BaselineFrame-inl.h
author Emanuel Hoogeveen <emanuel.hoogeveen@gmail.com>
Wed, 24 Jul 2013 23:34:48 -0700
changeset 139933 973361ec4fb57b05f5f5b1859f44dbdf37c26660
parent 136755 41ab7286a2e2c9b81ff54f082d0459ac40cb2da0
permissions -rw-r--r--
Bug 888088 (part 10) - Fix #include ordering in most of js/src/ion/. r=nnethercote.

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 * vim: set ts=8 sts=4 et sw=4 tw=99:
 * 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 ion_BaselineFrame_inl_h
#define ion_BaselineFrame_inl_h

#ifdef JS_ION

#include "ion/BaselineFrame.h"

#include "jscntxt.h"
#include "jscompartment.h"

#include "ion/IonFrames.h"

#include "vm/ScopeObject-inl.h"

namespace js {
namespace ion {

inline void
BaselineFrame::pushOnScopeChain(ScopeObject &scope)
{
    JS_ASSERT(*scopeChain() == scope.enclosingScope() ||
              *scopeChain() == scope.as<CallObject>().enclosingScope().as<DeclEnvObject>().enclosingScope());
    scopeChain_ = &scope;
}

inline void
BaselineFrame::popOffScopeChain()
{
    scopeChain_ = &scopeChain_->as<ScopeObject>().enclosingScope();
}

inline bool
BaselineFrame::pushBlock(JSContext *cx, Handle<StaticBlockObject *> block)
{
    JS_ASSERT_IF(hasBlockChain(), blockChain() == *block->enclosingBlock());

    if (block->needsClone()) {
        ClonedBlockObject *clone = ClonedBlockObject::create(cx, block, this);
        if (!clone)
            return false;

        pushOnScopeChain(*clone);
    }

    setBlockChain(*block);
    return true;
}

inline void
BaselineFrame::popBlock(JSContext *cx)
{
    JS_ASSERT(hasBlockChain());

    if (cx->compartment()->debugMode())
        DebugScopes::onPopBlock(cx, this);

    if (blockChain_->needsClone()) {
        JS_ASSERT(scopeChain_->as<ClonedBlockObject>().staticBlock() == *blockChain_);
        popOffScopeChain();
    }

    setBlockChain(*blockChain_->enclosingBlock());
}

inline CallObject &
BaselineFrame::callObj() const
{
    JS_ASSERT(hasCallObj());
    JS_ASSERT(fun()->isHeavyweight());

    JSObject *obj = scopeChain();
    while (!obj->is<CallObject>())
        obj = obj->enclosingScope();
    return obj->as<CallObject>();
}

} // namespace ion
} // namespace js

#endif // JS_ION

#endif /* ion_BaselineFrame_inl_h */