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

Side by Side Diff: src/parser.cc

Issue 1314203002: [strong] Class constructor bodies cannot contain "use strong" directive (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: formatting Created 5 years, 3 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
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/parser.h" 5 #include "src/parser.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/ast-literal-reindexer.h" 9 #include "src/ast-literal-reindexer.h"
10 #include "src/bailout-reason.h" 10 #include "src/bailout-reason.h"
(...skipping 1303 matching lines...) Expand 10 before | Expand all | Expand 10 after
1314 ast_value_factory()->use_strict_string() && 1314 ast_value_factory()->use_strict_string() &&
1315 token_loc.end_pos - token_loc.beg_pos == 1315 token_loc.end_pos - token_loc.beg_pos ==
1316 ast_value_factory()->use_strict_string()->length() + 2; 1316 ast_value_factory()->use_strict_string()->length() + 2;
1317 bool use_strong_found = 1317 bool use_strong_found =
1318 allow_strong_mode() && 1318 allow_strong_mode() &&
1319 literal->raw_value()->AsString() == 1319 literal->raw_value()->AsString() ==
1320 ast_value_factory()->use_strong_string() && 1320 ast_value_factory()->use_strong_string() &&
1321 token_loc.end_pos - token_loc.beg_pos == 1321 token_loc.end_pos - token_loc.beg_pos ==
1322 ast_value_factory()->use_strong_string()->length() + 2; 1322 ast_value_factory()->use_strong_string()->length() + 2;
1323 if (use_strict_found || use_strong_found) { 1323 if (use_strict_found || use_strong_found) {
1324 // Strong mode implies strict mode. If there are several "use strict"
1325 // / "use strong" directives, do the strict mode changes only once.
1326 if (is_sloppy(scope_->language_mode())) {
1327 scope_->SetLanguageMode(
1328 static_cast<LanguageMode>(scope_->language_mode() | STRICT));
1329 }
1330
1331 if (use_strong_found) {
1332 scope_->SetLanguageMode(
1333 static_cast<LanguageMode>(scope_->language_mode() | STRONG));
1334 if (i::IsConstructor(function_state_->kind())) {
1335 // "use strong" cannot occur in a class constructor body, to avoid
1336 // unintuitive strong class object semantics.
1337 ParserTraits::ReportMessageAt(
1338 token_loc, MessageTemplate::kStrongConstructorDirective);
1339 *ok = false;
1340 return nullptr;
1341 }
1342 }
1324 if (!scope_->HasSimpleParameters()) { 1343 if (!scope_->HasSimpleParameters()) {
1325 // TC39 deemed "use strict" directives to be an error when occurring 1344 // TC39 deemed "use strict" directives to be an error when occurring
1326 // in the body of a function with non-simple parameter list, on 1345 // in the body of a function with non-simple parameter list, on
1327 // 29/7/2015. https://goo.gl/ueA7Ln 1346 // 29/7/2015. https://goo.gl/ueA7Ln
1328 // 1347 //
1329 // In V8, this also applies to "use strong " directives. 1348 // In V8, this also applies to "use strong " directives.
1330 const AstRawString* string = literal->raw_value()->AsString(); 1349 const AstRawString* string = literal->raw_value()->AsString();
1331 ParserTraits::ReportMessageAt( 1350 ParserTraits::ReportMessageAt(
1332 token_loc, MessageTemplate::kIllegalLanguageModeDirective, 1351 token_loc, MessageTemplate::kIllegalLanguageModeDirective,
1333 string); 1352 string);
1334 *ok = false; 1353 *ok = false;
1335 return nullptr; 1354 return nullptr;
1336 } 1355 }
1337
1338 // Strong mode implies strict mode. If there are several "use strict"
1339 // / "use strong" directives, do the strict mode changes only once.
1340 if (is_sloppy(scope_->language_mode())) {
1341 scope_->SetLanguageMode(static_cast<LanguageMode>(
1342 scope_->language_mode() | STRICT));
1343 }
1344
1345 if (use_strong_found) {
1346 scope_->SetLanguageMode(static_cast<LanguageMode>(
1347 scope_->language_mode() | STRONG));
1348 }
1349 // Because declarations in strict eval code don't leak into the scope 1356 // Because declarations in strict eval code don't leak into the scope
1350 // of the eval call, it is likely that functions declared in strict 1357 // of the eval call, it is likely that functions declared in strict
1351 // eval code will be used within the eval code, so lazy parsing is 1358 // eval code will be used within the eval code, so lazy parsing is
1352 // probably not a win. 1359 // probably not a win.
1353 if (scope_->is_eval_scope()) mode_ = PARSE_EAGERLY; 1360 if (scope_->is_eval_scope()) mode_ = PARSE_EAGERLY;
1354 } else if (literal->raw_value()->AsString() == 1361 } else if (literal->raw_value()->AsString() ==
1355 ast_value_factory()->use_asm_string() && 1362 ast_value_factory()->use_asm_string() &&
1356 token_loc.end_pos - token_loc.beg_pos == 1363 token_loc.end_pos - token_loc.beg_pos ==
1357 ast_value_factory()->use_asm_string()->length() + 2) { 1364 ast_value_factory()->use_asm_string()->length() + 2) {
1358 // Store the usage count; The actual use counter on the isolate is 1365 // Store the usage count; The actual use counter on the isolate is
(...skipping 4744 matching lines...) Expand 10 before | Expand all | Expand 10 after
6103 6110
6104 Expression* Parser::SpreadCallNew(Expression* function, 6111 Expression* Parser::SpreadCallNew(Expression* function,
6105 ZoneList<v8::internal::Expression*>* args, 6112 ZoneList<v8::internal::Expression*>* args,
6106 int pos) { 6113 int pos) {
6107 args->InsertAt(0, function, zone()); 6114 args->InsertAt(0, function, zone());
6108 6115
6109 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos); 6116 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos);
6110 } 6117 }
6111 } // namespace internal 6118 } // namespace internal
6112 } // namespace v8 6119 } // namespace v8
OLDNEW
« no previous file with comments | « src/messages.h ('k') | src/preparser.cc » ('j') | test/mjsunit/strong/function-arity.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698