Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index e3e561a31856c1329d998663063e11100ca04db6..a7a31e7173593e67036cf4ffb9de14bb79f2e478 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -916,6 +916,7 @@ Parser::Parser(ParseInfo* info) |
set_allow_harmony_sloppy_function(FLAG_harmony_sloppy_function); |
set_allow_harmony_sloppy_let(FLAG_harmony_sloppy_let); |
set_allow_harmony_rest_parameters(FLAG_harmony_rest_parameters); |
+ set_allow_harmony_default_parameters(FLAG_harmony_default_parameters); |
set_allow_harmony_spreadcalls(FLAG_harmony_spreadcalls); |
set_allow_harmony_destructuring(FLAG_harmony_destructuring); |
set_allow_harmony_spread_arrays(FLAG_harmony_spread_arrays); |
@@ -3910,7 +3911,19 @@ void ParserTraits::ParseArrowFunctionFormalParameters( |
parser_->scope_->RemoveUnresolved(expr->AsVariableProxy()); |
} |
- AddFormalParameter(parameters, expr, is_rest); |
+ Expression* initializer = nullptr; |
+ if (!is_rest && parser_->allow_harmony_default_parameters() && |
+ parser_->Check(Token::ASSIGN)) { |
wingo
2015/08/24 14:10:10
How on earth does this work? This function is cal
rossberg
2015/08/24 14:18:15
You are right, it doesn't make sense. 8} Not sure
|
+ ExpressionClassifier init_classifier; |
+ initializer = |
+ parser_->ParseAssignmentExpression(true, &init_classifier, ok); |
+ if (!*ok) return; |
+ parser_->ValidateExpression(&init_classifier, ok); |
+ if (!*ok) return; |
+ parameters->is_simple = false; |
+ } |
+ |
+ AddFormalParameter(parameters, expr, initializer, is_rest); |
} |
@@ -4329,9 +4342,22 @@ Block* Parser::BuildParameterInitializationBlock( |
descriptor.declaration_pos = parameter.pattern->position(); |
descriptor.initialization_pos = parameter.pattern->position(); |
descriptor.init_op = Token::INIT_LET; |
+ Expression* initial_value = |
+ factory()->NewVariableProxy(parameters.scope->parameter(i)); |
+ if (parameter.initializer != nullptr) { |
+ // IS_UNDEFINED($param) ? initializer : $param |
+ auto condition = factory()->NewCompareOperation( |
+ Token::EQ_STRICT, |
+ factory()->NewVariableProxy(parameters.scope->parameter(i)), |
+ factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), |
+ RelocInfo::kNoPosition); |
+ initial_value = factory()->NewConditional( |
+ condition, parameter.initializer, initial_value, |
+ RelocInfo::kNoPosition); |
+ descriptor.initialization_pos = parameter.initializer->position(); |
+ } |
DeclarationParsingResult::Declaration decl( |
- parameter.pattern, parameter.pattern->position(), |
- factory()->NewVariableProxy(parameters.scope->parameter(i))); |
+ parameter.pattern, parameter.pattern->position(), initial_value); |
PatternRewriter::DeclareAndInitializeVariables(init_block, &descriptor, |
&decl, nullptr, CHECK_OK); |
} |
@@ -4497,6 +4523,7 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( |
SET_ALLOW(harmony_sloppy); |
SET_ALLOW(harmony_sloppy_let); |
SET_ALLOW(harmony_rest_parameters); |
+ SET_ALLOW(harmony_default_parameters); |
SET_ALLOW(harmony_spreadcalls); |
SET_ALLOW(harmony_destructuring); |
SET_ALLOW(harmony_spread_arrays); |