summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/parser
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-09-10 19:10:20 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-09-10 19:10:20 +0200
commit284837daa07b29d6a63a748544a90b1f5842ac5c (patch)
treeecd258180bde91fe741e0cfd2638beb3c6da7e8e /Source/JavaScriptCore/parser
parent2e2ba8ff45915f40ed3e014101269c175f2a89a0 (diff)
downloadqtwebkit-284837daa07b29d6a63a748544a90b1f5842ac5c.tar.gz
Imported WebKit commit 68645295d2e3e09af2c942f092556f06aa5f8b0d (http://svn.webkit.org/repository/webkit/trunk@128073)
New snapshot
Diffstat (limited to 'Source/JavaScriptCore/parser')
-rw-r--r--Source/JavaScriptCore/parser/ASTBuilder.h41
-rw-r--r--Source/JavaScriptCore/parser/Lexer.cpp4
-rw-r--r--Source/JavaScriptCore/parser/Lexer.h8
-rw-r--r--Source/JavaScriptCore/parser/NodeConstructors.h67
-rw-r--r--Source/JavaScriptCore/parser/Nodes.cpp9
-rw-r--r--Source/JavaScriptCore/parser/Nodes.h109
-rw-r--r--Source/JavaScriptCore/parser/Parser.cpp10
-rw-r--r--Source/JavaScriptCore/parser/Parser.h92
-rw-r--r--Source/JavaScriptCore/parser/ParserArena.h2
-rw-r--r--Source/JavaScriptCore/parser/SourceCode.h8
-rw-r--r--Source/JavaScriptCore/parser/SourceProvider.h21
-rw-r--r--Source/JavaScriptCore/parser/SourceProviderCache.h1
-rw-r--r--Source/JavaScriptCore/parser/SourceProviderCacheItem.h1
-rw-r--r--Source/JavaScriptCore/parser/SyntaxChecker.h2
14 files changed, 105 insertions, 270 deletions
diff --git a/Source/JavaScriptCore/parser/ASTBuilder.h b/Source/JavaScriptCore/parser/ASTBuilder.h
index 0a71f1294..6e7334f97 100644
--- a/Source/JavaScriptCore/parser/ASTBuilder.h
+++ b/Source/JavaScriptCore/parser/ASTBuilder.h
@@ -220,7 +220,7 @@ public:
ExpressionNode* createRegExp(const JSTokenLocation& location, const Identifier& pattern, const Identifier& flags, int start)
{
- if (Yarr::checkSyntax(pattern.ustring()))
+ if (Yarr::checkSyntax(pattern.string()))
return 0;
RegExpNode* node = new (m_globalData) RegExpNode(location, pattern, flags);
int size = pattern.length() + 2; // + 2 for the two /'s
@@ -943,47 +943,12 @@ ExpressionNode* ASTBuilder::makeAssignNode(const JSTokenLocation& location, Expr
ExpressionNode* ASTBuilder::makePrefixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator op, int start, int divot, int end)
{
- if (!expr->isLocation())
- return new (m_globalData) PrefixErrorNode(location, op, divot, divot - start, end - divot);
-
- if (expr->isResolveNode()) {
- ResolveNode* resolve = static_cast<ResolveNode*>(expr);
- return new (m_globalData) PrefixResolveNode(location, resolve->identifier(), op, divot, divot - start, end - divot);
- }
- if (expr->isBracketAccessorNode()) {
- BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
- PrefixBracketNode* node = new (m_globalData) PrefixBracketNode(location, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot);
- node->setSubexpressionInfo(bracket->divot(), bracket->startOffset());
- return node;
- }
- ASSERT(expr->isDotAccessorNode());
- DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
- PrefixDotNode* node = new (m_globalData) PrefixDotNode(location, dot->base(), dot->identifier(), op, divot, divot - start, end - divot);
- node->setSubexpressionInfo(dot->divot(), dot->startOffset());
- return node;
+ return new (m_globalData) PrefixNode(location, expr, op, divot, divot - start, end - divot);
}
ExpressionNode* ASTBuilder::makePostfixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator op, int start, int divot, int end)
{
- if (!expr->isLocation())
- return new (m_globalData) PostfixErrorNode(location, op, divot, divot - start, end - divot);
-
- if (expr->isResolveNode()) {
- ResolveNode* resolve = static_cast<ResolveNode*>(expr);
- return new (m_globalData) PostfixResolveNode(location, resolve->identifier(), op, divot, divot - start, end - divot);
- }
- if (expr->isBracketAccessorNode()) {
- BracketAccessorNode* bracket = static_cast<BracketAccessorNode*>(expr);
- PostfixBracketNode* node = new (m_globalData) PostfixBracketNode(location, bracket->base(), bracket->subscript(), op, divot, divot - start, end - divot);
- node->setSubexpressionInfo(bracket->divot(), bracket->endOffset());
- return node;
-
- }
- ASSERT(expr->isDotAccessorNode());
- DotAccessorNode* dot = static_cast<DotAccessorNode*>(expr);
- PostfixDotNode* node = new (m_globalData) PostfixDotNode(location, dot->base(), dot->identifier(), op, divot, divot - start, end - divot);
- node->setSubexpressionInfo(dot->divot(), dot->endOffset());
- return node;
+ return new (m_globalData) PostfixNode(location, expr, op, divot, divot - start, end - divot);
}
}
diff --git a/Source/JavaScriptCore/parser/Lexer.cpp b/Source/JavaScriptCore/parser/Lexer.cpp
index 2a8a8dc9e..063168be1 100644
--- a/Source/JavaScriptCore/parser/Lexer.cpp
+++ b/Source/JavaScriptCore/parser/Lexer.cpp
@@ -368,7 +368,7 @@ Lexer<T>::~Lexer()
}
template <typename T>
-UString Lexer<T>::invalidCharacterMessage() const
+String Lexer<T>::invalidCharacterMessage() const
{
switch (m_current) {
case 0:
@@ -418,7 +418,7 @@ void Lexer<T>::setCode(const SourceCode& source, ParserArena* arena)
m_error = false;
m_atLineStart = true;
m_columnNumber = 0;
- m_lexErrorMessage = UString();
+ m_lexErrorMessage = String();
m_buffer8.reserveInitialCapacity(initialReadBufferCapacity);
m_buffer16.reserveInitialCapacity((m_codeEnd - m_code) / 2);
diff --git a/Source/JavaScriptCore/parser/Lexer.h b/Source/JavaScriptCore/parser/Lexer.h
index 1ac832a2c..d75f2020d 100644
--- a/Source/JavaScriptCore/parser/Lexer.h
+++ b/Source/JavaScriptCore/parser/Lexer.h
@@ -100,12 +100,12 @@ public:
// Functions for use after parsing.
bool sawError() const { return m_error; }
- UString getErrorMessage() const { return m_lexErrorMessage; }
+ String getErrorMessage() const { return m_lexErrorMessage; }
void clear();
void setOffset(int offset)
{
m_error = 0;
- m_lexErrorMessage = UString();
+ m_lexErrorMessage = String();
m_code = m_codeStart + offset;
m_buffer8.resize(0);
m_buffer16.resize(0);
@@ -137,7 +137,7 @@ private:
int parseFourDigitUnicodeHex();
void shiftLineTerminator();
- UString invalidCharacterMessage() const;
+ String invalidCharacterMessage() const;
ALWAYS_INLINE const T* currentCharacter() const;
ALWAYS_INLINE int currentOffset() const { return m_code - m_codeStart; }
ALWAYS_INLINE void setOffsetFromCharOffset(const T* charOffset) { setOffset(charOffset - m_codeStart); }
@@ -181,7 +181,7 @@ private:
bool m_isReparsing;
bool m_atLineStart;
bool m_error;
- UString m_lexErrorMessage;
+ String m_lexErrorMessage;
T m_current;
diff --git a/Source/JavaScriptCore/parser/NodeConstructors.h b/Source/JavaScriptCore/parser/NodeConstructors.h
index 43d1e17c6..1678bf7ea 100644
--- a/Source/JavaScriptCore/parser/NodeConstructors.h
+++ b/Source/JavaScriptCore/parser/NodeConstructors.h
@@ -287,40 +287,10 @@ namespace JSC {
{
}
- inline PrePostResolveNode::PrePostResolveNode(const JSTokenLocation& location, const Identifier& ident, unsigned divot, unsigned startOffset, unsigned endOffset)
- : ExpressionNode(location, ResultType::numberType()) // could be reusable for pre?
- , ThrowableExpressionData(divot, startOffset, endOffset)
- , m_ident(ident)
- {
- }
-
- inline PostfixResolveNode::PostfixResolveNode(const JSTokenLocation& location, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
- : PrePostResolveNode(location, ident, divot, startOffset, endOffset)
- , m_operator(oper)
- {
- }
-
- inline PostfixBracketNode::PostfixBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
- : ExpressionNode(location)
- , ThrowableSubExpressionData(divot, startOffset, endOffset)
- , m_base(base)
- , m_subscript(subscript)
- , m_operator(oper)
- {
- }
-
- inline PostfixDotNode::PostfixDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
- : ExpressionNode(location)
- , ThrowableSubExpressionData(divot, startOffset, endOffset)
- , m_base(base)
- , m_ident(ident)
- , m_operator(oper)
- {
- }
-
- inline PostfixErrorNode::PostfixErrorNode(const JSTokenLocation& location, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
+ inline PostfixNode::PostfixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
: ExpressionNode(location)
- , ThrowableSubExpressionData(divot, startOffset, endOffset)
+ , ThrowableExpressionData(divot, startOffset, endOffset)
+ , m_expr(expr)
, m_operator(oper)
{
}
@@ -372,33 +342,10 @@ namespace JSC {
{
}
- inline PrefixResolveNode::PrefixResolveNode(const JSTokenLocation& location, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
- : PrePostResolveNode(location, ident, divot, startOffset, endOffset)
- , m_operator(oper)
- {
- }
-
- inline PrefixBracketNode::PrefixBracketNode(const JSTokenLocation& location, ExpressionNode* base, ExpressionNode* subscript, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
- : ExpressionNode(location)
- , ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
- , m_base(base)
- , m_subscript(subscript)
- , m_operator(oper)
- {
- }
-
- inline PrefixDotNode::PrefixDotNode(const JSTokenLocation& location, ExpressionNode* base, const Identifier& ident, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
+ inline PrefixNode::PrefixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
: ExpressionNode(location)
, ThrowablePrefixedSubExpressionData(divot, startOffset, endOffset)
- , m_base(base)
- , m_ident(ident)
- , m_operator(oper)
- {
- }
-
- inline PrefixErrorNode::PrefixErrorNode(const JSTokenLocation& location, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
- : ExpressionNode(location)
- , ThrowableExpressionData(divot, startOffset, endOffset)
+ , m_expr(expr)
, m_operator(oper)
{
}
@@ -802,14 +749,14 @@ namespace JSC {
: ExpressionNode(location)
, m_body(body)
{
- m_body->finishParsing(source, parameter, ident);
+ m_body->finishParsing(source, parameter, ident, FunctionNameIsInScope);
}
inline FuncDeclNode::FuncDeclNode(const JSTokenLocation& location, const Identifier& ident, FunctionBodyNode* body, const SourceCode& source, ParameterNode* parameter)
: StatementNode(location)
, m_body(body)
{
- m_body->finishParsing(source, parameter, ident);
+ m_body->finishParsing(source, parameter, ident, FunctionNameIsNotInScope);
}
inline CaseClauseNode::CaseClauseNode(ExpressionNode* expr, SourceElements* statements)
diff --git a/Source/JavaScriptCore/parser/Nodes.cpp b/Source/JavaScriptCore/parser/Nodes.cpp
index 0172359c7..14ee83805 100644
--- a/Source/JavaScriptCore/parser/Nodes.cpp
+++ b/Source/JavaScriptCore/parser/Nodes.cpp
@@ -33,7 +33,7 @@
#include "JIT.h"
#include "JSFunction.h"
#include "JSGlobalObject.h"
-#include "JSStaticScopeObject.h"
+#include "JSNameScope.h"
#include "LabelScope.h"
#include "Lexer.h"
#include "Operations.h"
@@ -167,17 +167,18 @@ inline FunctionBodyNode::FunctionBodyNode(JSGlobalData* globalData, const JSToke
{
}
-void FunctionBodyNode::finishParsing(const SourceCode& source, ParameterNode* firstParameter, const Identifier& ident)
+void FunctionBodyNode::finishParsing(const SourceCode& source, ParameterNode* firstParameter, const Identifier& ident, FunctionNameIsInScopeToggle functionNameIsInScopeToggle)
{
setSource(source);
- finishParsing(FunctionParameters::create(firstParameter), ident);
+ finishParsing(FunctionParameters::create(firstParameter), ident, functionNameIsInScopeToggle);
}
-void FunctionBodyNode::finishParsing(PassRefPtr<FunctionParameters> parameters, const Identifier& ident)
+void FunctionBodyNode::finishParsing(PassRefPtr<FunctionParameters> parameters, const Identifier& ident, FunctionNameIsInScopeToggle functionNameIsInScopeToggle)
{
ASSERT(!source().isNull());
m_parameters = parameters;
m_ident = ident;
+ m_functionNameIsInScopeToggle = functionNameIsInScopeToggle;
}
FunctionBodyNode* FunctionBodyNode::create(JSGlobalData* globalData, const JSTokenLocation& location, bool inStrictContext)
diff --git a/Source/JavaScriptCore/parser/Nodes.h b/Source/JavaScriptCore/parser/Nodes.h
index ed1a85aaf..475689ce9 100644
--- a/Source/JavaScriptCore/parser/Nodes.h
+++ b/Source/JavaScriptCore/parser/Nodes.h
@@ -44,7 +44,7 @@ namespace JSC {
class PropertyListNode;
class ReadModifyResolveNode;
class RegisterID;
- class ScopeChainNode;
+ class JSScope;
class ScopeNode;
typedef unsigned CodeFeatures;
@@ -279,7 +279,7 @@ namespace JSC {
uint16_t endOffset() const { return m_endOffset; }
protected:
- RegisterID* emitThrowReferenceError(BytecodeGenerator&, const UString& message);
+ RegisterID* emitThrowReferenceError(BytecodeGenerator&, const String& message);
private:
uint32_t m_divot;
@@ -461,6 +461,8 @@ namespace JSC {
ExpressionNode* base() const { return m_base; }
ExpressionNode* subscript() const { return m_subscript; }
+ bool subscriptHasAssignments() const { return m_subscriptHasAssignments; }
+
private:
virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
@@ -594,55 +596,17 @@ namespace JSC {
virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
};
- class PrePostResolveNode : public ExpressionNode, public ThrowableExpressionData {
- public:
- PrePostResolveNode(const JSTokenLocation&, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
-
- protected:
- const Identifier& m_ident;
- };
-
- class PostfixResolveNode : public PrePostResolveNode {
- public:
- PostfixResolveNode(const JSTokenLocation&, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
-
- private:
- virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
-
- Operator m_operator;
- };
-
- class PostfixBracketNode : public ExpressionNode, public ThrowableSubExpressionData {
- public:
- PostfixBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
-
- private:
- virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
-
- ExpressionNode* m_base;
- ExpressionNode* m_subscript;
- Operator m_operator;
- };
-
- class PostfixDotNode : public ExpressionNode, public ThrowableSubExpressionData {
- public:
- PostfixDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
-
- private:
- virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
-
- ExpressionNode* m_base;
- const Identifier& m_ident;
- Operator m_operator;
- };
-
- class PostfixErrorNode : public ExpressionNode, public ThrowableSubExpressionData {
+ class PostfixNode : public ExpressionNode, public ThrowableExpressionData {
public:
- PostfixErrorNode(const JSTokenLocation&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
+ PostfixNode(const JSTokenLocation&, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
private:
virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
+ virtual RegisterID* emitResolve(BytecodeGenerator&, RegisterID* = 0);
+ virtual RegisterID* emitBracket(BytecodeGenerator&, RegisterID* = 0);
+ virtual RegisterID* emitDot(BytecodeGenerator&, RegisterID* = 0);
+ ExpressionNode* m_expr;
Operator m_operator;
};
@@ -720,47 +684,17 @@ namespace JSC {
ExpressionNode* m_expr;
};
- class PrefixResolveNode : public PrePostResolveNode {
+ class PrefixNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
public:
- PrefixResolveNode(const JSTokenLocation&, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
-
- private:
- virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
-
- Operator m_operator;
- };
-
- class PrefixBracketNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
- public:
- PrefixBracketNode(const JSTokenLocation&, ExpressionNode* base, ExpressionNode* subscript, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
-
- private:
- virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
-
- ExpressionNode* m_base;
- ExpressionNode* m_subscript;
- Operator m_operator;
- };
-
- class PrefixDotNode : public ExpressionNode, public ThrowablePrefixedSubExpressionData {
- public:
- PrefixDotNode(const JSTokenLocation&, ExpressionNode* base, const Identifier&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
-
- private:
- virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
-
- ExpressionNode* m_base;
- const Identifier& m_ident;
- Operator m_operator;
- };
-
- class PrefixErrorNode : public ExpressionNode, public ThrowableExpressionData {
- public:
- PrefixErrorNode(const JSTokenLocation&, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
+ PrefixNode(const JSTokenLocation&, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
private:
virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
+ virtual RegisterID* emitResolve(BytecodeGenerator&, RegisterID* = 0);
+ virtual RegisterID* emitBracket(BytecodeGenerator&, RegisterID* = 0);
+ virtual RegisterID* emitDot(BytecodeGenerator&, RegisterID* = 0);
+ ExpressionNode* m_expr;
Operator m_operator;
};
@@ -1389,7 +1323,7 @@ namespace JSC {
}
const SourceCode& source() const { return m_source; }
- const UString& sourceURL() const { return m_source.provider()->url(); }
+ const String& sourceURL() const { return m_source.provider()->url(); }
intptr_t sourceID() const { return m_source.providerID(); }
void setFeatures(CodeFeatures features) { m_features = features; }
@@ -1469,6 +1403,7 @@ namespace JSC {
FunctionParameters(ParameterNode*);
};
+ enum FunctionNameIsInScopeToggle { FunctionNameIsNotInScope, FunctionNameIsInScope };
class FunctionBodyNode : public ScopeNode {
public:
static const bool isFunctionNode = true;
@@ -1480,13 +1415,16 @@ namespace JSC {
virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
- void finishParsing(const SourceCode&, ParameterNode*, const Identifier&);
- void finishParsing(PassRefPtr<FunctionParameters>, const Identifier&);
+ void finishParsing(const SourceCode&, ParameterNode*, const Identifier&, FunctionNameIsInScopeToggle);
+ void finishParsing(PassRefPtr<FunctionParameters>, const Identifier&, FunctionNameIsInScopeToggle);
const Identifier& ident() { return m_ident; }
void setInferredName(const Identifier& inferredName) { ASSERT(!inferredName.isNull()); m_inferredName = inferredName; }
const Identifier& inferredName() { return m_inferredName.isEmpty() ? m_ident : m_inferredName; }
+ bool functionNameIsInScope() { return m_functionNameIsInScopeToggle == FunctionNameIsInScope; }
+ FunctionNameIsInScopeToggle functionNameIsInScopeToggle() { return m_functionNameIsInScopeToggle; }
+
static const bool scopeIsFunction = true;
private:
@@ -1495,6 +1433,7 @@ namespace JSC {
Identifier m_ident;
Identifier m_inferredName;
+ FunctionNameIsInScopeToggle m_functionNameIsInScopeToggle;
RefPtr<FunctionParameters> m_parameters;
};
diff --git a/Source/JavaScriptCore/parser/Parser.cpp b/Source/JavaScriptCore/parser/Parser.cpp
index 4fd671fb7..3555f07cd 100644
--- a/Source/JavaScriptCore/parser/Parser.cpp
+++ b/Source/JavaScriptCore/parser/Parser.cpp
@@ -40,7 +40,7 @@ using namespace std;
namespace JSC {
template <typename LexerType>
-Parser<LexerType>::Parser(JSGlobalData* globalData, const SourceCode& source, FunctionParameters* parameters, JSParserStrictness strictness, JSParserMode parserMode)
+Parser<LexerType>::Parser(JSGlobalData* globalData, const SourceCode& source, FunctionParameters* parameters, const Identifier& name, JSParserStrictness strictness, JSParserMode parserMode)
: m_globalData(globalData)
, m_source(&source)
, m_stack(wtfThreadData().stack())
@@ -71,6 +71,8 @@ Parser<LexerType>::Parser(JSGlobalData* globalData, const SourceCode& source, Fu
for (unsigned i = 0; i < parameters->size(); i++)
scope->declareParameter(&parameters->at(i));
}
+ if (!name.isNull())
+ scope->declareCallee(&name);
next();
m_lexer->setLastLineNumber(tokenLine());
}
@@ -81,9 +83,9 @@ Parser<LexerType>::~Parser()
}
template <typename LexerType>
-UString Parser<LexerType>::parseInner()
+String Parser<LexerType>::parseInner()
{
- UString parseError = UString();
+ String parseError = String();
unsigned oldFunctionCacheSize = m_functionCache ? m_functionCache->byteSize() : 0;
ASTBuilder context(const_cast<JSGlobalData*>(m_globalData), const_cast<SourceCode*>(m_source));
@@ -1507,7 +1509,7 @@ template <class TreeBuilder> TreeExpression Parser<LexerType>::parsePrimaryExpre
next();
TreeExpression re = context.createRegExp(location, *pattern, *flags, start);
if (!re) {
- const char* yarrErrorMsg = Yarr::checkSyntax(pattern->ustring());
+ const char* yarrErrorMsg = Yarr::checkSyntax(pattern->string());
ASSERT(!m_errorMessage.isNull());
failWithMessage(yarrErrorMsg);
}
diff --git a/Source/JavaScriptCore/parser/Parser.h b/Source/JavaScriptCore/parser/Parser.h
index 79a95b696..3a61da1a8 100644
--- a/Source/JavaScriptCore/parser/Parser.h
+++ b/Source/JavaScriptCore/parser/Parser.h
@@ -56,7 +56,6 @@ class Identifier;
class JSGlobalData;
class ProgramNode;
class SourceCode;
-class UString;
#define fail() do { if (!m_error) updateErrorMessage(); return 0; } while (0)
#define failWithToken(tok) do { if (!m_error) updateErrorMessage(tok); return 0; } while (0)
@@ -209,11 +208,16 @@ struct Scope {
bool isFunction() { return m_isFunction; }
bool isFunctionBoundary() { return m_isFunctionBoundary; }
+ void declareCallee(const Identifier* ident)
+ {
+ m_declaredVariables.add(ident->string().impl());
+ }
+
bool declareVariable(const Identifier* ident)
{
bool isValidStrictMode = m_globalData->propertyNames->eval != *ident && m_globalData->propertyNames->arguments != *ident;
m_isValidStrictMode = m_isValidStrictMode && isValidStrictMode;
- m_declaredVariables.add(ident->ustring().impl());
+ m_declaredVariables.add(ident->string().impl());
return isValidStrictMode;
}
@@ -229,7 +233,7 @@ struct Scope {
bool declareParameter(const Identifier* ident)
{
bool isArguments = m_globalData->propertyNames->arguments == *ident;
- bool isValidStrictMode = m_declaredVariables.add(ident->ustring().impl()).isNewEntry && m_globalData->propertyNames->eval != *ident && !isArguments;
+ bool isValidStrictMode = m_declaredVariables.add(ident->string().impl()).isNewEntry && m_globalData->propertyNames->eval != *ident && !isArguments;
m_isValidStrictMode = m_isValidStrictMode && isValidStrictMode;
if (isArguments)
m_shadowsArguments = true;
@@ -239,7 +243,7 @@ struct Scope {
void useVariable(const Identifier* ident, bool isEval)
{
m_usesEval |= isEval;
- m_usedVariables.add(ident->ustring().impl());
+ m_usedVariables.add(ident->string().impl());
}
void setNeedsFullActivation() { m_needsFullActivation = true; }
@@ -383,7 +387,7 @@ class Parser {
WTF_MAKE_FAST_ALLOCATED;
public:
- Parser(JSGlobalData*, const SourceCode&, FunctionParameters*, JSParserStrictness, JSParserMode);
+ Parser(JSGlobalData*, const SourceCode&, FunctionParameters*, const Identifier&, JSParserStrictness, JSParserMode);
~Parser();
template <class ParsedNode>
@@ -489,7 +493,7 @@ private:
}
Parser();
- UString parseInner();
+ String parseInner();
void didFinishParsing(SourceElements*, ParserArenaData<DeclarationStacks::VarStack>*,
ParserArenaData<DeclarationStacks::FunctionStack>*, CodeFeatures,
@@ -529,9 +533,9 @@ private:
return result;
}
- ALWAYS_INLINE UString getToken() {
+ ALWAYS_INLINE String getToken() {
SourceProvider* sourceProvider = m_source->provider();
- return UString(sourceProvider->getRange(tokenStart(), tokenEnd()).impl());
+ return sourceProvider->getRange(tokenStart(), tokenEnd());
}
ALWAYS_INLINE bool match(JSTokenType expected)
@@ -736,52 +740,34 @@ private:
ALWAYS_INLINE void updateErrorMessageSpecialCase(JSTokenType expectedToken)
{
- String errorMessage;
switch (expectedToken) {
case RESERVED_IF_STRICT:
- errorMessage = "Use of reserved word '";
- errorMessage += getToken().impl();
- errorMessage += "' in strict mode";
- m_errorMessage = errorMessage.impl();
+ m_errorMessage = "Use of reserved word '" + getToken() + "' in strict mode";
return;
case RESERVED:
- errorMessage = "Use of reserved word '";
- errorMessage += getToken().impl();
- errorMessage += "'";
- m_errorMessage = errorMessage.impl();
+ m_errorMessage = "Use of reserved word '" + getToken() + '\'';
return;
case NUMBER:
- errorMessage = "Unexpected number '";
- errorMessage += getToken().impl();
- errorMessage += "'";
- m_errorMessage = errorMessage.impl();
+ m_errorMessage = "Unexpected number '" + getToken() + '\'';
return;
case IDENT:
- errorMessage = "Expected an identifier but found '";
- errorMessage += getToken().impl();
- errorMessage += "' instead";
- m_errorMessage = errorMessage.impl();
+ m_errorMessage = "Expected an identifier but found '" + getToken() + "' instead";
return;
case STRING:
- errorMessage = "Unexpected string ";
- errorMessage += getToken().impl();
- m_errorMessage = errorMessage.impl();
+ m_errorMessage = "Unexpected string " + getToken();
return;
case ERRORTOK:
- errorMessage = "Unrecognized token '";
- errorMessage += getToken().impl();
- errorMessage += "'";
- m_errorMessage = errorMessage.impl();
+ m_errorMessage = "Unrecognized token '" + getToken() + '\'';
return;
case EOFTOK:
- m_errorMessage = "Unexpected EOF";
+ m_errorMessage = ASCIILiteral("Unexpected EOF");
return;
case RETURN:
- m_errorMessage = "Return statements are only valid inside functions";
+ m_errorMessage = ASCIILiteral("Return statements are only valid inside functions");
return;
default:
ASSERT_NOT_REACHED();
- m_errorMessage = "internal error";
+ m_errorMessage = ASCIILiteral("internal error");
return;
}
}
@@ -793,7 +779,7 @@ private:
if (!name)
updateErrorMessageSpecialCase(m_token.m_type);
else
- m_errorMessage = UString(String::format("Unexpected token '%s'", name).impl());
+ m_errorMessage = String::format("Unexpected token '%s'", name);
}
NEVER_INLINE void updateErrorMessage(JSTokenType expectedToken)
@@ -801,31 +787,25 @@ private:
m_error = true;
const char* name = getTokenName(expectedToken);
if (name)
- m_errorMessage = UString(String::format("Expected token '%s'", name).impl());
+ m_errorMessage = String::format("Expected token '%s'", name);
else {
if (!getTokenName(m_token.m_type))
updateErrorMessageSpecialCase(m_token.m_type);
else
updateErrorMessageSpecialCase(expectedToken);
- }
+ }
}
- NEVER_INLINE void updateErrorWithNameAndMessage(const char* beforeMsg, UString name, const char* afterMsg)
+ NEVER_INLINE void updateErrorWithNameAndMessage(const char* beforeMsg, String name, const char* afterMsg)
{
m_error = true;
- String prefix(beforeMsg);
- String postfix(afterMsg);
- prefix += " '";
- prefix += name.impl();
- prefix += "' ";
- prefix += postfix;
- m_errorMessage = prefix.impl();
+ m_errorMessage = makeString(beforeMsg, " '", name, "' ", afterMsg);
}
- NEVER_INLINE void updateErrorMessage(const char* msg)
+ NEVER_INLINE void updateErrorMessage(const char* msg)
{
m_error = true;
- m_errorMessage = UString(msg);
+ m_errorMessage = String(msg);
}
void startLoop() { currentScope()->startLoop(); }
@@ -938,7 +918,7 @@ private:
StackBounds m_stack;
bool m_error;
- UString m_errorMessage;
+ String m_errorMessage;
JSToken m_token;
bool m_allowsIn;
int m_lastLine;
@@ -982,7 +962,7 @@ PassRefPtr<ParsedNode> Parser<LexerType>::parse(JSGlobalObject* lexicalGlobalObj
ASSERT(lexicalGlobalObject);
ASSERT(exception && !*exception);
int errLine;
- UString errMsg;
+ String errMsg;
if (ParsedNode::scopeIsFunction)
m_lexer->setIsReparsing();
@@ -990,13 +970,13 @@ PassRefPtr<ParsedNode> Parser<LexerType>::parse(JSGlobalObject* lexicalGlobalObj
m_sourceElements = 0;
errLine = -1;
- errMsg = UString();
+ errMsg = String();
- UString parseError = parseInner();
+ String parseError = parseInner();
int lineNumber = m_lexer->lineNumber();
bool lexError = m_lexer->sawError();
- UString lexErrorMessage = lexError ? m_lexer->getErrorMessage() : UString();
+ String lexErrorMessage = lexError ? m_lexer->getErrorMessage() : String();
ASSERT(lexErrorMessage.isNull() != lexError);
m_lexer->clear();
@@ -1045,17 +1025,17 @@ PassRefPtr<ParsedNode> Parser<LexerType>::parse(JSGlobalObject* lexicalGlobalObj
}
template <class ParsedNode>
-PassRefPtr<ParsedNode> parse(JSGlobalData* globalData, JSGlobalObject* lexicalGlobalObject, const SourceCode& source, FunctionParameters* parameters, JSParserStrictness strictness, JSParserMode parserMode, Debugger* debugger, ExecState* execState, JSObject** exception)
+PassRefPtr<ParsedNode> parse(JSGlobalData* globalData, JSGlobalObject* lexicalGlobalObject, const SourceCode& source, FunctionParameters* parameters, const Identifier& name, JSParserStrictness strictness, JSParserMode parserMode, Debugger* debugger, ExecState* execState, JSObject** exception)
{
SamplingRegion samplingRegion("Parsing");
ASSERT(source.provider()->data());
if (source.provider()->data()->is8Bit()) {
- Parser< Lexer<LChar> > parser(globalData, source, parameters, strictness, parserMode);
+ Parser< Lexer<LChar> > parser(globalData, source, parameters, name, strictness, parserMode);
return parser.parse<ParsedNode>(lexicalGlobalObject, debugger, execState, exception);
}
- Parser< Lexer<UChar> > parser(globalData, source, parameters, strictness, parserMode);
+ Parser< Lexer<UChar> > parser(globalData, source, parameters, name, strictness, parserMode);
return parser.parse<ParsedNode>(lexicalGlobalObject, debugger, execState, exception);
}
diff --git a/Source/JavaScriptCore/parser/ParserArena.h b/Source/JavaScriptCore/parser/ParserArena.h
index 067b83a26..2f5b447b1 100644
--- a/Source/JavaScriptCore/parser/ParserArena.h
+++ b/Source/JavaScriptCore/parser/ParserArena.h
@@ -113,7 +113,7 @@ namespace JSC {
inline const Identifier& IdentifierArena::makeNumericIdentifier(JSGlobalData* globalData, double number)
{
- m_identifiers.append(Identifier(globalData, UString::number(number)));
+ m_identifiers.append(Identifier(globalData, String::numberToStringECMAScript(number)));
return m_identifiers.last();
}
diff --git a/Source/JavaScriptCore/parser/SourceCode.h b/Source/JavaScriptCore/parser/SourceCode.h
index 11a00337d..bda91b3c8 100644
--- a/Source/JavaScriptCore/parser/SourceCode.h
+++ b/Source/JavaScriptCore/parser/SourceCode.h
@@ -60,10 +60,10 @@ namespace JSC {
{
}
- UString toString() const
+ String toString() const
{
if (!m_provider)
- return UString();
+ return String();
return m_provider->getRange(m_startChar, m_endChar);
}
@@ -90,9 +90,9 @@ namespace JSC {
int m_firstLine;
};
- inline SourceCode makeSource(const UString& source, const UString& url = UString(), const TextPosition& startPosition = TextPosition::minimumPosition())
+ inline SourceCode makeSource(const String& source, const String& url = String(), const TextPosition& startPosition = TextPosition::minimumPosition())
{
- return SourceCode(UStringSourceProvider::create(source, url, startPosition), startPosition.m_line.oneBasedInt());
+ return SourceCode(StringSourceProvider::create(source, url, startPosition), startPosition.m_line.oneBasedInt());
}
inline SourceCode SourceCode::subExpression(unsigned openBrace, unsigned closeBrace, int firstLine)
diff --git a/Source/JavaScriptCore/parser/SourceProvider.h b/Source/JavaScriptCore/parser/SourceProvider.h
index 2e7f71785..7f2e8d995 100644
--- a/Source/JavaScriptCore/parser/SourceProvider.h
+++ b/Source/JavaScriptCore/parser/SourceProvider.h
@@ -30,7 +30,6 @@
#define SourceProvider_h
#include "SourceProviderCache.h"
-#include "UString.h"
#include <wtf/PassOwnPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/UnusedParam.h>
@@ -42,7 +41,7 @@ namespace JSC {
public:
static const intptr_t nullID = 1;
- SourceProvider(const UString& url, const TextPosition& startPosition, SourceProviderCache* cache = 0)
+ SourceProvider(const String& url, const TextPosition& startPosition, SourceProviderCache* cache = 0)
: m_url(url)
, m_startPosition(startPosition)
, m_validated(false)
@@ -57,11 +56,11 @@ namespace JSC {
delete m_cache;
}
- virtual UString getRange(int start, int end) const = 0;
+ virtual String getRange(int start, int end) const = 0;
virtual const StringImpl* data() const = 0;
virtual int length() const = 0;
- const UString& url() { return m_url; }
+ const String& url() { return m_url; }
TextPosition startPosition() const { return m_startPosition; }
intptr_t asID()
{
@@ -80,21 +79,21 @@ namespace JSC {
private:
virtual void cacheSizeChanged(int delta) { UNUSED_PARAM(delta); }
- UString m_url;
+ String m_url;
TextPosition m_startPosition;
bool m_validated;
SourceProviderCache* m_cache;
bool m_cacheOwned;
};
- class UStringSourceProvider : public SourceProvider {
+ class StringSourceProvider : public SourceProvider {
public:
- static PassRefPtr<UStringSourceProvider> create(const UString& source, const UString& url, const TextPosition& startPosition = TextPosition::minimumPosition())
+ static PassRefPtr<StringSourceProvider> create(const String& source, const String& url, const TextPosition& startPosition = TextPosition::minimumPosition())
{
- return adoptRef(new UStringSourceProvider(source, url, startPosition));
+ return adoptRef(new StringSourceProvider(source, url, startPosition));
}
- virtual UString getRange(int start, int end) const OVERRIDE
+ virtual String getRange(int start, int end) const OVERRIDE
{
return m_source.substringSharingImpl(start, end - start);
}
@@ -102,13 +101,13 @@ namespace JSC {
int length() const { return m_source.length(); }
private:
- UStringSourceProvider(const UString& source, const UString& url, const TextPosition& startPosition)
+ StringSourceProvider(const String& source, const String& url, const TextPosition& startPosition)
: SourceProvider(url, startPosition)
, m_source(source)
{
}
- UString m_source;
+ String m_source;
};
} // namespace JSC
diff --git a/Source/JavaScriptCore/parser/SourceProviderCache.h b/Source/JavaScriptCore/parser/SourceProviderCache.h
index e94230d10..c346fba0c 100644
--- a/Source/JavaScriptCore/parser/SourceProviderCache.h
+++ b/Source/JavaScriptCore/parser/SourceProviderCache.h
@@ -34,6 +34,7 @@
namespace JSC {
class SourceProviderCache {
+ WTF_MAKE_FAST_ALLOCATED;
public:
SourceProviderCache() : m_contentByteSize(0) {}
JS_EXPORT_PRIVATE ~SourceProviderCache();
diff --git a/Source/JavaScriptCore/parser/SourceProviderCacheItem.h b/Source/JavaScriptCore/parser/SourceProviderCacheItem.h
index bfd35648e..9ca121e2a 100644
--- a/Source/JavaScriptCore/parser/SourceProviderCacheItem.h
+++ b/Source/JavaScriptCore/parser/SourceProviderCacheItem.h
@@ -33,6 +33,7 @@
namespace JSC {
class SourceProviderCacheItem {
+ WTF_MAKE_FAST_ALLOCATED;
public:
SourceProviderCacheItem(int closeBraceLine, int closeBracePos)
: closeBraceLine(closeBraceLine)
diff --git a/Source/JavaScriptCore/parser/SyntaxChecker.h b/Source/JavaScriptCore/parser/SyntaxChecker.h
index 7d44ef3c6..0e6889752 100644
--- a/Source/JavaScriptCore/parser/SyntaxChecker.h
+++ b/Source/JavaScriptCore/parser/SyntaxChecker.h
@@ -144,7 +144,7 @@ public:
ExpressionType createNull(const JSTokenLocation&) { return NullExpr; }
ExpressionType createBracketAccess(const JSTokenLocation&, ExpressionType, ExpressionType, bool, int, int, int) { return BracketExpr; }
ExpressionType createDotAccess(const JSTokenLocation&, ExpressionType, const Identifier*, int, int, int) { return DotExpr; }
- ExpressionType createRegExp(const JSTokenLocation&, const Identifier& pattern, const Identifier&, int) { return Yarr::checkSyntax(pattern.ustring()) ? 0 : RegExpExpr; }
+ ExpressionType createRegExp(const JSTokenLocation&, const Identifier& pattern, const Identifier&, int) { return Yarr::checkSyntax(pattern.string()) ? 0 : RegExpExpr; }
ExpressionType createNewExpr(const JSTokenLocation&, ExpressionType, int, int, int, int) { return NewExpr; }
ExpressionType createNewExpr(const JSTokenLocation&, ExpressionType, int, int) { return NewExpr; }
ExpressionType createConditionalExpr(const JSTokenLocation&, ExpressionType, ExpressionType, ExpressionType) { return ConditionalExpr; }