Changeset 47571 in webkit for trunk/JavaScriptCore/parser/Nodes.cpp
- Timestamp:
- Aug 20, 2009, 7:24:49 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/parser/Nodes.cpp
r47412 r47571 50 50 namespace JSC { 51 51 52 static void substitute(UString& string, const UString& substring); 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 … … 123 161 if (dst == generator.ignoredResult()) 124 162 return 0; 125 return generator.emitLoad(dst, m_ double);163 return generator.emitLoad(dst, m_value); 126 164 } 127 165 … … 141 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; … … 597 635 RegisterID* PostfixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 598 636 { 599 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."); 637 return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus 638 ? "Postfix ++ operator applied to value that is not a reference." 639 : "Postfix -- operator applied to value that is not a reference."); 600 640 } 601 641 … … 759 799 RegisterID* PrefixErrorNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) 760 800 { 761 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."); 801 return emitThrowError(generator, ReferenceError, m_operator == OpPlusPlus 802 ? "Prefix ++ operator applied to value that is not a reference." 803 : "Prefix -- operator applied to value that is not a reference."); 762 804 } 763 805 … … 1237 1279 } 1238 1280 1239 // ------------------------------ Helper functions for handling Vectors of StatementNode-------------------------------1240 1241 static inline void statementListEmitCode(const StatementVector& statements,BytecodeGenerator& generator, RegisterID* dst)1242 { 1243 size_t size = statements.size();1281 // ------------------------------ SourceElements ------------------------------- 1282 1283 inline void SourceElements::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1284 { 1285 size_t size = m_statements.size(); 1244 1286 for (size_t i = 0; i < size; ++i) 1245 generator.emitNode(dst, statements[i]);1287 generator.emitNode(dst, m_statements[i]); 1246 1288 } 1247 1289 1248 1290 // ------------------------------ BlockNode ------------------------------------ 1249 1291 1292 inline StatementNode* BlockNode::lastStatement() const 1293 { 1294 return m_statements ? m_statements->lastStatement() : 0; 1295 } 1296 1250 1297 RegisterID* BlockNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1251 1298 { 1252 statementListEmitCode(m_children, generator, dst); 1299 if (m_statements) 1300 m_statements->emitBytecode(generator, dst); 1253 1301 return 0; 1254 1302 } … … 1550 1598 generator.emitPopScope(); 1551 1599 return result; 1600 } 1601 1602 // ------------------------------ CaseClauseNode -------------------------------- 1603 1604 inline void CaseClauseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1605 { 1606 if (m_statements) 1607 m_statements->emitBytecode(generator, dst); 1552 1608 } 1553 1609 … … 1671 1727 for (ClauseListNode* list = m_list1; list; list = list->getNext()) { 1672 1728 generator.emitLabel(labelVector[i++].get()); 1673 statementListEmitCode(list->getClause()->children(),generator, dst);1729 list->getClause()->emitBytecode(generator, dst); 1674 1730 } 1675 1731 1676 1732 if (m_defaultClause) { 1677 1733 generator.emitLabel(defaultLabel.get()); 1678 statementListEmitCode(m_defaultClause->children(),generator, dst);1734 m_defaultClause->emitBytecode(generator, dst); 1679 1735 } 1680 1736 1681 1737 for (ClauseListNode* list = m_list2; list; list = list->getNext()) { 1682 1738 generator.emitLabel(labelVector[i++].get()); 1683 statementListEmitCode(list->getClause()->children(),generator, dst);1739 list->getClause()->emitBytecode(generator, dst); 1684 1740 } 1685 1741 if (!m_defaultClause) … … 1813 1869 // -----------------------------ScopeNodeData --------------------------- 1814 1870 1815 ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* children, VarStack* varStack, FunctionStack* funcStack, int numConstants)1871 ScopeNodeData::ScopeNodeData(ParserArena& arena, SourceElements* statements, VarStack* varStack, FunctionStack* funcStack, int numConstants) 1816 1872 : m_numConstants(numConstants) 1873 , m_statements(statements) 1817 1874 { 1818 1875 m_arena.swap(arena); … … 1821 1878 if (funcStack) 1822 1879 m_functionStack.swap(*funcStack); 1823 if (children)1824 children->releaseContentsIntoVector(m_children);1825 1880 } 1826 1881 … … 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 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()); … … 1906 1972 RefPtr<RegisterID> dstRegister = generator.newTemporary(); 1907 1973 generator.emitLoad(dstRegister.get(), jsUndefined()); 1908 statementListEmitCode(children(),generator, dstRegister.get());1974 emitStatementsBytecode(generator, dstRegister.get()); 1909 1975 1910 1976 generator.emitDebugHook(DidExecuteProgram, firstLine(), lastLine()); … … 1983 2049 { 1984 2050 generator.emitDebugHook(DidEnterCallFrame, firstLine(), lastLine()); 1985 statementListEmitCode(children(), generator, generator.ignoredResult()); 1986 if (children().size() && children().last()->isBlock()) { 1987 BlockNode* blockNode = static_cast<BlockNode*>(children().last()); 1988 if (blockNode->children().size() && blockNode->children().last()->isReturnNode()) 2051 emitStatementsBytecode(generator, generator.ignoredResult()); 2052 StatementNode* singleStatement = this->singleStatement(); 2053 if (singleStatement && singleStatement->isBlock()) { 2054 StatementNode* lastStatementInBlock = static_cast<BlockNode*>(singleStatement)->lastStatement(); 2055 if (lastStatementInBlock && lastStatementInBlock->isReturnNode()) 1989 2056 return 0; 1990 2057 }
Note:
See TracChangeset
for help on using the changeset viewer.