From 19a5012358d28123e044ca7ed44eb5afbd44976e Mon Sep 17 00:00:00 2001 From: "rogerl%netscape.com" Date: Mon, 28 Oct 2002 17:52:33 +0000 Subject: [PATCH] Switch statement start. --- js2/src/js2metadata.cpp | 69 +++++++++++++++++++++++++++++++++++++++++ js2/src/parser.h | 2 ++ 2 files changed, 71 insertions(+) diff --git a/js2/src/js2metadata.cpp b/js2/src/js2metadata.cpp index e6fb89cb5807..1dcb3caff072 100644 --- a/js2/src/js2metadata.cpp +++ b/js2/src/js2metadata.cpp @@ -219,6 +219,23 @@ namespace MetaData { targetList.pop_back(); } break; + case StmtNode::Switch: + { + SwitchStmtNode *sw = checked_cast(p); + ValidateExpression(cxt, env, sw->expr); + StmtNode *s = sw->statements; + while (s) { + if (s->getKind() == StmtNode::Case) { + ExprStmtNode *c = checked_cast(s); + if (c->expr) + ValidateExpression(cxt, env, c->expr); + } + else + ValidateStmt(cxt, env, s); + s = s->next; + } + } + break; case StmtNode::While: case StmtNode::DoWhile: { @@ -831,6 +848,58 @@ namespace MetaData { bCon->setLabel(f->breakLabelID); } break; + case StmtNode::Switch: +/* + + eLexicalWrite + Pop + + // test sequence in source order except + // the default is moved to end. + + eLexicalRead + + Equal + BranchTrue --> case1StmtLabel + eLexicalRead + + Equal + BranchTrue --> case2StmtLabel + Branch --> default, if there is one, or break label + + case1StmtLabel: + + case2StmtLabel: + + defaultLabel: + + case3StmtLabel: + + ..etc.. // all in source order + + breakLabel: +*/ + { + SwitchStmtNode *sw = checked_cast(p); + + Reference *r = EvalExprNode(env, phase, sw->expr); + if (r) r->emitReadBytecode(bCon, p->pos); + + StmtNode *s = sw->statements; + while (s) { + if (s->getKind() == StmtNode::Case) { + ExprStmtNode *c = checked_cast(s); + if (c->expr) { + Reference *r = EvalExprNode(env, phase, c->expr); + if (r) r->emitReadBytecode(bCon, p->pos); + } + } + else + EvalStmt(env, phase, s); + s = s->next; + } + } + break; case StmtNode::While: { UnaryStmtNode *w = checked_cast(p); diff --git a/js2/src/parser.h b/js2/src/parser.h index d15c3b6f17ac..411076794e92 100644 --- a/js2/src/parser.h +++ b/js2/src/parser.h @@ -520,7 +520,9 @@ namespace JavaScript { struct ExprStmtNode: StmtNode { ExprNode *expr; // The expression statement's expression. May be nil for default: or return-with-no-expression statements. +#ifdef DIKDIK uint32 label; // Used for case statements' code generation +#endif ExprStmtNode(size_t pos, Kind kind, ExprNode *expr): StmtNode(pos, kind), expr(expr) {}