📄 nodes.h
字号:
// -*- c-basic-offset: 2 -*-/* * This file is part of the KDE libraries * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) * Copyright (C) 2001 Peter Kelly (pmk@post.com) * Copyright (C) 2003 Apple Computer, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * */#ifndef _NODES_H_#define _NODES_H_#include "internal.h"//#include "debugger.h"#if !defined(NDEBUG) && !KWIQ#ifndef __osf__#include <list>#endif#endifnamespace KJS { class RegExp; class SourceElementsNode; class ProgramNode; class SourceStream; class PropertyValueNode; class PropertyNode; enum Operator { OpEqual, OpEqEq, OpNotEq, OpStrEq, OpStrNEq, OpPlusEq, OpMinusEq, OpMultEq, OpDivEq, OpPlusPlus, OpMinusMinus, OpLess, OpLessEq, OpGreater, OpGreaterEq, OpAndEq, OpXOrEq, OpOrEq, OpModEq, OpAnd, OpOr, OpBitAnd, OpBitXOr, OpBitOr, OpLShift, OpRShift, OpURShift, OpIn, OpInstanceOf }; class Node { public: Node(); virtual ~Node(); virtual Value evaluate(ExecState *exec) = 0; virtual Reference evaluateReference(ExecState *exec); UString toString() const; virtual void streamTo(SourceStream &s) const = 0; virtual void processVarDecls(ExecState */*exec*/) {} int lineNo() const { return line; } public: // reference counting mechanism virtual void ref() { refcount++; }#ifdef KJS_DEBUG_MEM virtual bool deref() { assert( refcount > 0 ); return (!--refcount); }#else virtual bool deref() { return (!--refcount); }#endif#ifdef KJS_DEBUG_MEM static void finalCheck();#endif protected: Value throwError(ExecState *exec, ErrorType e, const char *msg); Value throwError(ExecState *exec, ErrorType e, const char *msg, Value v, Node *expr); Value throwError(ExecState *exec, ErrorType e, const char *msg, Identifier label); int line; UString sourceURL; unsigned int refcount; virtual int sourceId() const { return -1; } private:#ifdef KJS_DEBUG_MEM // List of all nodes, for debugging purposes. Don't remove! static std::list<Node *> *s_nodes;#endif // disallow assignment Node& operator=(const Node&); Node(const Node &other); }; class StatementNode : public Node { public: StatementNode(); void setLoc(int line0, int line1, int sourceId); int firstLine() const { return l0; } int lastLine() const { return l1; } int sourceId() const { return sid; } bool hitStatement(ExecState *exec); bool abortStatement(ExecState *exec); virtual Completion execute(ExecState *exec) = 0; void pushLabel(const Identifier &id) { ls.push(id); } virtual void processFuncDecl(ExecState *exec); protected: LabelStack ls; private: Value evaluate(ExecState */*exec*/) { return Undefined(); } int l0, l1; int sid; bool breakPoint; }; class NullNode : public Node { public: NullNode() {} Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; }; class BooleanNode : public Node { public: BooleanNode(bool v) : value(v) {} Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: bool value; }; class NumberNode : public Node { public: NumberNode(double v) : value(v) { } Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: double value; }; class StringNode : public Node { public: StringNode(const UString *v) { value = *v; } Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: UString value; }; class RegExpNode : public Node { public: RegExpNode(const UString &p, const UString &f) : pattern(p), flags(f) { } Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: UString pattern, flags; }; class ThisNode : public Node { public: ThisNode() {} Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; }; class ResolveNode : public Node { public: ResolveNode(const Identifier &s) : ident(s) { } Value evaluate(ExecState *exec); virtual Reference evaluateReference(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Identifier ident; }; class GroupNode : public Node { public: GroupNode(Node *g) : group(g) { } virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const { group->streamTo(s); } private: Node *group; }; class ElementNode : public Node { public: // list pointer is tail of a circular list, cracked in the ArrayNode ctor ElementNode(int e, Node *n) : list(this), elision(e), node(n) { } ElementNode(ElementNode *l, int e, Node *n) : list(l->list), elision(e), node(n) { l->list = this; } virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: friend class ArrayNode; ElementNode *list; int elision; Node *node; }; class ArrayNode : public Node { public: ArrayNode(int e) : element(0), elision(e), opt(true) { } ArrayNode(ElementNode *ele) : element(ele->list), elision(0), opt(false) { ele->list = 0; } ArrayNode(int eli, ElementNode *ele) : element(ele->list), elision(eli), opt(true) { ele->list = 0; } virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: ElementNode *element; int elision; bool opt; }; class PropertyValueNode : public Node { public: // list pointer is tail of a circular list, cracked in the ObjectLiteralNode ctor PropertyValueNode(PropertyNode *n, Node *a) : name(n), assign(a), list(this) { } PropertyValueNode(PropertyNode *n, Node *a, PropertyValueNode *l) : name(n), assign(a), list(l->list) { l->list = this; } virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: friend class ObjectLiteralNode; PropertyNode *name; Node *assign; PropertyValueNode *list; }; class ObjectLiteralNode : public Node { public: ObjectLiteralNode() : list(0) { } ObjectLiteralNode(PropertyValueNode *l) : list(l->list) { l->list = 0; } virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: PropertyValueNode *list; }; class PropertyNode : public Node { public: PropertyNode(double d) : numeric(d) { } PropertyNode(const Identifier &s) : str(s) { } Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: double numeric; Identifier str; }; class AccessorNode1 : public Node { public: AccessorNode1(Node *e1, Node *e2) : expr1(e1), expr2(e2) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual Reference evaluateReference(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr1; Node *expr2; }; class AccessorNode2 : public Node { public: AccessorNode2(Node *e, const Identifier &s) : expr(e), ident(s) { } virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual Reference evaluateReference(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; Identifier ident; }; class ArgumentListNode : public Node { public: // list pointer is tail of a circular list, cracked in the ArgumentsNode ctor ArgumentListNode(Node *e) : list(this), expr(e) { } ArgumentListNode(ArgumentListNode *l, Node *e) : list(l->list), expr(e) { l->list = this; } virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); List evaluateList(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: friend class ArgumentsNode; ArgumentListNode *list; Node *expr; }; class ArgumentsNode : public Node { public: ArgumentsNode() : list(0) { } ArgumentsNode(ArgumentListNode *l) : list(l->list) { l->list = 0; } virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); List evaluateList(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: ArgumentListNode *list; }; class NewExprNode : public Node { public: NewExprNode(Node *e) : expr(e), args(0) {} NewExprNode(Node *e, ArgumentsNode *a) : expr(e), args(a) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; ArgumentsNode *args; }; class FunctionCallNode : public Node { public: FunctionCallNode(Node *e, ArgumentsNode *a) : expr(e), args(a) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; ArgumentsNode *args; }; class PostfixNode : public Node { public: PostfixNode(Node *e, Operator o) : expr(e), oper(o) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; Operator oper; }; class DeleteNode : public Node { public: DeleteNode(Node *e) : expr(e) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; }; class VoidNode : public Node { public: VoidNode(Node *e) : expr(e) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; }; class TypeOfNode : public Node { public: TypeOfNode(Node *e) : expr(e) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; }; class PrefixNode : public Node { public: PrefixNode(Operator o, Node *e) : oper(o), expr(e) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Operator oper; Node *expr; }; class UnaryPlusNode : public Node { public: UnaryPlusNode(Node *e) : expr(e) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; }; class NegateNode : public Node { public: NegateNode(Node *e) : expr(e) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; }; class BitwiseNotNode : public Node { public: BitwiseNotNode(Node *e) : expr(e) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; }; class LogicalNotNode : public Node { public: LogicalNotNode(Node *e) : expr(e) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr; }; class MultNode : public Node { public: MultNode(Node *t1, Node *t2, char op) : term1(t1), term2(t2), oper(op) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *term1, *term2; char oper; }; class AddNode : public Node { public: AddNode(Node *t1, Node *t2, char op) : term1(t1), term2(t2), oper(op) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *term1, *term2; char oper; }; class ShiftNode : public Node { public: ShiftNode(Node *t1, Operator o, Node *t2) : term1(t1), term2(t2), oper(o) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *term1, *term2; Operator oper; }; class RelationalNode : public Node { public: RelationalNode(Node *e1, Operator o, Node *e2) : expr1(e1), expr2(e2), oper(o) {} virtual void ref(); virtual bool deref(); Value evaluate(ExecState *exec); virtual void streamTo(SourceStream &s) const; private: Node *expr1, *expr2; Operator oper; };
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -