30 #include "CompileState.h"
31 #include "operations.h"
32 #include "SymbolTable.h"
34 #include "bytecode/opargs.h"
35 #include <wtf/ListRefPtr.h>
36 #include <wtf/Vector.h>
41 class PropertyNameNode;
42 class PropertyListNode;
44 class SourceElementsNode;
48 class FunctionBodyNode;
52 class FuncDeclVisitor;
55 struct CompileReference;
60 virtual ~NodeVisitor() {}
90 virtual NodeType
type()
const
92 return UnknownNodeType;
99 UString reindent(
int baseLine = 0)
const;
101 virtual void streamTo(SourceStream &)
const = 0;
110 static void clearNewNodes();
112 virtual Node *nodeInsideAllParens();
114 virtual bool isLocation()
const
118 virtual bool isVarAccessNode()
const
122 bool isNumber()
const
124 return type() == NumberNodeType;
126 bool isString()
const
128 return type() == StringNodeType;
130 bool isGroupNode()
const
132 return type() == GroupNodeType;
134 bool isTryNode()
const
136 return type() == TryNodeType;
138 bool isLabelNode()
const
140 return type() == LabelNodeType;
142 virtual bool scanForDeclarations()
const
146 virtual bool isIterationStatement()
const
151 virtual void breakCycle() { }
156 void processDecls(ExecState *);
163 virtual void recurseVisit(NodeVisitor * ) {}
166 static void recurseVisitLink(NodeVisitor *visitor, RefPtr<T> &link)
172 T *newLink =
static_cast<T *
>(visitor->visit(
link.get()));
179 static void recurseVisitLink(NodeVisitor *visitor, ListRefPtr<T> &link)
185 T *newLink =
static_cast<T *
>(visitor->visit(
link.get()));
191 JSValue *throwError(ExecState *, ErrorType,
const UString &msg);
192 JSValue *throwError(ExecState *, ErrorType,
const UString &msg,
const Identifier &);
193 JSValue *throwUndefinedVariableError(ExecState *,
const Identifier &);
195 virtual OpValue generateEvalCode(CompileState *comp);
199 virtual void processVarDecl(ExecState *state);
200 virtual void processFuncDecl(ExecState *state);
201 friend class VarDeclVisitor;
202 friend class FuncDeclVisitor;
209 class LocationNode :
public Node
212 bool isLocation()
const override
220 virtual CompileReference *generateRefBind(CompileState *) = 0;
225 virtual CompileReference *generateRefRead(CompileState *, OpValue *out) = 0;
228 virtual void generateRefWrite(CompileState *,
229 CompileReference *ref, OpValue &valToStore) = 0;
233 virtual OpValue generateRefDelete(CompileState *) = 0;
237 virtual void generateRefFunc(CompileState *comp, OpValue *funOut, OpValue *thisOut) = 0;
240 class StatementNode :
public Node
244 void setLoc(
int line0,
int line1)
const;
245 int firstLine()
const
253 void hitStatement(ExecState *);
255 void generateDebugInfoIfNeeded(CompileState *comp);
257 virtual void generateExecCode(CompileState *);
259 void generateDebugInfo(CompileState *comp);
260 mutable int m_lastLine;
263 inline void StatementNode::generateDebugInfoIfNeeded(CompileState *comp)
265 if (comp->compileType() == Debug) {
266 generateDebugInfo(comp);
270 class NullNode :
public Node
274 NodeType
type()
const override
278 OpValue generateEvalCode(CompileState *comp)
override;
279 void streamTo(SourceStream &)
const override;
282 class BooleanNode :
public Node
285 BooleanNode(
bool v) : val(v) {}
291 NodeType
type()
const override
293 return BooleanNodeType;
295 OpValue generateEvalCode(CompileState *comp)
override;
296 void streamTo(SourceStream &)
const override;
301 class NumberNode :
public Node
304 NumberNode(
double v) : val(v) {}
309 void setValue(
double v)
314 NodeType
type()
const override
316 return NumberNodeType;
318 OpValue generateEvalCode(CompileState *comp)
override;
319 void streamTo(SourceStream &)
const override;
324 class StringNode :
public Node
327 StringNode(
const UString *v) : val(*v), interned(nullptr) { }
328 ~StringNode()
override;
329 UString value()
const
333 void setValue(
const UString &v)
338 NodeType
type()
const override
340 return StringNodeType;
342 OpValue generateEvalCode(CompileState *comp)
override;
343 void streamTo(SourceStream &)
const override;
349 class RegExpNode :
public Node
352 RegExpNode(
const UString &p,
const UString &f)
354 NodeType
type()
const override
356 return RegExpNodeType;
358 OpValue generateEvalCode(CompileState *comp)
override;
359 void streamTo(SourceStream &)
const override;
364 class ThisNode :
public Node
368 OpValue generateEvalCode(CompileState *comp)
override;
369 void streamTo(SourceStream &)
const override;
372 class VarAccessNode :
public LocationNode
375 VarAccessNode(
const Identifier &s) : ident(s) {}
377 bool isVarAccessNode()
const override
381 void streamTo(SourceStream &)
const override;
382 OpValue generateEvalCode(CompileState *comp)
override;
384 CompileReference *generateRefBind(CompileState *)
override;
385 CompileReference *generateRefRead(CompileState *, OpValue *out)
override;
386 void generateRefWrite(CompileState *,
387 CompileReference *ref, OpValue &valToStore)
override;
388 OpValue generateRefDelete(CompileState *)
override;
389 void generateRefFunc(CompileState *comp, OpValue *funOut, OpValue *thisOut)
override;
392 OpValue valueForTypeOf(CompileState *comp);
396 enum Classification {
403 size_t classifyVariable(CompileState *, Classification &classify);
408 class GroupNode :
public Node
411 GroupNode(
Node *g) : group(g) { }
412 NodeType
type()
const override
414 return GroupNodeType;
417 OpValue generateEvalCode(CompileState *comp)
override;
418 Node *nodeInsideAllParens()
override;
419 void streamTo(SourceStream &)
const override;
420 void recurseVisit(NodeVisitor *visitor)
override;
425 class ElementNode :
public Node
429 ElementNode(
int e,
Node *n) :
next(this), elision(e), node(n)
431 Parser::noteNodeCycle(
this);
433 ElementNode(ElementNode *l,
int e,
Node *n)
434 :
next(l->
next), elision(e), node(n)
439 void streamTo(SourceStream &)
const override;
440 PassRefPtr<ElementNode> releaseNext()
442 return next.release();
444 void breakCycle()
override;
445 void recurseVisit(NodeVisitor *visitor)
override;
447 friend class ArrayNode;
448 ListRefPtr<ElementNode>
next;
453 class ArrayNode :
public Node
456 ArrayNode(
int e) : elision(e), opt(true) { }
457 ArrayNode(ElementNode *ele)
458 : element(ele->
next.
release()), elision(0), opt(false)
460 Parser::removeNodeCycle(element.get());
462 ArrayNode(
int eli, ElementNode *ele)
463 : element(ele->
next.
release()), elision(eli), opt(true)
465 Parser::removeNodeCycle(element.get());
467 OpValue generateEvalCode(CompileState *comp)
override;
468 void streamTo(SourceStream &)
const override;
469 void recurseVisit(NodeVisitor *visitor)
override;
470 bool scanForDeclarations()
const override
475 RefPtr<ElementNode> element;
480 class PropertyNameNode :
public Node
483 PropertyNameNode(
const Identifier &s) : str(s) { }
484 void streamTo(SourceStream &)
const override;
486 friend class ObjectLiteralNode;
490 class PropertyNode :
public Node
493 enum Type { Constant, Getter, Setter };
494 PropertyNode(PropertyNameNode *n,
Node *a, Type t)
496 void streamTo(SourceStream &)
const override;
497 friend class PropertyListNode;
498 void recurseVisit(NodeVisitor *visitor)
override;
500 friend class ObjectLiteralNode;
501 RefPtr<PropertyNameNode>
name;
506 class PropertyListNode :
public Node
510 PropertyListNode(PropertyNode *n)
511 : node(n),
next(this)
513 Parser::noteNodeCycle(
this);
515 PropertyListNode(PropertyNode *n, PropertyListNode *l)
520 void streamTo(SourceStream &)
const override;
521 PassRefPtr<PropertyListNode> releaseNext()
523 return next.release();
525 void breakCycle()
override;
526 void recurseVisit(NodeVisitor *visitor)
override;
528 friend class ObjectLiteralNode;
529 RefPtr<PropertyNode> node;
530 ListRefPtr<PropertyListNode>
next;
533 class ObjectLiteralNode :
public Node
536 ObjectLiteralNode() { }
539 Parser::removeNodeCycle(
list.get());
541 OpValue generateEvalCode(CompileState *comp)
override;
542 void streamTo(SourceStream &)
const override;
543 void recurseVisit(NodeVisitor *visitor)
override;
544 bool scanForDeclarations()
const override
549 RefPtr<PropertyListNode>
list;
552 class BracketAccessorNode :
public LocationNode
555 BracketAccessorNode(
Node *e1,
Node *e2) : expr1(e1), expr2(e2) {}
556 void streamTo(SourceStream &)
const override;
558 OpValue generateEvalCode(CompileState *comp)
override;
560 CompileReference *generateRefBind(CompileState *)
override;
561 CompileReference *generateRefRead(CompileState *, OpValue *out)
override;
562 void generateRefWrite(CompileState *,
563 CompileReference *ref, OpValue &valToStore)
override;
564 OpValue generateRefDelete(CompileState *)
override;
565 void generateRefFunc(CompileState *comp, OpValue *funOut, OpValue *thisOut)
override;
576 void recurseVisit(NodeVisitor *visitor)
override;
582 class DotAccessorNode :
public LocationNode
585 DotAccessorNode(
Node *e,
const Identifier &s) : expr(e), ident(s) { }
586 void streamTo(SourceStream &)
const override;
588 OpValue generateEvalCode(CompileState *comp)
override;
590 CompileReference *generateRefBind(CompileState *)
override;
591 CompileReference *generateRefRead(CompileState *, OpValue *out)
override;
592 void generateRefWrite(CompileState *,
593 CompileReference *ref, OpValue &valToStore)
override;
594 OpValue generateRefDelete(CompileState *)
override;
595 void generateRefFunc(CompileState *comp, OpValue *funOut, OpValue *thisOut)
override;
601 const Identifier &identifier()
const
606 void recurseVisit(NodeVisitor *visitor)
override;
612 class ArgumentListNode :
public Node
616 ArgumentListNode(
Node *e) :
next(this), expr(e)
618 Parser::noteNodeCycle(
this);
620 ArgumentListNode(ArgumentListNode *l,
Node *e)
626 void streamTo(SourceStream &)
const override;
627 PassRefPtr<ArgumentListNode> releaseNext()
629 return next.release();
631 void breakCycle()
override;
633 void recurseVisit(NodeVisitor *visitor)
override;
635 friend class ArgumentsNode;
636 ListRefPtr<ArgumentListNode>
next;
640 class ArgumentsNode :
public Node
644 ArgumentsNode(ArgumentListNode *l)
647 Parser::removeNodeCycle(
list.get());
650 void generateEvalArguments(CompileState *comp);
651 void streamTo(SourceStream &)
const override;
653 void recurseVisit(NodeVisitor *visitor)
override;
655 RefPtr<ArgumentListNode>
list;
658 class NewExprNode :
public Node
661 NewExprNode(
Node *e) : expr(e) {}
662 NewExprNode(
Node *e, ArgumentsNode *a) : expr(e), args(a) {}
664 OpValue generateEvalCode(CompileState *comp)
override;
665 void streamTo(SourceStream &)
const override;
666 void recurseVisit(NodeVisitor *visitor)
override;
669 RefPtr<ArgumentsNode> args;
672 class FunctionCallValueNode :
public Node
675 FunctionCallValueNode(
Node *e, ArgumentsNode *a) : expr(e), args(a) {}
677 OpValue generateEvalCode(CompileState *comp)
override;
678 void streamTo(SourceStream &)
const override;
679 void recurseVisit(NodeVisitor *visitor)
override;
682 RefPtr<ArgumentsNode> args;
685 class FunctionCallReferenceNode :
public Node
688 FunctionCallReferenceNode(
Node *e, ArgumentsNode *a) : expr(e), args(a) {}
690 OpValue generateEvalCode(CompileState *comp)
override;
691 void streamTo(SourceStream &)
const override;
692 void recurseVisit(NodeVisitor *visitor)
override;
695 RefPtr<ArgumentsNode> args;
698 class PostfixNode :
public Node
701 PostfixNode(
Node *l, Operator o) : m_loc(l), m_oper(o) {}
703 void streamTo(SourceStream &)
const override;
704 void recurseVisit(NodeVisitor *visitor)
override;
705 OpValue generateEvalCode(CompileState *comp)
override;
711 class DeleteReferenceNode :
public Node
714 DeleteReferenceNode(LocationNode *l) : loc(l) {}
716 void streamTo(SourceStream &)
const override;
717 void recurseVisit(NodeVisitor *visitor)
override;
718 OpValue generateEvalCode(CompileState *comp)
override;
720 RefPtr<LocationNode> loc;
723 class DeleteValueNode :
public Node
726 DeleteValueNode(
Node *e) : m_expr(e) {}
728 void streamTo(SourceStream &)
const override;
729 void recurseVisit(NodeVisitor *visitor)
override;
730 OpValue generateEvalCode(CompileState *comp)
override;
735 class VoidNode :
public Node
738 VoidNode(
Node *e) : expr(e) {}
740 OpValue generateEvalCode(CompileState *comp)
override;
741 void streamTo(SourceStream &)
const override;
742 void recurseVisit(NodeVisitor *visitor)
override;
747 class TypeOfVarNode :
public Node
750 TypeOfVarNode(VarAccessNode *l) : loc(l) {}
752 OpValue generateEvalCode(CompileState *comp)
override;
753 void streamTo(SourceStream &)
const override;
754 void recurseVisit(NodeVisitor *visitor)
override;
756 RefPtr<VarAccessNode> loc;
759 class TypeOfValueNode :
public Node
762 TypeOfValueNode(
Node *e) : m_expr(e) {}
764 OpValue generateEvalCode(CompileState *comp)
override;
765 void streamTo(SourceStream &)
const override;
766 void recurseVisit(NodeVisitor *visitor)
override;
771 class PrefixNode :
public Node
774 PrefixNode(
Node *l, Operator o) : m_loc(l), m_oper(o) {}
776 OpValue generateEvalCode(CompileState *comp)
override;
777 void streamTo(SourceStream &)
const override;
778 void recurseVisit(NodeVisitor *visitor)
override;
784 class UnaryPlusNode :
public Node
787 UnaryPlusNode(
Node *e) : expr(e) {}
789 OpValue generateEvalCode(CompileState *comp)
override;
790 void streamTo(SourceStream &)
const override;
791 void recurseVisit(NodeVisitor *visitor)
override;
796 class NegateNode :
public Node
799 NegateNode(
Node *e) : expr(e) {}
801 OpValue generateEvalCode(CompileState *comp)
override;
802 void streamTo(SourceStream &)
const override;
803 void recurseVisit(NodeVisitor *visitor)
override;
808 class BitwiseNotNode :
public Node
811 BitwiseNotNode(
Node *e) : expr(e) {}
813 OpValue generateEvalCode(CompileState *comp)
override;
814 void streamTo(SourceStream &)
const override;
815 void recurseVisit(NodeVisitor *visitor)
override;
820 class LogicalNotNode :
public Node
823 LogicalNotNode(
Node *e) : expr(e) {}
825 OpValue generateEvalCode(CompileState *comp)
override;
826 void streamTo(SourceStream &)
const override;
827 void recurseVisit(NodeVisitor *visitor)
override;
832 class BinaryOperatorNode :
public Node
835 BinaryOperatorNode(
Node *e1,
Node *e2, Operator op)
836 : expr1(e1), expr2(e2), oper(op) {}
838 OpValue generateEvalCode(CompileState *comp)
override;
839 void streamTo(SourceStream &)
const override;
840 void recurseVisit(NodeVisitor *visitor)
override;
854 expr1(e1), expr2(e2), oper(o) {}
856 OpValue generateEvalCode(CompileState *comp)
override;
857 void streamTo(SourceStream &)
const override;
858 void recurseVisit(NodeVisitor *visitor)
override;
872 logical(l), expr1(e1), expr2(e2) {}
874 OpValue generateEvalCode(CompileState *comp)
override;
875 void streamTo(SourceStream &)
const override;
876 void recurseVisit(NodeVisitor *visitor)
override;
878 RefPtr<Node> logical;
883 class AssignNode :
public Node
886 AssignNode(Node *loc, Operator oper, Node *right)
887 : m_loc(loc), m_oper(oper), m_right(right) {}
889 void streamTo(SourceStream &)
const override;
890 OpValue generateEvalCode(CompileState *comp)
override;
891 void recurseVisit(NodeVisitor *visitor)
override;
895 RefPtr<Node> m_right;
898 class CommaNode :
public Node
901 CommaNode(
Node *e1,
Node *e2) : expr1(e1), expr2(e2) {}
903 void streamTo(SourceStream &)
const override;
904 void recurseVisit(NodeVisitor *visitor)
override;
905 OpValue generateEvalCode(CompileState *comp)
override;
911 class AssignExprNode :
public Node
914 AssignExprNode(
Node *e) : expr(e) {}
916 void streamTo(SourceStream &)
const override;
917 void recurseVisit(NodeVisitor *visitor)
override;
918 OpValue generateEvalCode(CompileState *comp)
override;
928 class VarDeclNode :
public Node
931 enum Type { Variable, Constant };
932 VarDeclNode(
const Identifier &
id, AssignExprNode *in, Type t);
934 void generateCode(CompileState *comp);
936 void streamTo(SourceStream &)
const override;
937 void recurseVisit(NodeVisitor *visitor)
override;
939 void processVarDecl(ExecState *)
override;
941 friend class VarStatementNode;
942 friend class VarDeclListNode;
945 RefPtr<AssignExprNode>
init;
948 class VarDeclListNode :
public Node
952 VarDeclListNode(VarDeclNode *v) :
next(this), var(v)
954 Parser::noteNodeCycle(
this);
956 VarDeclListNode(VarDeclListNode *l, VarDeclNode *v)
962 OpValue generateEvalCode(CompileState *comp)
override;
963 void streamTo(SourceStream &)
const override;
964 PassRefPtr<VarDeclListNode> releaseNext()
966 return next.release();
968 void breakCycle()
override;
969 void recurseVisit(NodeVisitor *visitor)
override;
971 friend class ForNode;
972 friend class VarStatementNode;
973 ListRefPtr<VarDeclListNode>
next;
974 RefPtr<VarDeclNode> var;
977 class VarStatementNode :
public StatementNode
982 Parser::removeNodeCycle(
next.get());
985 void streamTo(SourceStream &)
const override;
986 void recurseVisit(NodeVisitor *visitor)
override;
987 void generateExecCode(CompileState *)
override;
989 RefPtr<VarDeclListNode>
next;
992 class BlockNode :
public StatementNode
995 BlockNode(SourceElementsNode *s);
997 void streamTo(SourceStream &)
const override;
998 void recurseVisit(NodeVisitor *visitor)
override;
999 void generateExecCode(CompileState *)
override;
1001 RefPtr<SourceElementsNode> source;
1004 class EmptyStatementNode :
public StatementNode
1007 EmptyStatementNode() { }
1009 void streamTo(SourceStream &)
const override;
1010 void generateExecCode(CompileState *)
override;
1013 class ExprStatementNode :
public StatementNode
1016 ExprStatementNode(
Node *e) : expr(e) { }
1018 void streamTo(SourceStream &)
const override;
1019 void recurseVisit(NodeVisitor *visitor)
override;
1020 void generateExecCode(CompileState *)
override;
1025 class IfNode :
public StatementNode
1028 IfNode(
Node *e, StatementNode *s1, StatementNode *s2)
1029 : expr(e), statement1(s1), statement2(s2) {}
1031 void streamTo(SourceStream &)
const override;
1032 void recurseVisit(NodeVisitor *visitor)
override;
1033 void generateExecCode(CompileState *)
override;
1036 RefPtr<StatementNode> statement1;
1037 RefPtr<StatementNode> statement2;
1040 class DoWhileNode :
public StatementNode
1043 DoWhileNode(StatementNode *s,
Node *e) : statement(s), expr(e) {}
1045 void streamTo(SourceStream &)
const override;
1046 void recurseVisit(NodeVisitor *visitor)
override;
1047 void generateExecCode(CompileState *)
override;
1048 bool isIterationStatement()
const override
1053 RefPtr<StatementNode> statement;
1057 class WhileNode :
public StatementNode
1060 WhileNode(
Node *e, StatementNode *s) : expr(e), statement(s) {}
1062 void streamTo(SourceStream &)
const override;
1063 void recurseVisit(NodeVisitor *visitor)
override;
1064 void generateExecCode(CompileState *)
override;
1065 bool isIterationStatement()
const override
1071 RefPtr<StatementNode> statement;
1074 class ForNode :
public StatementNode
1077 ForNode(
Node *e1,
Node *e2,
Node *e3, StatementNode *s) :
1078 expr1(e1), expr2(e2), expr3(e3), statement(s) {}
1079 ForNode(VarDeclListNode *e1,
Node *e2,
Node *e3, StatementNode *s) :
1080 expr1(e1->
next.
release()), expr2(e2), expr3(e3), statement(s)
1082 Parser::removeNodeCycle(expr1.get());
1085 void generateExecCode(CompileState *)
override;
1086 void streamTo(SourceStream &)
const override;
1087 void recurseVisit(NodeVisitor *visitor)
override;
1088 bool isIterationStatement()
const override
1096 RefPtr<StatementNode> statement;
1099 class ForInNode :
public StatementNode
1102 ForInNode(
Node *l,
Node *e, StatementNode *s);
1103 ForInNode(
const Identifier &i, AssignExprNode *in,
Node *e, StatementNode *s);
1105 void generateExecCode(CompileState *)
override;
1106 void streamTo(SourceStream &)
const override;
1107 void recurseVisit(NodeVisitor *visitor)
override;
1108 bool isIterationStatement()
const override
1114 RefPtr<AssignExprNode>
init;
1117 RefPtr<VarDeclNode> varDecl;
1118 RefPtr<StatementNode> statement;
1121 class ContinueNode :
public StatementNode
1124 ContinueNode() : target(nullptr) { }
1125 ContinueNode(
const Identifier &i) : ident(i), target(nullptr) { }
1127 void generateExecCode(CompileState *)
override;
1128 void streamTo(SourceStream &)
const override;
1134 class BreakNode :
public StatementNode
1137 BreakNode() : target(nullptr) { }
1138 BreakNode(
const Identifier &i) : ident(i), target(nullptr) { }
1140 void generateExecCode(CompileState *)
override;
1141 void streamTo(SourceStream &)
const override;
1147 class ReturnNode :
public StatementNode
1150 ReturnNode(
Node *v) : value(v) {}
1152 void generateExecCode(CompileState *)
override;
1153 void streamTo(SourceStream &)
const override;
1154 void recurseVisit(NodeVisitor *visitor)
override;
1159 class WithNode :
public StatementNode
1162 WithNode(
Node *e, StatementNode *s) : expr(e), statement(s) {}
1164 void generateExecCode(CompileState *)
override;
1165 void streamTo(SourceStream &)
const override;
1166 void recurseVisit(NodeVisitor *visitor)
override;
1169 RefPtr<StatementNode> statement;
1175 LabelNode(
const Identifier &l, StatementNode *s) :
label(l), statement(s) { }
1177 void streamTo(SourceStream &)
const override;
1178 void recurseVisit(NodeVisitor *visitor)
override;
1179 void generateExecCode(CompileState *)
override;
1180 NodeType
type()
const override
1182 return LabelNodeType;
1186 RefPtr<StatementNode> statement;
1189 class ThrowNode :
public StatementNode
1192 ThrowNode(
Node *e) : expr(e) {}
1194 void generateExecCode(CompileState *)
override;
1195 void streamTo(SourceStream &)
const override;
1196 void recurseVisit(NodeVisitor *visitor)
override;
1201 class TryNode :
public StatementNode
1204 TryNode(StatementNode *b,
const Identifier &e, StatementNode *c, StatementNode *f)
1205 : tryBlock(b), exceptionIdent(e), catchBlock(c), finallyBlock(f) { }
1206 NodeType
type()
const override
1211 void generateExecCode(CompileState *)
override;
1212 void streamTo(SourceStream &)
const override;
1213 void recurseVisit(NodeVisitor *visitor)
override;
1215 RefPtr<StatementNode> tryBlock;
1216 Identifier exceptionIdent;
1217 RefPtr<StatementNode> catchBlock;
1218 RefPtr<StatementNode> finallyBlock;
1221 class ParameterNode :
public Node
1225 ParameterNode(
const Identifier &i) : id(i),
next(this)
1227 Parser::noteNodeCycle(
this);
1229 ParameterNode(ParameterNode *next,
const Identifier &i)
1235 const Identifier &ident()
const
1239 ParameterNode *nextParam()
const
1243 void streamTo(SourceStream &)
const override;
1244 PassRefPtr<ParameterNode> releaseNext()
1246 return next.release();
1248 void breakCycle()
override;
1250 void recurseVisit(NodeVisitor *visitor)
override;
1252 friend class FuncDeclNode;
1253 friend class FuncExprNode;
1255 ListRefPtr<ParameterNode>
next;
1259 enum FunctionBodyFlags {
1264 FuncFl_HasEvalOp = 4
1280 SymbolInfo(
int _attr, FuncDeclNode *_funcDecl) : funcDecl(_funcDecl), attr(_attr) {}
1282 FuncDeclNode *funcDecl;
1295 bool isCompiled()
const
1297 return m_compType != NotCompiled;
1299 void compileIfNeeded(CodeType ctype, CompileType compType);
1300 void compile(CodeType ctype, CompileType compType);
1301 CompileType compileState()
const
1306 void generateExecCode(CompileState *)
override;
1309 void reserveSlot(
size_t id,
bool shouldMark);
1312 SymbolTable &symbolTable()
1314 return m_symbolTable;
1316 size_t lookupSymbolID(
const Identifier &
id)
const
1318 return m_symbolTable.get(
id.ustring().rep());
1321 int numLocalsAndRegisters()
const
1323 return m_symbolList.size();
1325 SymbolInfo *getLocalInfo()
1327 return m_symbolList.data();
1330 size_t numFunctionLocals()
const
1332 return m_functionLocals.size();
1334 size_t *getFunctionLocalInfo()
1336 return m_functionLocals.data();
1342 size_t numParams()
const
1344 return m_paramList.size();
1346 const Identifier ¶mName(
size_t pos)
const
1348 return m_paramList[pos];
1352 void addFunDecl(
const Identifier &ident,
int attr, FuncDeclNode *funcDecl);
1355 void addSymbolOverwriteID(
size_t id,
const Identifier &ident,
int attr);
1360 bool tearOffAtEnd()
const
1362 return m_tearOffAtEnd;
1365 const CodeBlock &code()
const
1367 return m_compiledCode;
1371 return m_compiledCode;
1376 unsigned flags()
const
1382 size_t addSymbol(
const Identifier &ident,
int attr, FuncDeclNode *funcDecl =
nullptr);
1384 int m_sourceId : 31;
1385 bool m_tearOffAtEnd : 1;
1386 CompileType m_compType;
1392 WTF::Vector<SymbolInfo> m_symbolList;
1395 WTF::Vector<size_t> m_functionLocals;
1398 SymbolTable m_symbolTable;
1401 WTF::Vector<Identifier> m_paramList;
1403 CodeBlock m_compiledCode;
1406 inline void FunctionBodyNode::compileIfNeeded(CodeType ctype, CompileType compType)
1408 if (m_compType != compType) {
1409 compile(ctype, compType);
1413 class FuncExprNode :
public Node
1416 FuncExprNode(
const Identifier &i, FunctionBodyNode *b, ParameterNode *p =
nullptr)
1417 : ident(i), param(p ? p->
next.
release() : PassRefPtr<ParameterNode>(nullptr)), body(b)
1420 Parser::removeNodeCycle(param.get());
1424 OpValue generateEvalCode(CompileState *comp)
override;
1425 void streamTo(SourceStream &)
const override;
1426 void recurseVisit(NodeVisitor *visitor)
override;
1427 bool scanForDeclarations()
const override
1434 friend class PropertyNode;
1436 RefPtr<ParameterNode> param;
1437 RefPtr<FunctionBodyNode> body;
1440 class FuncDeclNode :
public StatementNode
1443 FuncDeclNode(
const Identifier &i, FunctionBodyNode *b)
1448 FuncDeclNode(
const Identifier &i, ParameterNode *p, FunctionBodyNode *b)
1451 Parser::removeNodeCycle(param.get());
1455 void generateExecCode(CompileState *)
override;
1456 void streamTo(SourceStream &)
const override;
1457 void recurseVisit(NodeVisitor *visitor)
override;
1458 bool scanForDeclarations()
const override
1463 void processFuncDecl(ExecState *)
override;
1464 FunctionImp *makeFunctionObject(ExecState *);
1468 RefPtr<ParameterNode> param;
1469 RefPtr<FunctionBodyNode> body;
1473 class SourceElementsNode :
public StatementNode
1477 SourceElementsNode(StatementNode *);
1478 SourceElementsNode(SourceElementsNode *s1, StatementNode *s2);
1480 void generateExecCode(CompileState *)
override;
1481 void streamTo(SourceStream &)
const override;
1482 PassRefPtr<SourceElementsNode> releaseNext()
1484 return next.release();
1486 void breakCycle()
override;
1487 void recurseVisit(NodeVisitor *visitor)
override;
1489 friend class BlockNode;
1490 friend class CaseClauseNode;
1491 RefPtr<StatementNode> node;
1492 ListRefPtr<SourceElementsNode>
next;
1495 class CaseClauseNode :
public Node
1498 CaseClauseNode(
Node *e) : expr(e) { }
1499 CaseClauseNode(
Node *e, SourceElementsNode *s)
1502 Parser::removeNodeCycle(source.get());
1505 void streamTo(SourceStream &)
const override;
1506 void recurseVisit(NodeVisitor *visitor)
override;
1508 friend class SwitchNode;
1510 RefPtr<SourceElementsNode> source;
1513 class ClauseListNode :
public Node
1517 ClauseListNode(CaseClauseNode *c) : clause(c),
next(this)
1519 Parser::noteNodeCycle(
this);
1521 ClauseListNode(ClauseListNode *n, CaseClauseNode *c)
1527 CaseClauseNode *getClause()
const
1529 return clause.get();
1531 ClauseListNode *getNext()
const
1535 void streamTo(SourceStream &)
const override;
1536 PassRefPtr<ClauseListNode> releaseNext()
1538 return next.release();
1540 void breakCycle()
override;
1541 void recurseVisit(NodeVisitor *visitor)
override;
1543 friend class SwitchNode;
1544 friend class CaseBlockNode;
1545 RefPtr<CaseClauseNode> clause;
1546 ListRefPtr<ClauseListNode>
next;
1549 class CaseBlockNode :
public Node
1552 CaseBlockNode(ClauseListNode *l1, CaseClauseNode *d, ClauseListNode *l2);
1554 void streamTo(SourceStream &)
const override;
1555 void recurseVisit(NodeVisitor *visitor)
override;
1557 friend class SwitchNode;
1558 RefPtr<ClauseListNode> list1;
1559 RefPtr<CaseClauseNode> def;
1560 RefPtr<ClauseListNode> list2;
1563 class SwitchNode :
public StatementNode
1566 SwitchNode(
Node *e, CaseBlockNode *b) : expr(e), block(b) { }
1568 void streamTo(SourceStream &)
const override;
1569 void recurseVisit(NodeVisitor *visitor)
override;
1570 void generateExecCode(CompileState *comp)
override;
1573 RefPtr<CaseBlockNode> block;
1579 class ProgramNode :
public FunctionBodyNode
1582 ProgramNode(SourceElementsNode *s);
1583 void streamTo(SourceStream &)
const override;
1586 class PackageNameNode :
public Node
1589 PackageNameNode(
const Identifier &i) : names(nullptr), id(i) { }
1590 PackageNameNode(PackageNameNode *n,
1591 const Identifier &i) : names(n), id(i) { }
1593 void streamTo(SourceStream &)
const override;
1594 void recurseVisit(NodeVisitor *visitor)
override;
1596 Completion loadSymbol(ExecState *exec,
bool wildcard);
1597 PackageObject *resolvePackage(ExecState *exec);
1600 PackageObject *resolvePackage(ExecState *exec,
1601 JSObject *baseObject, Package *basePackage);
1602 RefPtr<PackageNameNode> names;
1606 class ImportStatement :
public StatementNode
1609 ImportStatement(PackageNameNode *n) :
name(n), wld(false) {}
1610 void enableWildcard()
1614 void setAlias(
const Identifier &a)
1619 void generateExecCode(CompileState *)
override;
1620 void streamTo(SourceStream &)
const override;
1621 void recurseVisit(NodeVisitor *visitor)
override;
1623 void processVarDecl(ExecState *state)
override;
1624 RefPtr<PackageNameNode>
name;