summaryrefslogtreecommitdiffstats
path: root/JavaScriptCore/parser
diff options
context:
space:
mode:
authorFeng Qian <>2009-04-10 18:11:29 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-04-10 18:11:29 -0700
commit8f72e70a9fd78eec56623b3a62e68f16b7b27e28 (patch)
tree181bf9a400c30a1bf34ea6d72560e8d00111d549 /JavaScriptCore/parser
parent7ed56f225e0ade046e1c2178977f72b2d896f196 (diff)
downloadexternal_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.cpp11
-rw-r--r--JavaScriptCore/parser/Lexer.h11
-rw-r--r--JavaScriptCore/parser/Nodes.cpp63
-rw-r--r--JavaScriptCore/parser/Nodes.h9
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;