diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-09-10 19:10:20 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-09-10 19:10:20 +0200 |
commit | 284837daa07b29d6a63a748544a90b1f5842ac5c (patch) | |
tree | ecd258180bde91fe741e0cfd2638beb3c6da7e8e /Source/JavaScriptCore/parser | |
parent | 2e2ba8ff45915f40ed3e014101269c175f2a89a0 (diff) | |
download | qtwebkit-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.h | 41 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/Lexer.cpp | 4 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/Lexer.h | 8 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/NodeConstructors.h | 67 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/Nodes.cpp | 9 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/Nodes.h | 109 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/Parser.cpp | 10 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/Parser.h | 92 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/ParserArena.h | 2 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/SourceCode.h | 8 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/SourceProvider.h | 21 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/SourceProviderCache.h | 1 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/SourceProviderCacheItem.h | 1 | ||||
-rw-r--r-- | Source/JavaScriptCore/parser/SyntaxChecker.h | 2 |
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(¶meters->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; } |