Changeset 163960 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Feb 12, 2014, 9:14:23 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r163844 r163960 536 536 RefPtr<RegisterID> base = generator.emitNode(m_base); 537 537 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 538 RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident);538 RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), generator.propertyNames().call); 539 539 RefPtr<RegisterID> returnValue = generator.finalDestination(dst, function.get()); 540 generator.emitJumpIfNotFunctionCall(function.get(), realCall.get()); 540 bool emitCallCheck = !generator.isBuiltinFunction(); 541 if (emitCallCheck) 542 generator.emitJumpIfNotFunctionCall(function.get(), realCall.get()); 543 541 544 { 542 545 if (m_args->m_listNode && m_args->m_listNode->m_expr) { … … 548 551 generator.emitNode(callArguments.thisRegister(), oldList->m_expr); 549 552 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 550 generator.emitJump(end.get());551 552 553 m_args->m_listNode = oldList; 553 554 } else { … … 556 557 generator.emitLoad(callArguments.thisRegister(), jsUndefined()); 557 558 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 558 generator.emitJump(end.get()); 559 } 560 } 561 generator.emitLabel(realCall.get()); 562 { 563 CallArguments callArguments(generator, m_args); 564 generator.emitMove(callArguments.thisRegister(), base.get()); 565 generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 566 } 567 generator.emitLabel(end.get()); 559 } 560 } 561 if (emitCallCheck) { 562 generator.emitJump(end.get()); 563 generator.emitLabel(realCall.get()); 564 { 565 CallArguments callArguments(generator, m_args); 566 generator.emitMove(callArguments.thisRegister(), base.get()); 567 generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 568 } 569 generator.emitLabel(end.get()); 570 } 568 571 return returnValue.get(); 569 572 } … … 586 589 RefPtr<RegisterID> base = generator.emitNode(m_base); 587 590 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 588 RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident);591 RefPtr<RegisterID> function; 589 592 RefPtr<RegisterID> returnValue = generator.finalDestination(dst, function.get()); 590 generator.emitJumpIfNotFunctionApply(function.get(), realCall.get()); 591 { 592 if (mayBeCall) { 593 if (m_args->m_listNode && m_args->m_listNode->m_expr) { 594 ArgumentListNode* oldList = m_args->m_listNode; 595 if (m_args->m_listNode->m_next) { 596 ASSERT(m_args->m_listNode->m_next->m_expr->isSimpleArray()); 597 ASSERT(!m_args->m_listNode->m_next->m_next); 598 m_args->m_listNode = static_cast<ArrayNode*>(m_args->m_listNode->m_next->m_expr)->toArgumentList(generator.vm(), 0, 0); 599 RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get()); 600 CallArguments callArguments(generator, m_args); 601 generator.emitNode(callArguments.thisRegister(), oldList->m_expr); 602 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 603 } else { 604 m_args->m_listNode = m_args->m_listNode->m_next; 605 RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get()); 606 CallArguments callArguments(generator, m_args); 607 generator.emitNode(callArguments.thisRegister(), oldList->m_expr); 608 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 609 } 610 m_args->m_listNode = oldList; 611 } else { 593 bool emitCallCheck = !generator.isBuiltinFunction(); 594 if (emitCallCheck) { 595 function = generator.emitGetById(generator.tempDestination(dst), base.get(), generator.propertyNames().apply); 596 generator.emitJumpIfNotFunctionApply(function.get(), realCall.get()); 597 } 598 if (mayBeCall) { 599 if (m_args->m_listNode && m_args->m_listNode->m_expr) { 600 ArgumentListNode* oldList = m_args->m_listNode; 601 if (m_args->m_listNode->m_next) { 602 ASSERT(m_args->m_listNode->m_next->m_expr->isSimpleArray()); 603 ASSERT(!m_args->m_listNode->m_next->m_next); 604 m_args->m_listNode = static_cast<ArrayNode*>(m_args->m_listNode->m_next->m_expr)->toArgumentList(generator.vm(), 0, 0); 612 605 RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get()); 613 606 CallArguments callArguments(generator, m_args); 614 generator.emitLoad(callArguments.thisRegister(), jsUndefined()); 607 generator.emitNode(callArguments.thisRegister(), oldList->m_expr); 608 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 609 } else { 610 m_args->m_listNode = m_args->m_listNode->m_next; 611 RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get()); 612 CallArguments callArguments(generator, m_args); 613 generator.emitNode(callArguments.thisRegister(), oldList->m_expr); 615 614 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 616 615 } 616 m_args->m_listNode = oldList; 617 617 } else { 618 ASSERT(m_args->m_listNode && m_args->m_listNode->m_next);619 RefPtr<RegisterID> profileHookRegister;620 if (generator.shouldEmitProfileHooks())621 profileHookRegister = generator.newTemporary();622 618 RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get()); 623 RefPtr<RegisterID> thisRegister = generator.emitNode(m_args->m_listNode->m_expr); 624 RefPtr<RegisterID> argsRegister; 625 ArgumentListNode* args = m_args->m_listNode->m_next; 626 if (args->m_expr->isResolveNode() && generator.willResolveToArguments(static_cast<ResolveNode*>(args->m_expr)->identifier())) 627 argsRegister = generator.uncheckedRegisterForArguments(); 628 else 629 argsRegister = generator.emitNode(args->m_expr); 630 631 // Function.prototype.apply ignores extra arguments, but we still 632 // need to evaluate them for side effects. 633 while ((args = args->m_next)) 634 generator.emitNode(args->m_expr); 635 636 generator.emitCallVarargs(returnValue.get(), realFunction.get(), thisRegister.get(), argsRegister.get(), generator.newTemporary(), profileHookRegister.get(), divot(), divotStart(), divotEnd()); 637 } 619 CallArguments callArguments(generator, m_args); 620 generator.emitLoad(callArguments.thisRegister(), jsUndefined()); 621 generator.emitCall(returnValue.get(), realFunction.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 622 } 623 } else { 624 ASSERT(m_args->m_listNode && m_args->m_listNode->m_next); 625 RefPtr<RegisterID> profileHookRegister; 626 if (generator.shouldEmitProfileHooks()) 627 profileHookRegister = generator.newTemporary(); 628 RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get()); 629 RefPtr<RegisterID> thisRegister = generator.emitNode(m_args->m_listNode->m_expr); 630 RefPtr<RegisterID> argsRegister; 631 ArgumentListNode* args = m_args->m_listNode->m_next; 632 if (args->m_expr->isResolveNode() && generator.willResolveToArguments(static_cast<ResolveNode*>(args->m_expr)->identifier())) 633 argsRegister = generator.uncheckedRegisterForArguments(); 634 else 635 argsRegister = generator.emitNode(args->m_expr); 636 637 // Function.prototype.apply ignores extra arguments, but we still 638 // need to evaluate them for side effects. 639 while ((args = args->m_next)) 640 generator.emitNode(args->m_expr); 641 642 generator.emitCallVarargs(returnValue.get(), realFunction.get(), thisRegister.get(), argsRegister.get(), generator.newTemporary(), profileHookRegister.get(), divot(), divotStart(), divotEnd()); 643 } 644 if (emitCallCheck) { 638 645 generator.emitJump(end.get()); 639 } 640 generator.emitLabel(realCall.get()); 641 { 646 generator.emitLabel(realCall.get()); 642 647 CallArguments callArguments(generator, m_args); 643 648 generator.emitMove(callArguments.thisRegister(), base.get()); 644 649 generator.emitCall(returnValue.get(), function.get(), NoExpectedFunction, callArguments, divot(), divotStart(), divotEnd()); 645 }646 generator.emitLabel(end.get());650 generator.emitLabel(end.get()); 651 } 647 652 return returnValue.get(); 648 653 }
Note:
See TracChangeset
for help on using the changeset viewer.