diff options
author | Feng Qian <> | 2009-04-10 18:11:29 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-04-10 18:11:29 -0700 |
commit | 8f72e70a9fd78eec56623b3a62e68f16b7b27e28 (patch) | |
tree | 181bf9a400c30a1bf34ea6d72560e8d00111d549 /JavaScriptCore/parser | |
parent | 7ed56f225e0ade046e1c2178977f72b2d896f196 (diff) | |
download | external_webkit-8f72e70a9fd78eec56623b3a62e68f16b7b27e28.zip external_webkit-8f72e70a9fd78eec56623b3a62e68f16b7b27e28.tar.gz external_webkit-8f72e70a9fd78eec56623b3a62e68f16b7b27e28.tar.bz2 |
AI 145796: Land the WebKit merge @r42026.
Automated import of CL 145796
Diffstat (limited to 'JavaScriptCore/parser')
-rw-r--r-- | JavaScriptCore/parser/Lexer.cpp | 11 | ||||
-rw-r--r-- | JavaScriptCore/parser/Lexer.h | 11 | ||||
-rw-r--r-- | JavaScriptCore/parser/Nodes.cpp | 63 | ||||
-rw-r--r-- | JavaScriptCore/parser/Nodes.h | 9 |
4 files changed, 52 insertions, 42 deletions
diff --git a/JavaScriptCore/parser/Lexer.cpp b/JavaScriptCore/parser/Lexer.cpp index 22de4a0..6f65096 100644 --- a/JavaScriptCore/parser/Lexer.cpp +++ b/JavaScriptCore/parser/Lexer.cpp @@ -33,7 +33,6 @@ #include <string.h> #include <wtf/ASCIICType.h> #include <wtf/Assertions.h> -#include <wtf/unicode/Unicode.h> using namespace WTF; using namespace Unicode; @@ -80,8 +79,8 @@ Lexer::Lexer(JSGlobalData* globalData) , m_globalData(globalData) , m_mainTable(JSC::mainTable) { - m_buffer8.reserveCapacity(initialReadBufferCapacity); - m_buffer16.reserveCapacity(initialReadBufferCapacity); + m_buffer8.reserveInitialCapacity(initialReadBufferCapacity); + m_buffer16.reserveInitialCapacity(initialReadBufferCapacity); } Lexer::~Lexer() @@ -589,7 +588,7 @@ int Lexer::lex(void* p1, void* p2) bool Lexer::isWhiteSpace() const { - return m_current == '\t' || m_current == 0x0b || m_current == 0x0c || isSeparatorSpace(m_current); + return isWhiteSpace(m_current); } bool Lexer::isLineTerminator() @@ -884,11 +883,11 @@ void Lexer::clear() m_identifiers.clear(); Vector<char> newBuffer8; - newBuffer8.reserveCapacity(initialReadBufferCapacity); + newBuffer8.reserveInitialCapacity(initialReadBufferCapacity); m_buffer8.swap(newBuffer8); Vector<UChar> newBuffer16; - newBuffer16.reserveCapacity(initialReadBufferCapacity); + newBuffer16.reserveInitialCapacity(initialReadBufferCapacity); m_buffer16.swap(newBuffer16); m_isReparsing = false; diff --git a/JavaScriptCore/parser/Lexer.h b/JavaScriptCore/parser/Lexer.h index 63d3892..63c2da9 100644 --- a/JavaScriptCore/parser/Lexer.h +++ b/JavaScriptCore/parser/Lexer.h @@ -27,6 +27,7 @@ #include "SegmentedVector.h" #include "SourceCode.h" #include <wtf/Vector.h> +#include <wtf/unicode/Unicode.h> namespace JSC { @@ -90,6 +91,16 @@ namespace JSC { void clear(); SourceCode sourceCode(int openBrace, int closeBrace, int firstLine) { return SourceCode(m_source->provider(), openBrace, closeBrace + 1, firstLine); } + static inline bool isWhiteSpace(int ch) + { + return ch == '\t' || ch == 0x0b || ch == 0x0c || WTF::Unicode::isSeparatorSpace(ch); + } + + static inline bool isLineTerminator(int ch) + { + return ch == '\r' || ch == '\n' || ch == 0x2028 || ch == 0x2029; + } + private: friend class JSGlobalData; Lexer(JSGlobalData*); diff --git a/JavaScriptCore/parser/Nodes.cpp b/JavaScriptCore/parser/Nodes.cpp index 96fe50b..f7fa739 100644 --- a/JavaScriptCore/parser/Nodes.cpp +++ b/JavaScriptCore/parser/Nodes.cpp @@ -640,7 +640,7 @@ RegisterID* FunctionCallResolveNode::emitBytecode(BytecodeGenerator& generator, return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); } - RefPtr<RegisterID> func = generator.tempDestination(dst); + RefPtr<RegisterID> func = generator.newTemporary(); RefPtr<RegisterID> thisRegister = generator.newTemporary(); int identifierStart = divot() - startOffset(); generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(), 0); @@ -1579,6 +1579,7 @@ void ConstStatementNode::releaseNodes(NodeReleaser& releaser) RegisterID* ConstStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); return generator.emitNode(m_next.get()); } @@ -1589,8 +1590,6 @@ static inline RegisterID* statementListEmitCode(const StatementVector& statement StatementVector::const_iterator end = statements.end(); for (StatementVector::const_iterator it = statements.begin(); it != end; ++it) { StatementNode* n = it->get(); - if (!n->isLoop()) - generator.emitDebugHook(WillExecuteStatement, n->firstLine(), n->lastLine()); generator.emitNode(dst, n); } return 0; @@ -1624,8 +1623,9 @@ RegisterID* BlockNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds // ------------------------------ EmptyStatementNode --------------------------- -RegisterID* EmptyStatementNode::emitBytecode(BytecodeGenerator&, RegisterID* dst) +RegisterID* EmptyStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); return dst; } @@ -1642,6 +1642,7 @@ RegisterID* DebuggerStatementNode::emitBytecode(BytecodeGenerator& generator, Re RegisterID* ExprStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { ASSERT(m_expr); + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); return generator.emitNode(dst, m_expr.get()); } @@ -1660,6 +1661,7 @@ void VarStatementNode::releaseNodes(NodeReleaser& releaser) RegisterID* VarStatementNode::emitBytecode(BytecodeGenerator& generator, RegisterID*) { ASSERT(m_expr); + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); return generator.emitNode(m_expr.get()); } @@ -1678,14 +1680,13 @@ void IfNode::releaseNodes(NodeReleaser& releaser) RegisterID* IfNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); + RefPtr<Label> afterThen = generator.newLabel(); RegisterID* cond = generator.emitNode(m_condition.get()); generator.emitJumpIfFalse(cond, afterThen.get()); - if (!m_ifBlock->isBlock()) - generator.emitDebugHook(WillExecuteStatement, m_ifBlock->firstLine(), m_ifBlock->lastLine()); - generator.emitNode(dst, m_ifBlock.get()); generator.emitLabel(afterThen.get()); @@ -1708,23 +1709,19 @@ void IfElseNode::releaseNodes(NodeReleaser& releaser) RegisterID* IfElseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); + RefPtr<Label> beforeElse = generator.newLabel(); RefPtr<Label> afterElse = generator.newLabel(); RegisterID* cond = generator.emitNode(m_condition.get()); generator.emitJumpIfFalse(cond, beforeElse.get()); - if (!m_ifBlock->isBlock()) - generator.emitDebugHook(WillExecuteStatement, m_ifBlock->firstLine(), m_ifBlock->lastLine()); - generator.emitNode(dst, m_ifBlock.get()); generator.emitJump(afterElse.get()); generator.emitLabel(beforeElse.get()); - if (!m_elseBlock->isBlock()) - generator.emitDebugHook(WillExecuteStatement, m_elseBlock->firstLine(), m_elseBlock->lastLine()); - generator.emitNode(dst, m_elseBlock.get()); generator.emitLabel(afterElse.get()); @@ -1754,10 +1751,7 @@ RegisterID* DoWhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* generator.emitLabel(topOfLoop.get()); generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); - - if (!m_statement->isBlock()) - generator.emitDebugHook(WillExecuteStatement, m_statement->firstLine(), m_statement->lastLine()); - + RefPtr<RegisterID> result = generator.emitNode(dst, m_statement.get()); generator.emitLabel(scope->continueTarget()); @@ -1790,10 +1784,7 @@ RegisterID* WhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds RefPtr<Label> topOfLoop = generator.newLabel(); generator.emitLabel(topOfLoop.get()); - - if (!m_statement->isBlock()) - generator.emitDebugHook(WillExecuteStatement, m_statement->firstLine(), m_statement->lastLine()); - + generator.emitNode(dst, m_statement.get()); generator.emitLabel(scope->continueTarget()); @@ -1840,11 +1831,10 @@ RegisterID* ForNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) RefPtr<Label> topOfLoop = generator.newLabel(); generator.emitLabel(topOfLoop.get()); - if (!m_statement->isBlock()) - generator.emitDebugHook(WillExecuteStatement, m_statement->firstLine(), m_statement->lastLine()); RefPtr<RegisterID> result = generator.emitNode(dst, m_statement.get()); generator.emitLabel(scope->continueTarget()); + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); if (m_expr3) generator.emitNode(generator.ignoredResult(), m_expr3.get()); @@ -1953,12 +1943,11 @@ RegisterID* ForInNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds generator.emitPutByVal(base.get(), subscript, propertyName); } - if (!m_statement->isBlock()) - generator.emitDebugHook(WillExecuteStatement, m_statement->firstLine(), m_statement->lastLine()); generator.emitNode(dst, m_statement.get()); generator.emitLabel(scope->continueTarget()); generator.emitNextPropertyName(propertyName, iter.get(), loopStart.get()); + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); generator.emitLabel(scope->breakTarget()); return dst; } @@ -1968,6 +1957,8 @@ RegisterID* ForInNode::emitBytecode(BytecodeGenerator& generator, RegisterID* ds // ECMA 12.7 RegisterID* ContinueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); + LabelScope* scope = generator.continueTarget(m_ident); if (!scope) @@ -1984,6 +1975,8 @@ RegisterID* ContinueNode::emitBytecode(BytecodeGenerator& generator, RegisterID* // ECMA 12.8 RegisterID* BreakNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); + LabelScope* scope = generator.breakTarget(m_ident); if (!scope) @@ -2009,14 +2002,20 @@ void ReturnNode::releaseNodes(NodeReleaser& releaser) RegisterID* ReturnNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); if (generator.codeType() != FunctionCode) return emitThrowError(generator, SyntaxError, "Invalid return statement."); if (dst == generator.ignoredResult()) dst = 0; RegisterID* r0 = m_value ? generator.emitNode(dst, m_value.get()) : generator.emitLoad(dst, jsUndefined()); + RefPtr<RegisterID> returnRegister; if (generator.scopeDepth()) { RefPtr<Label> l0 = generator.newLabel(); + if (generator.hasFinaliser() && !r0->isTemporary()) { + returnRegister = generator.emitMove(generator.newTemporary(), r0); + r0 = returnRegister.get(); + } generator.emitJumpScopes(l0.get(), 0); generator.emitLabel(l0.get()); } @@ -2039,6 +2038,8 @@ void WithNode::releaseNodes(NodeReleaser& releaser) RegisterID* WithNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); + RefPtr<RegisterID> scope = generator.newTemporary(); generator.emitNode(scope.get(), m_expr.get()); // scope must be protected until popped generator.emitExpressionInfo(m_divot, m_expressionLength, 0); @@ -2244,6 +2245,8 @@ void SwitchNode::releaseNodes(NodeReleaser& releaser) RegisterID* SwitchNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); + RefPtr<LabelScope> scope = generator.newLabelScope(LabelScope::Switch); RefPtr<RegisterID> r0 = generator.emitNode(m_expr.get()); @@ -2267,6 +2270,8 @@ void LabelNode::releaseNodes(NodeReleaser& releaser) RegisterID* LabelNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); + if (generator.breakTarget(m_name)) return emitThrowError(generator, SyntaxError, "Duplicate label: %s.", m_name); @@ -2291,12 +2296,14 @@ void ThrowNode::releaseNodes(NodeReleaser& releaser) RegisterID* ThrowNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); + if (dst == generator.ignoredResult()) dst = 0; - RefPtr<RegisterID> expr = generator.emitNode(dst, m_expr.get()); + RefPtr<RegisterID> expr = generator.emitNode(m_expr.get()); generator.emitExpressionInfo(divot(), startOffset(), endOffset()); generator.emitThrow(expr.get()); - return dst; + return 0; } // ------------------------------ TryNode -------------------------------------- @@ -2315,6 +2322,8 @@ void TryNode::releaseNodes(NodeReleaser& releaser) RegisterID* TryNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) { + generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine()); + RefPtr<Label> tryStartLabel = generator.newLabel(); RefPtr<Label> tryEndLabel = generator.newLabel(); RefPtr<Label> finallyStart; diff --git a/JavaScriptCore/parser/Nodes.h b/JavaScriptCore/parser/Nodes.h index baa9984..f209133 100644 --- a/JavaScriptCore/parser/Nodes.h +++ b/JavaScriptCore/parser/Nodes.h @@ -205,7 +205,6 @@ namespace JSC { virtual bool isExprStatement() const JSC_FAST_CALL { return false; } virtual bool isBlock() const JSC_FAST_CALL { return false; } - virtual bool isLoop() const JSC_FAST_CALL { return false; } private: int m_lastLine; @@ -1831,8 +1830,6 @@ namespace JSC { virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; - virtual bool isLoop() const JSC_FAST_CALL { return true; } - private: RefPtr<StatementNode> m_statement; RefPtr<ExpressionNode> m_expr; @@ -1852,8 +1849,6 @@ namespace JSC { virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; - virtual bool isLoop() const JSC_FAST_CALL { return true; } - private: RefPtr<ExpressionNode> m_expr; RefPtr<StatementNode> m_statement; @@ -1877,8 +1872,6 @@ namespace JSC { virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; - virtual bool isLoop() const JSC_FAST_CALL { return true; } - private: RefPtr<ExpressionNode> m_expr1; RefPtr<ExpressionNode> m_expr2; @@ -1897,8 +1890,6 @@ namespace JSC { virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; - virtual bool isLoop() const JSC_FAST_CALL { return true; } - private: Identifier m_ident; RefPtr<ExpressionNode> m_init; |