578 expr.accept(this);
579 assert typeStack.size() == stackSize + 1;
580 return typeStack.pop();
581 }
582
583 private void visitExpressions(final List<Expression> exprs) {
584 for(final Expression expr: exprs) {
585 if (expr != null) {
586 visitExpression(expr);
587 }
588 }
589 }
590
591 @Override
592 public boolean enterForNode(final ForNode forNode) {
593 if(!reachable) {
594 return false;
595 }
596
597 final Expression init = forNode.getInit();
598 if(forNode.isForIn()) {
599 final JoinPredecessorExpression iterable = forNode.getModify();
600 visitExpression(iterable);
601 enterTestFirstLoop(forNode, null, init,
602 // If we're iterating over property names, and we can discern from the runtime environment
603 // of the compilation that the object being iterated over must use strings for property
604 // names (e.g., it is a native JS object or array), then we'll not bother trying to treat
605 // the property names optimistically.
606 !compiler.useOptimisticTypes() || (!forNode.isForEach() && compiler.hasStringPropertyIterator(iterable.getExpression())));
607 } else {
608 if(init != null) {
609 visitExpressionOnEmptyStack(init);
610 }
611 enterTestFirstLoop(forNode, forNode.getModify(), null, false);
612 }
613 assertTypeStackIsEmpty();
614 return false;
615 }
616
617 @Override
618 public boolean enterFunctionNode(final FunctionNode functionNode) {
|
578 expr.accept(this);
579 assert typeStack.size() == stackSize + 1;
580 return typeStack.pop();
581 }
582
583 private void visitExpressions(final List<Expression> exprs) {
584 for(final Expression expr: exprs) {
585 if (expr != null) {
586 visitExpression(expr);
587 }
588 }
589 }
590
591 @Override
592 public boolean enterForNode(final ForNode forNode) {
593 if(!reachable) {
594 return false;
595 }
596
597 final Expression init = forNode.getInit();
598 if(forNode.isForInOrOf()) {
599 final JoinPredecessorExpression iterable = forNode.getModify();
600 visitExpression(iterable);
601 enterTestFirstLoop(forNode, null, init,
602 // If we're iterating over property names, and we can discern from the runtime environment
603 // of the compilation that the object being iterated over must use strings for property
604 // names (e.g., it is a native JS object or array), then we'll not bother trying to treat
605 // the property names optimistically.
606 !compiler.useOptimisticTypes() || (!forNode.isForEach() && compiler.hasStringPropertyIterator(iterable.getExpression())));
607 } else {
608 if(init != null) {
609 visitExpressionOnEmptyStack(init);
610 }
611 enterTestFirstLoop(forNode, forNode.getModify(), null, false);
612 }
613 assertTypeStackIsEmpty();
614 return false;
615 }
616
617 @Override
618 public boolean enterFunctionNode(final FunctionNode functionNode) {
|