blob: cd64013379568c8ec7f77feb19ca454247b0a018 [file] [log] [blame]
/* -*- 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 jit_CompilerRoot_h
#define jit_CompilerRoot_h
#ifdef JS_ION
#include "jscntxt.h"
#include "js/RootingAPI.h"
namespace js {
namespace jit {
// Roots a read-only GCThing for the lifetime of a single compilation.
// Each root is maintained in a linked list that is walked over during tracing.
// The CompilerRoot must be heap-allocated and may not go out of scope.
template <typename T>
class CompilerRoot : public CompilerRootNode
{
public:
CompilerRoot(T ptr)
: CompilerRootNode(NULL)
{
if (ptr) {
JS_ASSERT(!IsInsideNursery(GetIonContext()->compartment->rt, ptr));
setRoot(ptr);
}
}
public:
// Sets the pointer and inserts into root list. The pointer becomes read-only.
void setRoot(T root) {
CompilerRootNode *&rootList = GetIonContext()->temp->rootList();
JS_ASSERT(!ptr_);
ptr_ = root;
next = rootList;
rootList = this;
}
public:
operator T () const { return static_cast<T>(ptr_); }
T operator ->() const { return static_cast<T>(ptr_); }
private:
CompilerRoot() MOZ_DELETE;
CompilerRoot(const CompilerRoot<T> &) MOZ_DELETE;
CompilerRoot<T> &operator =(const CompilerRoot<T> &) MOZ_DELETE;
};
typedef CompilerRoot<JSObject*> CompilerRootObject;
typedef CompilerRoot<JSFunction*> CompilerRootFunction;
typedef CompilerRoot<JSScript*> CompilerRootScript;
typedef CompilerRoot<PropertyName*> CompilerRootPropertyName;
typedef CompilerRoot<Shape*> CompilerRootShape;
typedef CompilerRoot<Value> CompilerRootValue;
} // namespace jit
} // namespace js
#endif // JS_ION
#endif /* jit_CompilerRoot_h */