Changeset 43661 in webkit for trunk/JavaScriptCore/parser/Nodes.cpp
- Timestamp:
- May 13, 2009, 2:53:59 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/parser/Nodes.cpp
r43642 r43661 50 50 namespace JSC { 51 51 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 */ 52 static void substitute(UString& string, const UString& substring) JSC_FAST_CALL; 74 53 75 54 // ------------------------------ ThrowableExpressionData -------------------------------- … … 85 64 } 86 65 87 RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType type, const char* message)66 RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType e, const char* msg) 88 67 { 89 68 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 90 RegisterID* exception = generator.emitNewError(generator.newTemporary(), type, jsString(generator.globalData(), message));69 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalData(), msg)); 91 70 generator.emitThrow(exception); 92 71 return exception; 93 72 } 94 73 95 RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType type, const char* messageTemplate, const UString& label)96 { 97 UString message = m essageTemplate;98 substitute(message, label );74 RegisterID* ThrowableExpressionData::emitThrowError(BytecodeGenerator& generator, ErrorType e, const char* msg, const Identifier& label) 75 { 76 UString message = msg; 77 substitute(message, label.ustring()); 99 78 generator.emitExpressionInfo(divot(), startOffset(), endOffset()); 100 RegisterID* exception = generator.emitNewError(generator.newTemporary(), type, jsString(generator.globalData(), message));79 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalData(), message)); 101 80 generator.emitThrow(exception); 102 81 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());108 82 } 109 83 … … 125 99 } 126 100 127 inline StatementNode* SourceElements::singleStatement() const128 {129 size_t size = m_statements.size();130 return size == 1 ? m_statements[0] : 0;131 }132 133 inline StatementNode* SourceElements::lastStatement() const134 {135 size_t size = m_statements.size();136 return size ? m_statements[size - 1] : 0;137 }138 139 101 // ------------------------------ NullNode ------------------------------------- 140 102 … … 177 139 RegisterID* RegExpNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 178 140 { 179 RefPtr<RegExp> regExp = RegExp::create(generator.globalData(), m_pattern .ustring(), m_flags.ustring());141 RefPtr<RegExp> regExp = RegExp::create(generator.globalData(), m_pattern, m_flags); 180 142 if (!regExp->isValid()) 181 return emitThrowError(generator, SyntaxError, "Invalid regular expression: %s", regExp->errorMessage());143 return emitThrowError(generator, SyntaxError, ("Invalid regular expression: " + UString(regExp->errorMessage())).UTF8String().c_str()); 182 144 if (dst == generator.ignoredResult()) 183 145 return 0; … … 631 593 RegisterID* PostfixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 632 594 { 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."); 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."); 636 596 } 637 597 … … 795 755 RegisterID* PrefixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 796 756 { 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."); 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."); 800 758 } 801 759 … … 1267 1225 } 1268 1226 1269 // ------------------------------ SourceElements-------------------------------1270 1271 inline void SourceElements::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)1272 { 1273 size_t size = m_statements.size();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(); 1274 1232 for (size_t i = 0; i < size; ++i) 1275 generator.emitNode(dst, m_statements[i]);1233 generator.emitNode(dst, statements[i]); 1276 1234 } 1277 1235 1278 1236 // ------------------------------ BlockNode ------------------------------------ 1279 1237 1280 inline StatementNode* BlockNode::lastStatement() const1281 {1282 return m_statements ? m_statements->lastStatement() : 0;1283 }1284 1285 1238 RegisterID* BlockNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1286 1239 { 1287 if (m_statements) 1288 m_statements->emitBytecode(generator, dst); 1240 statementListEmitCode(m_children, generator, dst); 1289 1241 return 0; 1290 1242 } … … 1589 1541 generator.emitPopScope(); 1590 1542 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);1599 1543 } 1600 1544 … … 1720 1664 for (ClauseListNode* list = m_list1; list; list = list->getNext()) { 1721 1665 generator.emitLabel(labelVector[i++].get()); 1722 list->getClause()->emitBytecode(generator, dst);1666 statementListEmitCode(list->getClause()->children(), generator, dst); 1723 1667 } 1724 1668 1725 1669 if (m_defaultClause) { 1726 1670 generator.emitLabel(defaultLabel.get()); 1727 m_defaultClause->emitBytecode(generator, dst);1671 statementListEmitCode(m_defaultClause->children(), generator, dst); 1728 1672 } 1729 1673 1730 1674 for (ClauseListNode* list = m_list2; list; list = list->getNext()) { 1731 1675 generator.emitLabel(labelVector[i++].get()); 1732 list->getClause()->emitBytecode(generator, dst);1676 statementListEmitCode(list->getClause()->children(), generator, dst); 1733 1677 } 1734 1678 if (!m_defaultClause) … … 1858 1802 // -----------------------------ScopeNodeData --------------------------- 1859 1803 1860 ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* statements, VarStack* varStack, FunctionStack* funcStack, int numConstants)1804 ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, int numConstants) 1861 1805 : m_numConstants(numConstants) 1862 , m_statements(statements)1863 1806 { 1864 1807 m_arena.swap(arena); … … 1867 1810 if (funcStack) 1868 1811 m_functionStack.swap(*funcStack); 1812 if (children) 1813 children->releaseContentsIntoVector(m_children); 1869 1814 } 1870 1815 … … 1906 1851 } 1907 1852 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() const1915 {1916 return m_data->m_statements ? m_data->m_statements->singleStatement() : 0;1917 }1918 1919 1853 // ------------------------------ ProgramNode ----------------------------- 1920 1854 … … 1941 1875 RefPtr<RegisterID> dstRegister = generator.newTemporary(); 1942 1876 generator.emitLoad(dstRegister.get(), jsUndefined()); 1943 emitStatementsBytecode(generator, dstRegister.get());1877 statementListEmitCode(children(), generator, dstRegister.get()); 1944 1878 1945 1879 generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine()); … … 1985 1919 RefPtr<RegisterID> dstRegister = generator.newTemporary(); 1986 1920 generator.emitLoad(dstRegister.get(), jsUndefined()); 1987 emitStatementsBytecode(generator, dstRegister.get());1921 statementListEmitCode(children(), generator, dstRegister.get()); 1988 1922 1989 1923 generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine()); … … 2003 1937 2004 1938 // Eval code needs to hang on to its declaration stacks to keep declaration info alive until Interpreter::execute time, 2005 // so the ScopeNodeData cannot be destroyed at this point. Maybe we can destroy part of it in the future? 1939 // so the entire ScopeNodeData cannot be destoyed. 1940 children().clear(); 2006 1941 } 2007 1942 … … 2157 2092 { 2158 2093 generator.emitDebugHook(DidEnterCallFrame, firstLine(), lastLine()); 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()) 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()) 2164 2098 return 0; 2165 2099 }
Note:
See TracChangeset
for help on using the changeset viewer.