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. |
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 |
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 } |