]> git.saurik.com Git - apple/javascriptcore.git/blame - kjs/LabelStack.h
JavaScriptCore-466.1.tar.gz
[apple/javascriptcore.git] / kjs / LabelStack.h
CommitLineData
b37bf2e1
A
1// -*- mode: c++; c-basic-offset: 4 -*-
2/*
3 * Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
4 * Copyright (C) 2001 Peter Kelly (pmk@post.com)
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
16 *
17 * You should have received a copy of the GNU Library General Public License
18 * along with this library; see the file COPYING.LIB. If not, write to
19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
21 *
22 */
23
24#ifndef KJS_LABEL_STACK_H
25#define KJS_LABEL_STACK_H
26
27#include "identifier.h"
28#include <wtf/Noncopyable.h>
29
30namespace KJS {
31 /**
32 * @short The "label set" in Ecma-262 spec
33 */
34 class LabelStack : Noncopyable {
35 public:
36 LabelStack()
37 : tos(0)
38 {
39 }
40 ~LabelStack();
41
42 /**
43 * If id is not empty and is not in the stack already, puts it on top of
44 * the stack and returns true, otherwise returns false
45 */
46 bool push(const Identifier &id);
47 /**
48 * Is the id in the stack?
49 */
50 bool contains(const Identifier &id) const;
51 /**
52 * Removes from the stack the last pushed id (what else?)
53 */
54 void pop();
55
56 private:
57 struct StackElem {
58 Identifier id;
59 StackElem *prev;
60 };
61
62 StackElem *tos;
63 };
64
65inline LabelStack::~LabelStack()
66{
67 StackElem *prev;
68 for (StackElem *e = tos; e; e = prev) {
69 prev = e->prev;
70 delete e;
71 }
72}
73
74inline void LabelStack::pop()
75{
76 if (StackElem *e = tos) {
77 tos = e->prev;
78 delete e;
79 }
80}
81
82}
83
84#endif // KJS_LABEL_STACK_H