Changeset 46598 in webkit for trunk/JavaScriptCore/parser/Nodes.cpp
- Timestamp:
- Jul 30, 2009, 1:57:44 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/parser/Nodes.cpp
r45904 r46598 356 356 int identifierStart = divot() - startOffset(); 357 357 generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(), 0); 358 generator.emitResolve Function(thisRegister.get(), func.get(), m_ident);358 generator.emitResolveWithBase(thisRegister.get(), func.get(), m_ident); 359 359 return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args, divot(), startOffset(), endOffset()); 360 360 } … … 376 376 RegisterID* FunctionCallDotNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 377 377 { 378 RefPtr<RegisterID> base = generator.emitNode(m_base); 378 RefPtr<RegisterID> function = generator.tempDestination(dst); 379 RefPtr<RegisterID> thisRegister = generator.newTemporary(); 380 generator.emitNode(thisRegister.get(), m_base); 379 381 generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); 380 382 generator.emitMethodCheck(); 381 RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); 382 RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(), base.get()); 383 generator.emitGetById(function.get(), thisRegister.get(), m_ident); 383 384 return generator.emitCall(generator.finalDestination(dst, function.get()), function.get(), thisRegister.get(), m_args, divot(), startOffset(), endOffset()); 384 385 } … … 1374 1375 RegisterID* ForNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1375 1376 { 1376 if (dst == generator.ignoredResult())1377 dst = 0;1378 1379 1377 RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Loop); 1380 1378 … … 1564 1562 if (clauseExpression->isNumber()) { 1565 1563 double value = static_cast<NumberNode*>(clauseExpression)->value(); 1566 JSValue jsValue = JSValue::makeInt32Fast(static_cast<int32_t>(value));1567 if ((typeForTable & ~SwitchNumber) || !jsValue || (jsValue.getInt32Fast()!= value)) {1564 int32_t intVal = static_cast<int32_t>(value); 1565 if ((typeForTable & ~SwitchNumber) || (intVal != value)) { 1568 1566 typeForTable = SwitchNeither; 1569 1567 break; 1570 1568 } 1571 int32_t intVal = static_cast<int32_t>(value);1572 ASSERT(intVal == value);1573 1569 if (intVal < min_num) 1574 1570 min_num = intVal; … … 1741 1737 RegisterID* TryNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1742 1738 { 1739 // NOTE: The catch and finally blocks must be labeled explicitly, so the 1740 // optimizer knows they may be jumped to from anywhere. 1741 1743 1742 generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); 1744 1743 1745 1744 RefPtr<Label> tryStartLabel = generator.newLabel(); 1746 RefPtr<Label> tryEndLabel = generator.newLabel();1747 1745 RefPtr<Label> finallyStart; 1748 1746 RefPtr<RegisterID> finallyReturnAddr; … … 1752 1750 generator.pushFinallyContext(finallyStart.get(), finallyReturnAddr.get()); 1753 1751 } 1752 1754 1753 generator.emitLabel(tryStartLabel.get()); 1755 1754 generator.emitNode(dst, m_tryBlock); 1756 generator.emitLabel(tryEndLabel.get());1757 1755 1758 1756 if (m_catchBlock) { 1759 RefPtr<Label> handlerEndLabel = generator.newLabel(); 1760 generator.emitJump(handlerEndLabel.get()); 1761 RefPtr<RegisterID> exceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), tryEndLabel.get()); 1757 RefPtr<Label> catchEndLabel = generator.newLabel(); 1758 1759 // Normal path: jump over the catch block. 1760 generator.emitJump(catchEndLabel.get()); 1761 1762 // Uncaught exception path: the catch block. 1763 RefPtr<Label> here = generator.emitLabel(generator.newLabel().get()); 1764 RefPtr<RegisterID> exceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), here.get()); 1762 1765 if (m_catchHasEval) { 1763 1766 RefPtr<RegisterID> dynamicScopeObject = generator.emitNewObject(generator.newTemporary()); … … 1769 1772 generator.emitNode(dst, m_catchBlock); 1770 1773 generator.emitPopScope(); 1771 generator.emitLabel( handlerEndLabel.get());1774 generator.emitLabel(catchEndLabel.get()); 1772 1775 } 1773 1776 … … 1780 1783 RefPtr<RegisterID> highestUsedRegister = generator.highestUsedRegister(); 1781 1784 RefPtr<Label> finallyEndLabel = generator.newLabel(); 1785 1786 // Normal path: invoke the finally block, then jump over it. 1782 1787 generator.emitJumpSubroutine(finallyReturnAddr.get(), finallyStart.get()); 1783 // Use a label to record the subtle fact that sret will return to the1784 // next instruction. sret is the only way to jump without an explicit label.1785 generator.emitLabel(generator.newLabel().get());1786 1788 generator.emitJump(finallyEndLabel.get()); 1787 1789 1788 // Finally block for exception path 1789 RefPtr<RegisterID> tempExceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), generator.emitLabel(generator.newLabel().get()).get()); 1790 // Uncaught exception path: invoke the finally block, then re-throw the exception. 1791 RefPtr<Label> here = generator.emitLabel(generator.newLabel().get()); 1792 RefPtr<RegisterID> tempExceptionRegister = generator.emitCatch(generator.newTemporary(), tryStartLabel.get(), here.get()); 1790 1793 generator.emitJumpSubroutine(finallyReturnAddr.get(), finallyStart.get()); 1791 // Use a label to record the subtle fact that sret will return to the1792 // next instruction. sret is the only way to jump without an explicit label.1793 generator.emitLabel(generator.newLabel().get());1794 1794 generator.emitThrow(tempExceptionRegister.get()); 1795 1795 1796 // emit the finally block itself1796 // The finally block. 1797 1797 generator.emitLabel(finallyStart.get()); 1798 1798 generator.emitNode(dst, m_finallyBlock);
Note:
See TracChangeset
for help on using the changeset viewer.