Skip to content

Instantly share code, notes, and snippets.

@caitp
Last active July 23, 2017 14:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save caitp/e47f3637adfc14908c4935c15f364301 to your computer and use it in GitHub Desktop.
Save caitp/e47f3637adfc14908c4935c15f364301 to your computer and use it in GitHub Desktop.
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