Changeset 164630 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Feb 24, 2014, 10:59:38 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r163960 r164630 530 530 } 531 531 532 static RegisterID* getArgumentByVal(BytecodeGenerator& generator, ExpressionNode* base, RegisterID* property, RegisterID* dst, JSTextPosition divot, JSTextPosition divotStart, JSTextPosition divotEnd) 533 { 534 if (base->isResolveNode() 535 && generator.willResolveToArguments(static_cast<ResolveNode*>(base)->identifier()) 536 && !generator.symbolTable().slowArguments()) { 537 generator.emitExpressionInfo(divot, divotStart, divotEnd); 538 return generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), property); 539 } 540 return nullptr; 541 } 542 532 543 RegisterID* CallFunctionCallDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 533 544 { … … 536 547 RefPtr<RegisterID> base = generator.emitNode(m_base); 537 548 generator.emitExpressionInfo(subexpressionDivot(), subexpressionStart(), subexpressionEnd()); 538 RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), generator.propertyNames().call); 539 RefPtr<RegisterID> returnValue = generator.finalDestination(dst, function.get()); 549 RefPtr<RegisterID> function; 540 550 bool emitCallCheck = !generator.isBuiltinFunction(); 541 if (emitCallCheck) 551 if (emitCallCheck) { 552 function = generator.emitGetById(generator.tempDestination(dst), base.get(), generator.propertyNames().call); 542 553 generator.emitJumpIfNotFunctionCall(function.get(), realCall.get()); 543 554 } 555 RefPtr<RegisterID> returnValue = generator.finalDestination(dst); 544 556 { 545 if (m_args->m_listNode && m_args->m_listNode->m_expr) { 557 if (m_args->m_listNode && m_args->m_listNode->m_expr && m_args->m_listNode->m_expr->isSpreadExpression()) { 558 RefPtr<RegisterID> profileHookRegister; 559 if (generator.shouldEmitProfileHooks()) 560 profileHookRegister = generator.newTemporary(); 561 SpreadExpressionNode* spread = static_cast<SpreadExpressionNode*>(m_args->m_listNode->m_expr); 562 ExpressionNode* subject = spread->expression(); 563 RefPtr<RegisterID> thisRegister = getArgumentByVal(generator, subject, generator.emitLoad(0, jsNumber(0)), 0, spread->divot(), spread->divotStart(), spread->divotEnd()); 564 RefPtr<RegisterID> argumentsRegister; 565 if (thisRegister) 566 argumentsRegister = generator.uncheckedRegisterForArguments(); 567 else { 568 argumentsRegister = generator.emitNode(subject); 569 generator.emitExpressionInfo(spread->divot(), spread->divotStart(), spread->divotEnd()); 570 thisRegister = generator.emitGetByVal(generator.newTemporary(), argumentsRegister.get(), generator.emitLoad(0, jsNumber(0))); 571 } 572 generator.emitCallVarargs(returnValue.get(), base.get(), thisRegister.get(), argumentsRegister.get(), generator.newTemporary(), 1, profileHookRegister.get(), divot(), divotStart(), divotEnd()); 573 } else if (m_args->m_listNode && m_args->m_listNode->m_expr) { 546 574 ArgumentListNode* oldList = m_args->m_listNode; 547 575 m_args->m_listNode = m_args->m_listNode->m_next; … … 630 658 RefPtr<RegisterID> argsRegister; 631 659 ArgumentListNode* args = m_args->m_listNode->m_next; 632 if (args->m_expr->isResolveNode() && generator.willResolveToArguments(static_cast<ResolveNode*>(args->m_expr)->identifier()) )660 if (args->m_expr->isResolveNode() && generator.willResolveToArguments(static_cast<ResolveNode*>(args->m_expr)->identifier()) && !generator.symbolTable().slowArguments()) 633 661 argsRegister = generator.uncheckedRegisterForArguments(); 634 662 else … … 640 668 generator.emitNode(args->m_expr); 641 669 642 generator.emitCallVarargs(returnValue.get(), realFunction.get(), thisRegister.get(), argsRegister.get(), generator.newTemporary(), profileHookRegister.get(), divot(), divotStart(), divotEnd());670 generator.emitCallVarargs(returnValue.get(), realFunction.get(), thisRegister.get(), argsRegister.get(), generator.newTemporary(), 0, profileHookRegister.get(), divot(), divotStart(), divotEnd()); 643 671 } 644 672 if (emitCallCheck) {
Note:
See TracChangeset
for help on using the changeset viewer.