Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index d882c1e69d9ecff0c360bf38febc05bef241ce2c..99f952232b04094c653e0023bbf8247ee5652a7c 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -782,6 +782,7 @@ Parser::Parser(CompilationInfo* info) |
set_allow_lazy(false); // Must be explicitly enabled. |
set_allow_generators(FLAG_harmony_generators); |
set_allow_for_of(FLAG_harmony_iteration); |
+ set_allow_arrow_functions(FLAG_harmony_arrow_functions); |
set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); |
for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; |
++feature) { |
@@ -3318,6 +3319,79 @@ Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { |
} |
+Vector<VariableProxy*> ParserTraits::ParameterListFromExpression( |
marja
2014/07/01 07:23:40
Comment from the previous round:
Here you have th
|
+ Expression* expression) { |
+ // Parsing the parameter list of an arrow function does not have parameters |
+ // (as in: () => ...) returns NULL, so expression being NULL is not an error, |
+ // but an valid empty parameter list. |
+ if (expression == NULL) |
+ return Vector<VariableProxy*>::empty(); |
+ |
+ Collector<VariableProxy*> collector; |
+ |
+ // IsValidArrowFunctionParamterList() can be used to check for validity, |
+ // here we just ASSERT() that the passed expression is a valid param list. |
+ while (expression->IsBinaryOperation()) { |
+ BinaryOperation* binop = expression->AsBinaryOperation(); |
+ ASSERT_EQ(binop->op(), Token::COMMA); |
+ |
+ expression = binop->right(); |
+ ASSERT(expression->IsVariableProxy()); |
+ ASSERT(!expression->AsVariableProxy()->is_this()); |
+ ASSERT(!IsEvalOrArguments(expression->AsVariableProxy()->raw_name())); |
+ ASSERT(!IsFutureStrictReserved(expression->AsVariableProxy()->raw_name())); |
+ |
+ collector.Add(expression->AsVariableProxy()); |
+ expression = binop->left(); |
+ } |
+ |
+ // Add the remaining item. |
+ ASSERT(expression->IsVariableProxy()); |
+ ASSERT(!expression->AsVariableProxy()->is_this()); |
+ ASSERT(!IsEvalOrArguments(expression->AsVariableProxy()->raw_name())); |
+ ASSERT(!IsFutureStrictReserved(expression->AsVariableProxy()->raw_name())); |
+ |
+ collector.Add(expression->AsVariableProxy()); |
+ return collector.ToVector(); |
+} |
+ |
+ |
+bool ParserTraits::IsValidArrowFunctionParameterList(Expression* expression) { |
+ // Case for empty parameter lists: |
+ // () => ... |
+ if (expression == NULL) |
+ return true; |
+ |
+ // Too many parentheses around expression: |
+ // (( ... )) => ... |
+ if (expression->parenthesization_level() > 1) |
+ return false; |
+ |
+ // Case for a single parameter: |
+ // (foo) => ... |
+ // foo => ... |
+ if (expression->IsVariableProxy()) { |
+ if (expression->AsVariableProxy()->is_this()) return false; |
+ const AstRawString* raw_name = expression->AsVariableProxy()->raw_name(); |
+ return !(IsEvalOrArguments(raw_name) || IsFutureStrictReserved(raw_name)); |
+ } |
+ |
+ // Case for more than one parameter: |
+ // (foo, bar [, ...]) => ... |
+ if (expression->IsBinaryOperation()) { |
+ BinaryOperation* binop = expression->AsBinaryOperation(); |
+ return binop->op() == Token::COMMA && |
+ !binop->right()->is_parenthesized() && |
+ !binop->left()->is_parenthesized() && |
+ IsValidArrowFunctionParameterList(binop->right()) && |
+ IsValidArrowFunctionParameterList(binop->left()); |
+ } |
+ |
+ // Any other kind of expression is not a valid parameter list. |
+ return false; |
+} |
+ |
+ |
FunctionLiteral* Parser::ParseFunctionLiteral( |
const AstRawString* function_name, |
Scanner::Location function_name_location, |
@@ -3737,6 +3811,7 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( |
reusable_preparser_->set_allow_lazy(true); |
reusable_preparser_->set_allow_generators(allow_generators()); |
reusable_preparser_->set_allow_for_of(allow_for_of()); |
+ reusable_preparser_->set_allow_arrow_functions(allow_arrow_functions()); |
reusable_preparser_->set_allow_harmony_numeric_literals( |
allow_harmony_numeric_literals()); |
} |