Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(832)

Unified Diff: src/preparser.h

Issue 382893003: Implement basic code generation for arrow functions (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Test failures fixed, some minor corrections Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/preparser.h
diff --git a/src/preparser.h b/src/preparser.h
index 15104aede398b7e0f8c6e00173b17cfacad73da6..1ea2a2284a7b49382ba3f3ec957600c21cb361a2 100644
--- a/src/preparser.h
+++ b/src/preparser.h
@@ -1010,7 +1010,7 @@ class PreParserFactory {
FunctionLiteral::FunctionType function_type,
FunctionLiteral::IsFunctionFlag is_function,
FunctionLiteral::IsParenthesizedFlag is_parenthesized,
- FunctionLiteral::IsGeneratorFlag is_generator, int position) {
+ FunctionLiteral::KindFlag kind, int position) {
return PreParserExpression::Default();
}
@@ -1112,6 +1112,11 @@ class PreParserTraits {
// PreParser should not use FuncNameInferrer.
UNREACHABLE();
}
+ static void InferFunctionName(FuncNameInferrer* fni,
+ PreParserExpression expression) {
+ // PreParser should not use FuncNameInferrer.
+ UNREACHABLE();
+ }
static void CheckFunctionLiteralInsideTopLevelObjectLiteral(
PreParserScope* scope, PreParserExpression value, bool* has_function) {}
@@ -1708,8 +1713,8 @@ ParserBase<Traits>::ParsePrimaryExpression(bool* ok) {
// Arrow functions are the only expression type constructions
// for which an empty parameter list "()" is valid input.
Consume(Token::RPAREN);
- return this->ParseArrowFunctionLiteral(pos, this->EmptyArrowParamList(),
- CHECK_OK);
+ result = this->ParseArrowFunctionLiteral(
+ pos, this->EmptyArrowParamList(), CHECK_OK);
} else {
// Heuristically try to detect immediately called functions before
// seeing the call parentheses.
@@ -2003,9 +2008,11 @@ ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, bool* ok) {
ExpressionT expression =
this->ParseConditionalExpression(accept_IN, CHECK_OK);
- if (allow_arrow_functions() && peek() == Token::ARROW)
- return this->ParseArrowFunctionLiteral(lhs_location.beg_pos, expression,
- CHECK_OK);
+ if (allow_arrow_functions() && peek() == Token::ARROW) {
+ expression = this->ParseArrowFunctionLiteral(lhs_location.beg_pos,
+ expression, CHECK_OK);
+ return expression;
+ }
if (!Token::IsAssignmentOp(peek())) {
if (fni_ != NULL) fni_->Leave();
@@ -2476,8 +2483,12 @@ ParserBase<Traits>::ParseArrowFunctionLiteralBody(
const Scanner::Location& reserved_loc,
FunctionLiteral::IsParenthesizedFlag parenthesized, int start_pos,
bool* ok) {
+ typename Traits::Type::StatementList body;
+ typename Traits::Type::AstProperties ast_properties;
+ BailoutReason dont_optimize_reason = kNoReason;
int materialized_literal_count = -1;
int expected_property_count = -1;
+ int handler_count = 0;
Expect(Token::ARROW, CHECK_OK);
@@ -2487,18 +2498,29 @@ ParserBase<Traits>::ParseArrowFunctionLiteralBody(
bool is_lazily_parsed =
(mode() == PARSE_LAZILY && scope_->AllowsLazyCompilation());
if (is_lazily_parsed) {
+ body = this->NewStatementList(0, zone());
this->SkipLazyFunctionBody(this->EmptyIdentifier(),
&materialized_literal_count,
&expected_property_count, CHECK_OK);
} else {
- this->ParseEagerFunctionBody(this->EmptyIdentifier(),
- RelocInfo::kNoPosition, NULL,
- Token::INIT_VAR, false, // Not a generator.
- CHECK_OK);
+ body = this->ParseEagerFunctionBody(
+ this->EmptyIdentifier(), RelocInfo::kNoPosition, NULL,
+ Token::INIT_VAR, false, // Not a generator.
+ CHECK_OK);
+ materialized_literal_count = function_state->materialized_literal_count();
+ expected_property_count = function_state->expected_property_count();
+ handler_count = function_state->handler_count();
}
} else {
// Single-expression body
- ParseAssignmentExpression(true, CHECK_OK);
+ int pos = position();
+ parenthesized_function_ = false;
+ ExpressionT expression = ParseAssignmentExpression(true, CHECK_OK);
+ body = this->NewStatementList(1, zone());
+ body->Add(factory()->NewReturnStatement(expression, pos), zone());
+ materialized_literal_count = function_state->materialized_literal_count();
+ expected_property_count = function_state->expected_property_count();
+ handler_count = function_state->handler_count();
}
scope->set_start_position(start_pos);
@@ -2518,16 +2540,22 @@ ParserBase<Traits>::ParseArrowFunctionLiteralBody(
if (allow_harmony_scoping() && strict_mode() == STRICT)
this->CheckConflictingVarDeclarations(scope, CHECK_OK);
- // TODO(aperez): Generate a proper FunctionLiteral instead of
- // returning a dummy value.
+ ast_properties = *factory()->visitor()->ast_properties();
+ dont_optimize_reason = factory()->visitor()->dont_optimize_reason();
+
FunctionLiteralT function_literal = factory()->NewFunctionLiteral(
- this->EmptyIdentifierString(), this->ast_value_factory(), scope,
- this->NewStatementList(0, zone()), 0, 0, 0, num_parameters,
- FunctionLiteral::kNoDuplicateParameters,
+ this->EmptyIdentifierString(), this->ast_value_factory(), scope, body,
+ materialized_literal_count, expected_property_count, handler_count,
+ num_parameters, FunctionLiteral::kNoDuplicateParameters,
FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction,
- FunctionLiteral::kNotParenthesized, FunctionLiteral::kNotGenerator,
- start_pos);
+ parenthesized, FunctionLiteral::kArrowFunction, start_pos);
+
function_literal->set_function_token_position(start_pos);
+ function_literal->set_ast_properties(&ast_properties);
+ function_literal->set_dont_optimize_reason(dont_optimize_reason);
+
+ if (fni_ != NULL) this->InferFunctionName(fni_, function_literal);
+
return function_literal;
}
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698