Bug 991720 part 1 - Add Spaghetti stack. r=h4writer.

This commit is contained in:
Nicolas B. Pierron 2014-12-19 15:28:30 +01:00
parent ef2b0d42c3
commit e2ec961ab9

View File

@ -544,6 +544,106 @@ class InlineConcatListIterator
Node *iter;
};
template <typename T> class InlineSpaghettiStack;
template <typename T> class InlineSpaghettiStackNode;
template <typename T> class InlineSpaghettiStackIterator;
template <typename T>
class InlineSpaghettiStackNode : public InlineForwardListNode<T>
{
typedef InlineForwardListNode<T> Parent;
public:
InlineSpaghettiStackNode() : Parent()
{ }
explicit InlineSpaghettiStackNode(InlineSpaghettiStackNode<T> *n)
: Parent(n)
{ }
InlineSpaghettiStackNode(const InlineSpaghettiStackNode<T> &) MOZ_DELETE;
protected:
friend class InlineSpaghettiStack<T>;
friend class InlineSpaghettiStackIterator<T>;
};
template <typename T>
class InlineSpaghettiStack : protected InlineSpaghettiStackNode<T>
{
friend class InlineSpaghettiStackIterator<T>;
typedef InlineSpaghettiStackNode<T> Node;
public:
InlineSpaghettiStack()
{ }
public:
typedef InlineSpaghettiStackIterator<T> iterator;
public:
iterator begin() const {
return iterator(this);
}
iterator end() const {
return iterator(nullptr);
}
void push(Node *t) {
MOZ_ASSERT(t->next == nullptr);
t->next = this->next;
this->next = t;
}
void copy(const InlineSpaghettiStack<T> &stack) {
this->next = stack.next;
}
bool empty() const {
return this->next == nullptr;
}
};
template <typename T>
class InlineSpaghettiStackIterator
{
private:
friend class InlineSpaghettiStack<T>;
typedef InlineSpaghettiStackNode<T> Node;
explicit InlineSpaghettiStackIterator<T>(const InlineSpaghettiStack<T> *owner)
: iter(owner ? static_cast<Node *>(owner->next) : nullptr)
{ }
public:
InlineSpaghettiStackIterator<T> & operator ++() {
iter = static_cast<Node *>(iter->next);
return *this;
}
InlineSpaghettiStackIterator<T> operator ++(int) {
InlineSpaghettiStackIterator<T> old(*this);
operator++();
return old;
}
T *operator *() const {
return static_cast<T *>(iter);
}
T *operator ->() const {
return static_cast<T *>(iter);
}
bool operator !=(const InlineSpaghettiStackIterator<T> &where) const {
return iter != where.iter;
}
bool operator ==(const InlineSpaghettiStackIterator<T> &where) const {
return iter == where.iter;
}
private:
Node *iter;
};
} // namespace js
#endif /* jit_InlineList_h */