nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CodeGenerator.java
changeset 32048 8023426b93ab
parent 31549 b627094c5649
child 32049 af8f6292d54d
equal deleted inserted replaced
31945:eeea9adfd1e3 32048:8023426b93ab
  1478                         method.loadUndefined(Type.OBJECT); //the 'this'
  1478                         method.loadUndefined(Type.OBJECT); //the 'this'
  1479                         argsCount = loadArgs(args);
  1479                         argsCount = loadArgs(args);
  1480                     }
  1480                     }
  1481                     @Override
  1481                     @Override
  1482                     void consumeStack() {
  1482                     void consumeStack() {
  1483                         dynamicCall(2 + argsCount, flags);
  1483                         dynamicCall(2 + argsCount, flags, ident.getName());
  1484                     }
  1484                     }
  1485                 }.emit();
  1485                 }.emit();
  1486             }
  1486             }
  1487 
  1487 
  1488             private void evalCall(final IdentNode ident, final int flags) {
  1488             private void evalCall(final IdentNode ident, final int flags) {
  1536                     }
  1536                     }
  1537 
  1537 
  1538                     @Override
  1538                     @Override
  1539                     void consumeStack() {
  1539                     void consumeStack() {
  1540                         // Ordinary call
  1540                         // Ordinary call
  1541                         dynamicCall(2 + argsCount, flags);
  1541                         dynamicCall(2 + argsCount, flags, "eval");
  1542                         method._goto(eval_done);
  1542                         method._goto(eval_done);
  1543 
  1543 
  1544                         method.label(invoke_direct_eval);
  1544                         method.label(invoke_direct_eval);
  1545                         // Special/extra 'eval' arguments. These can be loaded late (in consumeStack) as we know none of
  1545                         // Special/extra 'eval' arguments. These can be loaded late (in consumeStack) as we know none of
  1546                         // them can ever be optimistic.
  1546                         // them can ever be optimistic.
  1608                         method.swap();
  1608                         method.swap();
  1609                         argCount = loadArgs(args);
  1609                         argCount = loadArgs(args);
  1610                     }
  1610                     }
  1611                     @Override
  1611                     @Override
  1612                     void consumeStack() {
  1612                     void consumeStack() {
  1613                         dynamicCall(2 + argCount, flags);
  1613                         dynamicCall(2 + argCount, flags, node.getProperty());
  1614                     }
  1614                     }
  1615                 }.emit();
  1615                 }.emit();
  1616 
  1616 
  1617                 return false;
  1617                 return false;
  1618             }
  1618             }
  1635 
  1635 
  1636                     @Override
  1636                     @Override
  1637                     void consumeStack() {
  1637                     void consumeStack() {
  1638                         final int flags = getCallSiteFlags();
  1638                         final int flags = getCallSiteFlags();
  1639                         //assert callNodeType.equals(callee.getReturnType()) : callNodeType + " != " + callee.getReturnType();
  1639                         //assert callNodeType.equals(callee.getReturnType()) : callNodeType + " != " + callee.getReturnType();
  1640                         dynamicCall(2 + argsCount, flags);
  1640                         dynamicCall(2 + argsCount, flags, origCallee.getName());
  1641                     }
  1641                     }
  1642                 }.emit();
  1642                 }.emit();
  1643                 return false;
  1643                 return false;
  1644             }
  1644             }
  1645 
  1645 
  1665                         argsCount = loadArgs(args);
  1665                         argsCount = loadArgs(args);
  1666                     }
  1666                     }
  1667                     @Override
  1667                     @Override
  1668                     void consumeStack() {
  1668                     void consumeStack() {
  1669                         final int flags = getCallSiteFlags();
  1669                         final int flags = getCallSiteFlags();
  1670                         dynamicCall(2 + argsCount, flags);
  1670                         dynamicCall(2 + argsCount, flags, null);
  1671                     }
  1671                     }
  1672                 }.emit();
  1672                 }.emit();
  1673                 return false;
  1673                 return false;
  1674             }
  1674             }
  1675 
  1675 
  1685                         argsCount = loadArgs(args);
  1685                         argsCount = loadArgs(args);
  1686                         }
  1686                         }
  1687                         @Override
  1687                         @Override
  1688                         void consumeStack() {
  1688                         void consumeStack() {
  1689                             final int flags = getCallSiteFlags() | CALLSITE_SCOPE;
  1689                             final int flags = getCallSiteFlags() | CALLSITE_SCOPE;
  1690                             dynamicCall(2 + argsCount, flags);
  1690                             dynamicCall(2 + argsCount, flags, null);
  1691                         }
  1691                         }
  1692                 }.emit();
  1692                 }.emit();
  1693                 return false;
  1693                 return false;
  1694             }
  1694             }
  1695         });
  1695         });
  3705 
  3705 
  3706     private void loadNEW(final UnaryNode unaryNode) {
  3706     private void loadNEW(final UnaryNode unaryNode) {
  3707         final CallNode callNode = (CallNode)unaryNode.getExpression();
  3707         final CallNode callNode = (CallNode)unaryNode.getExpression();
  3708         final List<Expression> args   = callNode.getArgs();
  3708         final List<Expression> args   = callNode.getArgs();
  3709 
  3709 
       
  3710         final Expression func = callNode.getFunction();
  3710         // Load function reference.
  3711         // Load function reference.
  3711         loadExpressionAsObject(callNode.getFunction()); // must detect type error
  3712         loadExpressionAsObject(func); // must detect type error
  3712 
  3713 
  3713         method.dynamicNew(1 + loadArgs(args), getCallSiteFlags());
  3714         method.dynamicNew(1 + loadArgs(args), getCallSiteFlags(),
       
  3715             func instanceof IdentNode? ((IdentNode)func).getName() : null);
  3714     }
  3716     }
  3715 
  3717 
  3716     private void loadNOT(final UnaryNode unaryNode) {
  3718     private void loadNOT(final UnaryNode unaryNode) {
  3717         final Expression expr = unaryNode.getExpression();
  3719         final Expression expr = unaryNode.getExpression();
  3718         if(expr instanceof UnaryNode && expr.isTokenType(TokenType.NOT)) {
  3720         if(expr instanceof UnaryNode && expr.isTokenType(TokenType.NOT)) {
  4816                 return method.dynamicGetIndex(getOptimisticCoercedType(), getOptimisticFlags(flags), isMethod);
  4818                 return method.dynamicGetIndex(getOptimisticCoercedType(), getOptimisticFlags(flags), isMethod);
  4817             }
  4819             }
  4818             return method.dynamicGetIndex(resultBounds.within(expression.getType()), nonOptimisticFlags(flags), isMethod);
  4820             return method.dynamicGetIndex(resultBounds.within(expression.getType()), nonOptimisticFlags(flags), isMethod);
  4819         }
  4821         }
  4820 
  4822 
  4821         MethodEmitter dynamicCall(final int argCount, final int flags) {
  4823         MethodEmitter dynamicCall(final int argCount, final int flags, final String msg) {
  4822             if (isOptimistic) {
  4824             if (isOptimistic) {
  4823                 return method.dynamicCall(getOptimisticCoercedType(), argCount, getOptimisticFlags(flags));
  4825                 return method.dynamicCall(getOptimisticCoercedType(), argCount, getOptimisticFlags(flags), msg);
  4824             }
  4826             }
  4825             return method.dynamicCall(resultBounds.within(expression.getType()), argCount, nonOptimisticFlags(flags));
  4827             return method.dynamicCall(resultBounds.within(expression.getType()), argCount, nonOptimisticFlags(flags), msg);
  4826         }
  4828         }
  4827 
  4829 
  4828         int getOptimisticFlags(final int flags) {
  4830         int getOptimisticFlags(final int flags) {
  4829             return flags | CALLSITE_OPTIMISTIC | (optimistic.getProgramPoint() << CALLSITE_PROGRAM_POINT_SHIFT); //encode program point in high bits
  4831             return flags | CALLSITE_OPTIMISTIC | (optimistic.getProgramPoint() << CALLSITE_PROGRAM_POINT_SHIFT); //encode program point in high bits
  4830         }
  4832         }