-
-
Save caitp/e47f3637adfc14908c4935c15f364301 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From ff345665906b9709aa4e4a2464f3fd8a57067508 Mon Sep 17 00:00:00 2001 | |
From: Caitlin Potter <caitp@igalia.com> | |
Date: Sun, 23 Jul 2017 10:03:23 -0400 | |
Subject: [PATCH] Fix parseProperty | |
--- | |
Source/JavaScriptCore/parser/Parser.cpp | 38 ++++++++++++--------------------- | |
1 file changed, 14 insertions(+), 24 deletions(-) | |
diff --git a/Source/JavaScriptCore/parser/Parser.cpp b/Source/JavaScriptCore/parser/Parser.cpp | |
index 62c2ee34447..376944ed6fa 100644 | |
--- a/Source/JavaScriptCore/parser/Parser.cpp | |
+++ b/Source/JavaScriptCore/parser/Parser.cpp | |
@@ -3865,12 +3865,9 @@ template <class TreeBuilder> TreeProperty Parser<LexerType>::parseProperty(TreeB | |
{ | |
SourceParseMode parseMode = SourceParseMode::MethodMode; | |
bool wasIdent = false; | |
- bool isAsync = false; | |
bool isClassProperty = false; | |
bool isStaticMethod = false; | |
- bool isAsyncGenerator = false; | |
- bool isIdentSet = false; | |
const Identifier* ident; | |
unsigned getterOrSetterStartOffset; | |
JSToken identToken; | |
@@ -3881,25 +3878,19 @@ template <class TreeBuilder> TreeProperty Parser<LexerType>::parseProperty(TreeB | |
parseProperty: | |
switch (m_token.m_type) { | |
case ASYNC: | |
- if (!isGeneratorMethodParseMode(parseMode) && !isAsyncMethodParseMode(parseMode)) { | |
- | |
+ if (parseMode == SourceParseMode::MethodMode) { | |
identToken = m_token; | |
ident = m_token.m_data.ident; | |
getterOrSetterStartOffset = tokenStart(); | |
next(); | |
- failIfTrue(m_lexer->prevTerminator(), "Expected a property name following keyword 'async'"); | |
- if (match(COLON) || match(EQUAL) || m_lexer->prevTerminator()) | |
- goto parseProperty; | |
+ if (match(COLON) || match(EQUAL) || match(OPENPAREN) || match(COMMA) || match(CLOSEBRACE)) { | |
+ wasIdent = true; | |
+ goto namedPropertyContinuation; | |
+ } | |
- if (match(OPENPAREN) || match(COMMA) || match(CLOSEBRACE)) { | |
- isIdentSet = true; | |
- goto namedProperty; | |
- } | |
+ failIfTrue(m_lexer->prevTerminator(), "Expected a property name following keyword 'async'"); | |
- isAsync = true; | |
if (UNLIKELY(consume(TIMES))) { | |
- isAsyncGenerator = true; | |
parseMode = SourceParseMode::AsyncGeneratorWrapperMethodMode; | |
} else | |
parseMode = parseMode = SourceParseMode::AsyncMethodMode; | |
@@ -3913,18 +3904,17 @@ parseProperty: | |
FALLTHROUGH; | |
case STRING: { | |
namedProperty: | |
- if (UNLIKELY(!isIdentSet)) { | |
- identToken = m_token; | |
- ident = m_token.m_data.ident; | |
- getterOrSetterStartOffset = tokenStart(); | |
- } | |
+ identToken = m_token; | |
+ ident = m_token.m_data.ident; | |
+ getterOrSetterStartOffset = tokenStart(); | |
- if (complete || (wasIdent && !isGeneratorMethodParseMode(parseMode) && (*ident == m_vm->propertyNames->get || *ident == m_vm->propertyNames->set)) || isAsync) | |
+ if (complete || (wasIdent && parseMode == SourceParseMode::MethodMode && (*ident == m_vm->propertyNames->get || *ident == m_vm->propertyNames->set))) | |
nextExpectIdentifier(LexerFlagsIgnoreReservedWords); | |
- else if (UNLIKELY(!isIdentSet)) | |
+ else | |
nextExpectIdentifier(LexerFlagsIgnoreReservedWords | TreeBuilder::DontBuildKeywords); | |
- if (!isGeneratorMethodParseMode(parseMode) && !isAsyncMethodParseMode(parseMode) && match(COLON)) { | |
+namedPropertyContinuation: | |
+ if (parseMode == SourceParseMode::MethodMode && match(COLON)) { | |
next(); | |
TreeExpression node = parseAssignmentExpressionOrPropagateErrorClass(context); | |
failIfFalse(node, "Cannot parse expression for property declaration"); | |
@@ -3938,9 +3928,9 @@ namedProperty: | |
propagateError(); | |
return context.createProperty(ident, method, PropertyNode::Constant, PropertyNode::KnownDirect, complete, SuperBinding::Needed, InferName::Allowed, isClassProperty); | |
} | |
- failIfTrue(isGeneratorMethodParseMode(parseMode) || isAsyncMethodParseMode(parseMode), "Expected a parenthesis for argument list"); | |
+ failIfTrue(parseMode != SourceParseMode::MethodMode, "Expected a parenthesis for argument list"); | |
- failIfFalse(wasIdent || isIdentSet, "Expected an identifier as property name"); | |
+ failIfFalse(wasIdent, "Expected an identifier as property name"); | |
if (match(COMMA) || match(CLOSEBRACE)) { | |
semanticFailureDueToKeywordCheckingToken(identToken, "shorthand property name"); | |
-- | |
2.11.0 (Apple Git-81) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment