From cfd86b747d32ac22246a1aa908eaa720c63a88c1 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Wed, 7 Nov 2012 11:22:47 +0100 Subject: Imported WebKit commit 20271caf2e2c016d5cef40184cddeefeac4f1876 (http://svn.webkit.org/repository/webkit/trunk@133733) New snapshot that contains all previous fixes as well as build fix for latest QtMultimedia API changes. --- Source/JavaScriptCore/parser/Parser.h | 74 ++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 18 deletions(-) (limited to 'Source/JavaScriptCore/parser/Parser.h') diff --git a/Source/JavaScriptCore/parser/Parser.h b/Source/JavaScriptCore/parser/Parser.h index 3b0316f81..615d09eb7 100644 --- a/Source/JavaScriptCore/parser/Parser.h +++ b/Source/JavaScriptCore/parser/Parser.h @@ -76,6 +76,49 @@ COMPILE_ASSERT(LastUntaggedToken < 64, LessThan64UntaggedTokens); enum SourceElementsMode { CheckForStrictMode, DontCheckForStrictMode }; enum FunctionRequirements { FunctionNoRequirements, FunctionNeedsName }; +struct ParserError { + enum ErrorType { ErrorNone, StackOverflow, SyntaxError, EvalError, OutOfMemory } m_type; + String m_message; + int m_line; + ParserError() + : m_type(ErrorNone) + , m_line(-1) + { + } + + ParserError(ErrorType type) + : m_type(type) + , m_line(-1) + { + } + + ParserError(ErrorType type, String msg, int line) + : m_type(type) + , m_message(msg) + , m_line(line) + { + } + + JSObject* toErrorObject(JSGlobalObject* globalObject, const SourceCode& source) + { + switch (m_type) { + case ErrorNone: + return 0; + case SyntaxError: + return addErrorInfo(globalObject->globalExec(), createSyntaxError(globalObject, m_message), m_line, source); + case EvalError: + return createSyntaxError(globalObject, m_message); + case StackOverflow: + return createStackOverflowError(globalObject); + case OutOfMemory: + return createOutOfMemoryError(globalObject); + } + CRASH(); + return createOutOfMemoryError(globalObject); // Appease Qt bot + } + +}; + template inline bool isEvalNode() { return false; } template <> inline bool isEvalNode() { return true; } @@ -370,7 +413,7 @@ public: ~Parser(); template - PassRefPtr parse(JSGlobalObject* lexicalGlobalObject, Debugger*, ExecState*, JSObject**); + PassRefPtr parse(ParserError&); private: struct AllowInOverride { @@ -890,7 +933,7 @@ private: return m_lastTokenEnd; } - mutable const JSGlobalData* m_globalData; + JSGlobalData* m_globalData; const SourceCode* m_source; ParserArena* m_arena; OwnPtr m_lexer; @@ -935,12 +978,11 @@ private: }; }; + template template -PassRefPtr Parser::parse(JSGlobalObject* lexicalGlobalObject, Debugger* debugger, ExecState* debuggerExecState, JSObject** exception) +PassRefPtr Parser::parse(ParserError& error) { - ASSERT(lexicalGlobalObject); - ASSERT(exception && !*exception); int errLine; String errMsg; @@ -971,7 +1013,7 @@ PassRefPtr Parser::parse(JSGlobalObject* lexicalGlobalObj JSTokenLocation location; location.line = m_lexer->lastLineNumber(); location.column = m_lexer->currentColumnNumber(); - result = ParsedNode::create(&lexicalGlobalObject->globalData(), + result = ParsedNode::create(m_globalData, location, m_sourceElements, m_varDeclarations ? &m_varDeclarations->data : 0, @@ -981,7 +1023,7 @@ PassRefPtr Parser::parse(JSGlobalObject* lexicalGlobalObj m_features, m_numConstants); result->setLoc(m_source->firstLine(), m_lastLine, m_lexer->currentColumnNumber()); - } else if (lexicalGlobalObject) { + } else { // We can never see a syntax error when reparsing a function, since we should have // reported the error when parsing the containing program or eval code. So if we're // parsing a function body node, we assume that what actually happened here is that @@ -989,35 +1031,31 @@ PassRefPtr Parser::parse(JSGlobalObject* lexicalGlobalObj // code we assume that it was a syntax error since running out of stack is much less // likely, and we are currently unable to distinguish between the two cases. if (isFunctionBodyNode(static_cast(0)) || m_hasStackOverflow) - *exception = createStackOverflowError(lexicalGlobalObject); + error = ParserError::StackOverflow; else if (isEvalNode()) - *exception = createSyntaxError(lexicalGlobalObject, errMsg); + error = ParserError(ParserError::EvalError, errMsg, errLine); else - *exception = addErrorInfo(lexicalGlobalObject->globalExec(), createSyntaxError(lexicalGlobalObject, errMsg), errLine, *m_source); + error = ParserError(ParserError::SyntaxError, errMsg, errLine); } - if (debugger && !ParsedNode::scopeIsFunction) - debugger->sourceParsed(debuggerExecState, m_source->provider(), errLine, errMsg); - m_arena->reset(); return result.release(); } template -PassRefPtr parse(JSGlobalData* globalData, JSGlobalObject* lexicalGlobalObject, const SourceCode& source, FunctionParameters* parameters, const Identifier& name, JSParserStrictness strictness, JSParserMode parserMode, Debugger* debugger, ExecState* execState, JSObject** exception) +PassRefPtr parse(JSGlobalData* globalData, const SourceCode& source, FunctionParameters* parameters, const Identifier& name, JSParserStrictness strictness, JSParserMode parserMode, ParserError& error) { SamplingRegion samplingRegion("Parsing"); ASSERT(!source.provider()->source().isNull()); - if (source.provider()->source().is8Bit()) { Parser< Lexer > parser(globalData, source, parameters, name, strictness, parserMode); - return parser.parse(lexicalGlobalObject, debugger, execState, exception); + return parser.parse(error); } Parser< Lexer > parser(globalData, source, parameters, name, strictness, parserMode); - return parser.parse(lexicalGlobalObject, debugger, execState, exception); + return parser.parse(error); } -} // namespace +} // namespace #endif -- cgit v1.2.1