private Node CreateLoop(Node.Jump loop, int loopType, Node body, Node cond, Node init, Node incr) { Node bodyTarget = Node.newTarget (); Node condTarget = Node.newTarget (); if (loopType == LOOP_FOR && cond.Type == Token.EMPTY) { cond = new Node (Token.TRUE); } Node.Jump IFEQ = new Node.Jump (Token.IFEQ, cond); IFEQ.target = bodyTarget; Node breakTarget = Node.newTarget (); loop.addChildToBack (bodyTarget); loop.addChildrenToBack (body); if (loopType == LOOP_WHILE || loopType == LOOP_FOR) { // propagate lineno to condition loop.addChildrenToBack (new Node (Token.EMPTY, loop.Lineno)); } loop.addChildToBack (condTarget); loop.addChildToBack (IFEQ); loop.addChildToBack (breakTarget); loop.target = breakTarget; Node continueTarget = condTarget; if (loopType == LOOP_WHILE || loopType == LOOP_FOR) { // Just add a GOTO to the condition in the do..while loop.addChildToFront (makeJump (Token.GOTO, condTarget)); if (loopType == LOOP_FOR) { if (init.Type != Token.EMPTY) { if (init.Type != Token.VAR) { init = new Node (Token.EXPR_VOID, init); } loop.addChildToFront (init); } Node incrTarget = Node.newTarget (); loop.addChildAfter (incrTarget, body); if (incr.Type != Token.EMPTY) { incr = new Node (Token.EXPR_VOID, incr); loop.addChildAfter (incr, incrTarget); } continueTarget = incrTarget; } } loop.Continue = continueTarget; return loop; }
/// <summary> If statement</summary> internal Node CreateIf(Node cond, Node ifTrue, Node ifFalse, int lineno) { int condStatus = isAlwaysDefinedBoolean (cond); if (condStatus == ALWAYS_TRUE_BOOLEAN) { return ifTrue; } else if (condStatus == ALWAYS_FALSE_BOOLEAN) { if (ifFalse != null) { return ifFalse; } return new Node (Token.BLOCK, lineno); } Node result = new Node (Token.BLOCK, lineno); Node ifNotTarget = Node.newTarget (); Node.Jump IFNE = new Node.Jump (Token.IFNE, cond); IFNE.target = ifNotTarget; result.addChildToBack (IFNE); result.addChildrenToBack (ifTrue); if (ifFalse != null) { Node endTarget = Node.newTarget (); result.addChildToBack (makeJump (Token.GOTO, endTarget)); result.addChildToBack (ifNotTarget); result.addChildrenToBack (ifFalse); result.addChildToBack (endTarget); } else { result.addChildToBack (ifNotTarget); } return result; }
/// <summary> Throw, Return, Label, Break and Continue are defined in ASTFactory.</summary> /// <summary> With</summary> internal Node CreateWith(Node obj, Node body, int lineno) { setRequiresActivation (); Node result = new Node (Token.BLOCK, lineno); result.addChildToBack (new Node (Token.ENTERWITH, obj)); Node bodyNode = new Node (Token.WITH, body, lineno); result.addChildrenToBack (bodyNode); result.addChildToBack (new Node (Token.LEAVEWITH)); return result; }