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

Side by Side Diff: src/parsing/parser.cc

Issue 2609663002: Use "derived" instead of "subclass" in FunctionKind to match the spec (Closed)
Patch Set: Rebased Created 3 years, 11 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 unified diff | Download patch
« no previous file with comments | « src/objects.cc ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/ast/ast-expression-rewriter.h" 10 #include "src/ast/ast-expression-rewriter.h"
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 } 165 }
166 166
167 FunctionLiteral* Parser::DefaultConstructor(const AstRawString* name, 167 FunctionLiteral* Parser::DefaultConstructor(const AstRawString* name,
168 bool call_super, int pos, 168 bool call_super, int pos,
169 int end_pos) { 169 int end_pos) {
170 int materialized_literal_count = -1; 170 int materialized_literal_count = -1;
171 int expected_property_count = -1; 171 int expected_property_count = -1;
172 const int parameter_count = 0; 172 const int parameter_count = 0;
173 if (name == nullptr) name = ast_value_factory()->empty_string(); 173 if (name == nullptr) name = ast_value_factory()->empty_string();
174 174
175 FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor 175 FunctionKind kind = call_super ? FunctionKind::kDefaultDerivedConstructor
176 : FunctionKind::kDefaultBaseConstructor; 176 : FunctionKind::kDefaultBaseConstructor;
177 DeclarationScope* function_scope = NewFunctionScope(kind); 177 DeclarationScope* function_scope = NewFunctionScope(kind);
178 SetLanguageMode(function_scope, STRICT); 178 SetLanguageMode(function_scope, STRICT);
179 // Set start and end position to the same value 179 // Set start and end position to the same value
180 function_scope->set_start_position(pos); 180 function_scope->set_start_position(pos);
181 function_scope->set_end_position(pos); 181 function_scope->set_end_position(pos);
182 ZoneList<Statement*>* body = NULL; 182 ZoneList<Statement*>* body = NULL;
183 183
184 { 184 {
185 FunctionState function_state(&function_state_, &scope_state_, 185 FunctionState function_state(&function_state_, &scope_state_,
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after
928 // must produce a FunctionLiteral. 928 // must produce a FunctionLiteral.
929 DCHECK(expression->IsFunctionLiteral()); 929 DCHECK(expression->IsFunctionLiteral());
930 result = expression->AsFunctionLiteral(); 930 result = expression->AsFunctionLiteral();
931 } else { 931 } else {
932 ok = false; 932 ok = false;
933 } 933 }
934 } 934 }
935 } 935 }
936 } else if (IsDefaultConstructor(kind)) { 936 } else if (IsDefaultConstructor(kind)) {
937 DCHECK_EQ(scope(), outer); 937 DCHECK_EQ(scope(), outer);
938 bool is_subclass_constructor = IsSubclassConstructor(kind); 938 result = DefaultConstructor(raw_name, IsDerivedConstructor(kind),
939 result = DefaultConstructor(raw_name, is_subclass_constructor,
940 info->start_position(), info->end_position()); 939 info->start_position(), info->end_position());
941 } else { 940 } else {
942 result = ParseFunctionLiteral( 941 result = ParseFunctionLiteral(
943 raw_name, Scanner::Location::invalid(), kSkipFunctionNameCheck, kind, 942 raw_name, Scanner::Location::invalid(), kSkipFunctionNameCheck, kind,
944 kNoSourcePosition, function_type, info->language_mode(), &ok); 943 kNoSourcePosition, function_type, info->language_mode(), &ok);
945 } 944 }
946 // Make sure the results agree. 945 // Make sure the results agree.
947 DCHECK(ok == (result != nullptr)); 946 DCHECK(ok == (result != nullptr));
948 } 947 }
949 948
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after
1571 DCHECK_NOT_NULL(label); 1570 DCHECK_NOT_NULL(label);
1572 if (labels != nullptr) { 1571 if (labels != nullptr) {
1573 for (int i = labels->length(); i-- > 0;) { 1572 for (int i = labels->length(); i-- > 0;) {
1574 if (labels->at(i) == label) return true; 1573 if (labels->at(i) == label) return true;
1575 } 1574 }
1576 } 1575 }
1577 return false; 1576 return false;
1578 } 1577 }
1579 1578
1580 Expression* Parser::RewriteReturn(Expression* return_value, int pos) { 1579 Expression* Parser::RewriteReturn(Expression* return_value, int pos) {
1581 if (IsSubclassConstructor(function_state_->kind())) { 1580 if (IsDerivedConstructor(function_state_->kind())) {
1582 // For subclass constructors we need to return this in case of undefined 1581 // For subclass constructors we need to return this in case of undefined
1583 // return a Smi (transformed into an exception in the ConstructStub) 1582 // return a Smi (transformed into an exception in the ConstructStub)
1584 // for a non object. 1583 // for a non object.
1585 // 1584 //
1586 // return expr; 1585 // return expr;
1587 // 1586 //
1588 // Is rewritten as: 1587 // Is rewritten as:
1589 // 1588 //
1590 // return (temp = expr) === undefined ? this : 1589 // return (temp = expr) === undefined ? this :
1591 // %_IsJSReceiver(temp) ? temp : 1; 1590 // %_IsJSReceiver(temp) ? temp : 1;
(...skipping 1596 matching lines...) Expand 10 before | Expand all | Expand 10 after
3188 kNoSourcePosition), 3187 kNoSourcePosition),
3189 zone()); 3188 zone());
3190 } else if (IsAsyncFunction(kind)) { 3189 } else if (IsAsyncFunction(kind)) {
3191 const bool accept_IN = true; 3190 const bool accept_IN = true;
3192 ParseAsyncFunctionBody(inner_scope, body, kind, FunctionBodyType::kNormal, 3191 ParseAsyncFunctionBody(inner_scope, body, kind, FunctionBodyType::kNormal,
3193 accept_IN, pos, CHECK_OK); 3192 accept_IN, pos, CHECK_OK);
3194 } else { 3193 } else {
3195 ParseStatementList(body, Token::RBRACE, CHECK_OK); 3194 ParseStatementList(body, Token::RBRACE, CHECK_OK);
3196 } 3195 }
3197 3196
3198 if (IsSubclassConstructor(kind)) { 3197 if (IsDerivedConstructor(kind)) {
3199 body->Add(factory()->NewReturnStatement(ThisExpression(kNoSourcePosition), 3198 body->Add(factory()->NewReturnStatement(ThisExpression(kNoSourcePosition),
3200 kNoSourcePosition), 3199 kNoSourcePosition),
3201 zone()); 3200 zone());
3202 } 3201 }
3203 } 3202 }
3204 3203
3205 Expect(Token::RBRACE, CHECK_OK); 3204 Expect(Token::RBRACE, CHECK_OK);
3206 scope()->set_end_position(scanner()->location().end_pos); 3205 scope()->set_end_position(scanner()->location().end_pos);
3207 3206
3208 if (!parameters.is_simple) { 3207 if (!parameters.is_simple) {
(...skipping 1922 matching lines...) Expand 10 before | Expand all | Expand 10 after
5131 5130
5132 return final_loop; 5131 return final_loop;
5133 } 5132 }
5134 5133
5135 #undef CHECK_OK 5134 #undef CHECK_OK
5136 #undef CHECK_OK_VOID 5135 #undef CHECK_OK_VOID
5137 #undef CHECK_FAILED 5136 #undef CHECK_FAILED
5138 5137
5139 } // namespace internal 5138 } // namespace internal
5140 } // namespace v8 5139 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | src/parsing/parser-base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698