private void visitArrayComprehension(Node node, Node initStmt, Node expr) { // A bit of a hack: array comprehensions are implemented using // statement nodes for the iteration, yet they appear in an // expression context. So we pass the current stack depth to // visitStatement so it can check that the depth is not altered // by statements. visitStatement(initStmt, stackDepth); visitExpression(expr, 0); }
case Token.GETELEM: { Node target = left.getFirstChild(); visitExpression(target, 0); Node id = target.getNext(); if (type == Token.GETPROP) { stackChange(1); } else { visitExpression(id, 0); visitExpression(left, 0);
visitExpression(object, 0); String property = object.getNext().getString(); addStringOp(Icode_PROP_INC_DEC, property); visitExpression(object, 0); Node index = object.getNext(); visitExpression(index, 0); addIcode(Icode_ELEM_INC_DEC); addUint8(incrDecrMask); visitExpression(ref, 0); addIcode(Icode_REF_INC_DEC); addUint8(incrDecrMask);
int childType = child.getType(); if (childType == Token.GET) { visitExpression(child.getFirstChild(), 0); addIcode(Icode_LITERAL_GETTER); } else if (childType == Token.SET) { visitExpression(child.getFirstChild(), 0); addIcode(Icode_LITERAL_SETTER); } else { visitExpression(child, 0); addIcode(Icode_LITERAL_SET);
visitExpression(child, 0); addIcode(Icode_POP); stackChange(-1); visitExpression(child, contextFlags & ECF_TAIL); visitExpression(child, 0); } else { generateCallFunAndThis(child); visitExpression(child, 0); ++argCount; visitExpression(child, 0); addIcode(Icode_DUP); stackChange(1); visitExpression(child, contextFlags & ECF_TAIL); resolveForwardGoto(afterSecondJumpStart); visitExpression(child, 0); int elseJumpStart = iCodeTop; addGotoOp(Token.IFNE); stackChange(-1); visitExpression(ifThen, contextFlags & ECF_TAIL); int afterElseJumpStart = iCodeTop; addGotoOp(Token.GOTO);
visitExpression(child, 0); addToken(Token.ENTERWITH); stackChange(-1); visitExpression(child, 0); for (Jump caseNode = (Jump)child.getNext(); caseNode != null; addIcode(Icode_DUP); stackChange(1); visitExpression(test, 0); addToken(Token.SHEQ); stackChange(-1); visitExpression(child, 0); addGoto(target, type); stackChange(-1); case Token.EXPR_RESULT: updateLineNumber(node); visitExpression(child, 0); addIcode((type == Token.EXPR_VOID) ? Icode_POP : Icode_POP_RESULT); stackChange(-1); String name = child.getString(); child = child.getNext(); visitExpression(child, 0); // load expression object addStringPrefix(name); addIndexPrefix(localIndex);