Changeset 43642 in webkit for trunk/JavaScriptCore/parser/Nodes.cpp
- Timestamp:
- May 13, 2009, 11:14:48 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/parser/Nodes.cpp
r43619 r43642 50 50 namespace JSC { 51 51 52 static void substitute(UString& string, const UString& substring) JSC_FAST_CALL; 52 /* 53 Details of the emitBytecode function. 54 55 Return value: The register holding the production's value. 56 dst: An optional parameter specifying the most efficient destination at 57 which to store the production's value. The callee must honor dst. 58 59 The dst argument provides for a crude form of copy propagation. For example, 60 61 x = 1 62 63 becomes 64 65 load r[x], 1 66 67 instead of 68 69 load r0, 1 70 mov r[x], r0 71 72 because the assignment node, "x =", passes r[x] as dst to the number node, "1". 73 */ 53 74 54 75 // ------------------------------ ThrowableExpressionData -------------------------------- … … 64 85 } 65 86 66 RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType e, const char* msg)87 RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType type, const char* message) 67 88 { 68 89 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 69 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalData(), msg));90 RegisterID* exception = generator.emitNewError(generator.newTemporary(), type, jsString(generator.globalData(), message)); 70 91 generator.emitThrow(exception); 71 92 return exception; 72 93 } 73 94 74 RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType e, const char* msg, const Identifier& label)75 { 76 UString message = m sg;77 substitute(message, label .ustring());95 RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType type, const char* messageTemplate, const UString& label) 96 { 97 UString message = messageTemplate; 98 substitute(message, label); 78 99 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 79 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalData(), message));100 RegisterID* exception = generator.emitNewError(generator.newTemporary(), type, jsString(generator.globalData(), message)); 80 101 generator.emitThrow(exception); 81 102 return exception; 103 } 104 105 inline RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType type, const char* messageTemplate, const Identifier& label) 106 { 107 return emitThrowError(generator, type, messageTemplate, label.ustring()); 82 108 } 83 109 … … 99 125 } 100 126 127 inline StatementNode* SourceElements::singleStatement() const 128 { 129 size_t size = m_statements.size(); 130 return size == 1 ? m_statements[0] : 0; 131 } 132 133 inline StatementNode* SourceElements::lastStatement() const 134 { 135 size_t size = m_statements.size(); 136 return size ? m_statements[size - 1] : 0; 137 } 138 101 139 // ------------------------------ NullNode ------------------------------------- 102 140 … … 139 177 RegisterID* RegExpNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 140 178 { 141 RefPtr<RegExp> regExp = RegExp::create(generator.globalData(), m_pattern , m_flags);179 RefPtr<RegExp> regExp = RegExp::create(generator.globalData(), m_pattern.ustring(), m_flags.ustring()); 142 180 if (!regExp->isValid()) 143 return emitThrowError(generator, SyntaxError, ("Invalid regular expression: " + UString(regExp->errorMessage())).UTF8String().c_str());181 return emitThrowError(generator, SyntaxError, "Invalid regular expression: %s", regExp->errorMessage()); 144 182 if (dst == generator.ignoredResult()) 145 183 return 0; … … 593 631 RegisterID* PostfixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 594 632 { 595 return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus ? "Postfix ++ operator applied to value that is not a reference." : "Postfix -- operator applied to value that is not a reference."); 633 return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus 634 ? "Postfix ++ operator applied to value that is not a reference." 635 : "Postfix -- operator applied to value that is not a reference."); 596 636 } 597 637 … … 755 795 RegisterID* PrefixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 756 796 { 757 return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus ? "Prefix ++ operator applied to value that is not a reference." : "Prefix -- operator applied to value that is not a reference."); 797 return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus 798 ? "Prefix ++ operator applied to value that is not a reference." 799 : "Prefix -- operator applied to value that is not a reference."); 758 800 } 759 801 … … 1225 1267 } 1226 1268 1227 // ------------------------------ Helper functions for handling Vectors of StatementNode-------------------------------1228 1229 static inline void statementListEmitCode(const StatementVector& statements,BytecodeGenerator& generator, RegisterID* dst)1230 { 1231 size_t size = statements.size();1269 // ------------------------------ SourceElements ------------------------------- 1270 1271 inline void SourceElements::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1272 { 1273 size_t size = m_statements.size(); 1232 1274 for (size_t i = 0; i < size; ++i) 1233 generator.emitNode(dst, statements[i]);1275 generator.emitNode(dst, m_statements[i]); 1234 1276 } 1235 1277 1236 1278 // ------------------------------ BlockNode ------------------------------------ 1237 1279 1280 inline StatementNode* BlockNode::lastStatement() const 1281 { 1282 return m_statements ? m_statements->lastStatement() : 0; 1283 } 1284 1238 1285 RegisterID* BlockNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1239 1286 { 1240 statementListEmitCode(m_children, generator, dst); 1287 if (m_statements) 1288 m_statements->emitBytecode(generator, dst); 1241 1289 return 0; 1242 1290 } … … 1541 1589 generator.emitPopScope(); 1542 1590 return result; 1591 } 1592 1593 // ------------------------------ CaseClauseNode -------------------------------- 1594 1595 inline void CaseClauseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1596 { 1597 if (m_statements) 1598 m_statements->emitBytecode(generator, dst); 1543 1599 } 1544 1600 … … 1664 1720 for (ClauseListNode* list = m_list1; list; list = list->getNext()) { 1665 1721 generator.emitLabel(labelVector[i++].get()); 1666 statementListEmitCode(list->getClause()->children(),generator, dst);1722 list->getClause()->emitBytecode(generator, dst); 1667 1723 } 1668 1724 1669 1725 if (m_defaultClause) { 1670 1726 generator.emitLabel(defaultLabel.get()); 1671 statementListEmitCode(m_defaultClause->children(),generator, dst);1727 m_defaultClause->emitBytecode(generator, dst); 1672 1728 } 1673 1729 1674 1730 for (ClauseListNode* list = m_list2; list; list = list->getNext()) { 1675 1731 generator.emitLabel(labelVector[i++].get()); 1676 statementListEmitCode(list->getClause()->children(),generator, dst);1732 list->getClause()->emitBytecode(generator, dst); 1677 1733 } 1678 1734 if (!m_defaultClause) … … 1802 1858 // -----------------------------ScopeNodeData --------------------------- 1803 1859 1804 ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, int numConstants)1860 ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* statements, VarStack* varStack, FunctionStack* funcStack, int numConstants) 1805 1861 : m_numConstants(numConstants) 1862 , m_statements(statements) 1806 1863 { 1807 1864 m_arena.swap(arena); … … 1810 1867 if (funcStack) 1811 1868 m_functionStack.swap(*funcStack); 1812 if (children)1813 children->releaseContentsIntoVector(m_children);1814 1869 } 1815 1870 … … 1851 1906 } 1852 1907 1908 inline void ScopeNode::emitStatementsBytecode(BytecodeGenerator& generator, RegisterID* dst) 1909 { 1910 if (m_data->m_statements) 1911 m_data->m_statements->emitBytecode(generator, dst); 1912 } 1913 1914 inline StatementNode* ScopeNode::singleStatement() const 1915 { 1916 return m_data->m_statements ? m_data->m_statements->singleStatement() : 0; 1917 } 1918 1853 1919 // ------------------------------ ProgramNode ----------------------------- 1854 1920 … … 1875 1941 RefPtr<RegisterID> dstRegister = generator.newTemporary(); 1876 1942 generator.emitLoad(dstRegister.get(), jsUndefined()); 1877 statementListEmitCode(children(),generator, dstRegister.get());1943 emitStatementsBytecode(generator, dstRegister.get()); 1878 1944 1879 1945 generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine()); … … 1919 1985 RefPtr<RegisterID> dstRegister = generator.newTemporary(); 1920 1986 generator.emitLoad(dstRegister.get(), jsUndefined()); 1921 statementListEmitCode(children(),generator, dstRegister.get());1987 emitStatementsBytecode(generator, dstRegister.get()); 1922 1988 1923 1989 generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine()); … … 1937 2003 1938 2004 // Eval code needs to hang on to its declaration stacks to keep declaration info alive until Interpreter::execute time, 1939 // so the entire ScopeNodeData cannot be destoyed. 1940 children().clear(); 2005 // so the ScopeNodeData cannot be destroyed at this point. Maybe we can destroy part of it in the future? 1941 2006 } 1942 2007 … … 2092 2157 { 2093 2158 generator.emitDebugHook(DidEnterCallFrame, firstLine(), lastLine()); 2094 statementListEmitCode(children(), generator, generator.ignoredResult()); 2095 if (children().size() && children().last()->isBlock()) { 2096 BlockNode* blockNode = static_cast<BlockNode*>(children().last()); 2097 if (blockNode->children().size() && blockNode->children().last()->isReturnNode()) 2159 emitStatementsBytecode(generator, generator.ignoredResult()); 2160 StatementNode* singleStatement = this->singleStatement(); 2161 if (singleStatement && singleStatement->isBlock()) { 2162 StatementNode* lastStatementInBlock = static_cast<BlockNode*>(singleStatement)->lastStatement(); 2163 if (lastStatementInBlock && lastStatementInBlock->isReturnNode()) 2098 2164 return 0; 2099 2165 }
Note:
See TracChangeset
for help on using the changeset viewer.