< prev index next >

src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java

Print this page




 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) {


< prev index next >