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

Side by Side Diff: src/parser.cc

Issue 1429173002: Add strict mode, sloppy mode and strong mode UseCounters (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: RaiseLanguageMode Created 5 years, 1 month 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/parser.h ('k') | test/cctest/test-parsing.cc » ('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/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 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 LanguageMode language_mode) { 339 LanguageMode language_mode) {
340 int materialized_literal_count = -1; 340 int materialized_literal_count = -1;
341 int expected_property_count = -1; 341 int expected_property_count = -1;
342 int parameter_count = 0; 342 int parameter_count = 0;
343 const AstRawString* name = ast_value_factory()->empty_string(); 343 const AstRawString* name = ast_value_factory()->empty_string();
344 344
345 345
346 FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor 346 FunctionKind kind = call_super ? FunctionKind::kDefaultSubclassConstructor
347 : FunctionKind::kDefaultBaseConstructor; 347 : FunctionKind::kDefaultBaseConstructor;
348 Scope* function_scope = NewScope(scope, FUNCTION_SCOPE, kind); 348 Scope* function_scope = NewScope(scope, FUNCTION_SCOPE, kind);
349 function_scope->SetLanguageMode( 349 SetLanguageMode(function_scope,
350 static_cast<LanguageMode>(language_mode | STRICT)); 350 static_cast<LanguageMode>(language_mode | STRICT));
351 // Set start and end position to the same value 351 // Set start and end position to the same value
352 function_scope->set_start_position(pos); 352 function_scope->set_start_position(pos);
353 function_scope->set_end_position(pos); 353 function_scope->set_end_position(pos);
354 ZoneList<Statement*>* body = NULL; 354 ZoneList<Statement*>* body = NULL;
355 355
356 { 356 {
357 AstNodeFactory function_factory(ast_value_factory()); 357 AstNodeFactory function_factory(ast_value_factory());
358 FunctionState function_state(&function_state_, &scope_, function_scope, 358 FunctionState function_state(&function_state_, &scope_, function_scope,
359 kind, &function_factory); 359 kind, &function_factory);
360 360
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 } 1042 }
1043 1043
1044 scope->set_start_position(0); 1044 scope->set_start_position(0);
1045 1045
1046 // Enter 'scope' with the given parsing mode. 1046 // Enter 'scope' with the given parsing mode.
1047 ParsingModeScope parsing_mode_scope(this, parsing_mode); 1047 ParsingModeScope parsing_mode_scope(this, parsing_mode);
1048 AstNodeFactory function_factory(ast_value_factory()); 1048 AstNodeFactory function_factory(ast_value_factory());
1049 FunctionState function_state(&function_state_, &scope_, scope, 1049 FunctionState function_state(&function_state_, &scope_, scope,
1050 kNormalFunction, &function_factory); 1050 kNormalFunction, &function_factory);
1051 1051
1052 // Don't count the mode in the use counters--give the program a chance
1053 // to enable script/module-wide strict/strong mode below.
1052 scope_->SetLanguageMode(info->language_mode()); 1054 scope_->SetLanguageMode(info->language_mode());
1053 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); 1055 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
1054 bool ok = true; 1056 bool ok = true;
1055 int beg_pos = scanner()->location().beg_pos; 1057 int beg_pos = scanner()->location().beg_pos;
1056 if (info->is_module()) { 1058 if (info->is_module()) {
1057 ParseModuleItemList(body, &ok); 1059 ParseModuleItemList(body, &ok);
1058 } else { 1060 } else {
1059 ParseStatementList(body, Token::EOS, &ok); 1061 ParseStatementList(body, Token::EOS, &ok);
1060 } 1062 }
1061 1063
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1184 FunctionLiteral::FunctionType function_type = shared_info->is_expression() 1186 FunctionLiteral::FunctionType function_type = shared_info->is_expression()
1185 ? (shared_info->is_anonymous() 1187 ? (shared_info->is_anonymous()
1186 ? FunctionLiteral::ANONYMOUS_EXPRESSION 1188 ? FunctionLiteral::ANONYMOUS_EXPRESSION
1187 : FunctionLiteral::NAMED_EXPRESSION) 1189 : FunctionLiteral::NAMED_EXPRESSION)
1188 : FunctionLiteral::DECLARATION; 1190 : FunctionLiteral::DECLARATION;
1189 bool ok = true; 1191 bool ok = true;
1190 1192
1191 if (shared_info->is_arrow()) { 1193 if (shared_info->is_arrow()) {
1192 Scope* scope = 1194 Scope* scope =
1193 NewScope(scope_, FUNCTION_SCOPE, FunctionKind::kArrowFunction); 1195 NewScope(scope_, FUNCTION_SCOPE, FunctionKind::kArrowFunction);
1194 scope->SetLanguageMode(shared_info->language_mode()); 1196 SetLanguageMode(scope, shared_info->language_mode());
1195 scope->set_start_position(shared_info->start_position()); 1197 scope->set_start_position(shared_info->start_position());
1196 ExpressionClassifier formals_classifier; 1198 ExpressionClassifier formals_classifier;
1197 ParserFormalParameters formals(scope); 1199 ParserFormalParameters formals(scope);
1198 Checkpoint checkpoint(this); 1200 Checkpoint checkpoint(this);
1199 { 1201 {
1200 // Parsing patterns as variable reference expression creates 1202 // Parsing patterns as variable reference expression creates
1201 // NewUnresolved references in current scope. Entrer arrow function 1203 // NewUnresolved references in current scope. Entrer arrow function
1202 // scope for formal parameter parsing. 1204 // scope for formal parameter parsing.
1203 BlockState block_state(&scope_, scope); 1205 BlockState block_state(&scope_, scope);
1204 if (Check(Token::LPAREN)) { 1206 if (Check(Token::LPAREN)) {
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1329 bool use_strong_found = 1331 bool use_strong_found =
1330 allow_strong_mode() && 1332 allow_strong_mode() &&
1331 literal->raw_value()->AsString() == 1333 literal->raw_value()->AsString() ==
1332 ast_value_factory()->use_strong_string() && 1334 ast_value_factory()->use_strong_string() &&
1333 token_loc.end_pos - token_loc.beg_pos == 1335 token_loc.end_pos - token_loc.beg_pos ==
1334 ast_value_factory()->use_strong_string()->length() + 2; 1336 ast_value_factory()->use_strong_string()->length() + 2;
1335 if (use_strict_found || use_strong_found) { 1337 if (use_strict_found || use_strong_found) {
1336 // Strong mode implies strict mode. If there are several "use strict" 1338 // Strong mode implies strict mode. If there are several "use strict"
1337 // / "use strong" directives, do the strict mode changes only once. 1339 // / "use strong" directives, do the strict mode changes only once.
1338 if (is_sloppy(scope_->language_mode())) { 1340 if (is_sloppy(scope_->language_mode())) {
1339 scope_->SetLanguageMode( 1341 RaiseLanguageMode(STRICT);
1340 static_cast<LanguageMode>(scope_->language_mode() | STRICT));
1341 } 1342 }
1342 1343
1343 if (use_strong_found) { 1344 if (use_strong_found) {
1344 scope_->SetLanguageMode( 1345 RaiseLanguageMode(STRONG);
1345 static_cast<LanguageMode>(scope_->language_mode() | STRONG));
1346 if (IsClassConstructor(function_state_->kind())) { 1346 if (IsClassConstructor(function_state_->kind())) {
1347 // "use strong" cannot occur in a class constructor body, to avoid 1347 // "use strong" cannot occur in a class constructor body, to avoid
1348 // unintuitive strong class object semantics. 1348 // unintuitive strong class object semantics.
1349 ParserTraits::ReportMessageAt( 1349 ParserTraits::ReportMessageAt(
1350 token_loc, MessageTemplate::kStrongConstructorDirective); 1350 token_loc, MessageTemplate::kStrongConstructorDirective);
1351 *ok = false; 1351 *ok = false;
1352 return nullptr; 1352 return nullptr;
1353 } 1353 }
1354 } 1354 }
1355 if (!scope_->HasSimpleParameters()) { 1355 if (!scope_->HasSimpleParameters()) {
(...skipping 15 matching lines...) Expand all
1371 // probably not a win. 1371 // probably not a win.
1372 if (scope_->is_eval_scope()) mode_ = PARSE_EAGERLY; 1372 if (scope_->is_eval_scope()) mode_ = PARSE_EAGERLY;
1373 } else if (literal->raw_value()->AsString() == 1373 } else if (literal->raw_value()->AsString() ==
1374 ast_value_factory()->use_asm_string() && 1374 ast_value_factory()->use_asm_string() &&
1375 token_loc.end_pos - token_loc.beg_pos == 1375 token_loc.end_pos - token_loc.beg_pos ==
1376 ast_value_factory()->use_asm_string()->length() + 2) { 1376 ast_value_factory()->use_asm_string()->length() + 2) {
1377 // Store the usage count; The actual use counter on the isolate is 1377 // Store the usage count; The actual use counter on the isolate is
1378 // incremented after parsing is done. 1378 // incremented after parsing is done.
1379 ++use_counts_[v8::Isolate::kUseAsm]; 1379 ++use_counts_[v8::Isolate::kUseAsm];
1380 scope_->SetAsmModule(); 1380 scope_->SetAsmModule();
1381 } else {
1382 // Should not change mode, but will increment UseCounter
1383 // if appropriate. Ditto usages below.
1384 RaiseLanguageMode(SLOPPY);
1381 } 1385 }
1382 } else { 1386 } else {
1383 // End of the directive prologue. 1387 // End of the directive prologue.
1384 directive_prologue = false; 1388 directive_prologue = false;
1389 RaiseLanguageMode(SLOPPY);
1385 } 1390 }
1391 } else {
1392 RaiseLanguageMode(SLOPPY);
1386 } 1393 }
1387 1394
1388 body->Add(stat, zone()); 1395 body->Add(stat, zone());
1389 } 1396 }
1390 1397
1391 return 0; 1398 return 0;
1392 } 1399 }
1393 1400
1394 1401
1395 Statement* Parser::ParseStatementListItem(bool* ok) { 1402 Statement* Parser::ParseStatementListItem(bool* ok) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1452 1459
1453 void* Parser::ParseModuleItemList(ZoneList<Statement*>* body, bool* ok) { 1460 void* Parser::ParseModuleItemList(ZoneList<Statement*>* body, bool* ok) {
1454 // (Ecma 262 6th Edition, 15.2): 1461 // (Ecma 262 6th Edition, 15.2):
1455 // Module : 1462 // Module :
1456 // ModuleBody? 1463 // ModuleBody?
1457 // 1464 //
1458 // ModuleBody : 1465 // ModuleBody :
1459 // ModuleItem* 1466 // ModuleItem*
1460 1467
1461 DCHECK(scope_->is_module_scope()); 1468 DCHECK(scope_->is_module_scope());
1462 scope_->SetLanguageMode( 1469 RaiseLanguageMode(STRICT);
1463 static_cast<LanguageMode>(scope_->language_mode() | STRICT));
1464 1470
1465 while (peek() != Token::EOS) { 1471 while (peek() != Token::EOS) {
1466 Statement* stat = ParseModuleItem(CHECK_OK); 1472 Statement* stat = ParseModuleItem(CHECK_OK);
1467 if (stat && !stat->IsEmpty()) { 1473 if (stat && !stat->IsEmpty()) {
1468 body->Add(stat, zone()); 1474 body->Add(stat, zone());
1469 } 1475 }
1470 } 1476 }
1471 1477
1472 // Check that all exports are bound. 1478 // Check that all exports are bound.
1473 ModuleDescriptor* descriptor = scope_->module(); 1479 ModuleDescriptor* descriptor = scope_->module();
(...skipping 2702 matching lines...) Expand 10 before | Expand all | Expand 10 after
4176 // nested function, and hoisting works normally relative to that. 4182 // nested function, and hoisting works normally relative to that.
4177 Scope* declaration_scope = scope_->DeclarationScope(); 4183 Scope* declaration_scope = scope_->DeclarationScope();
4178 Scope* original_declaration_scope = original_scope_->DeclarationScope(); 4184 Scope* original_declaration_scope = original_scope_->DeclarationScope();
4179 Scope* scope = function_type == FunctionLiteral::DECLARATION && 4185 Scope* scope = function_type == FunctionLiteral::DECLARATION &&
4180 is_sloppy(language_mode) && 4186 is_sloppy(language_mode) &&
4181 !allow_harmony_sloppy_function() && 4187 !allow_harmony_sloppy_function() &&
4182 (original_scope_ == original_declaration_scope || 4188 (original_scope_ == original_declaration_scope ||
4183 declaration_scope != original_declaration_scope) 4189 declaration_scope != original_declaration_scope)
4184 ? NewScope(declaration_scope, FUNCTION_SCOPE, kind) 4190 ? NewScope(declaration_scope, FUNCTION_SCOPE, kind)
4185 : NewScope(scope_, FUNCTION_SCOPE, kind); 4191 : NewScope(scope_, FUNCTION_SCOPE, kind);
4186 scope->SetLanguageMode(language_mode); 4192 SetLanguageMode(scope, language_mode);
4187 ZoneList<Statement*>* body = NULL; 4193 ZoneList<Statement*>* body = NULL;
4188 int arity = -1; 4194 int arity = -1;
4189 int materialized_literal_count = -1; 4195 int materialized_literal_count = -1;
4190 int expected_property_count = -1; 4196 int expected_property_count = -1;
4191 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); 4197 DuplicateFinder duplicate_finder(scanner()->unicode_cache());
4192 ExpressionClassifier formals_classifier(&duplicate_finder); 4198 ExpressionClassifier formals_classifier(&duplicate_finder);
4193 FunctionLiteral::EagerCompileHint eager_compile_hint = 4199 FunctionLiteral::EagerCompileHint eager_compile_hint =
4194 parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile 4200 parenthesized_function_ ? FunctionLiteral::kShouldEagerCompile
4195 : FunctionLiteral::kShouldLazyCompile; 4201 : FunctionLiteral::kShouldLazyCompile;
4196 bool should_be_used_once_hint = false; 4202 bool should_be_used_once_hint = false;
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
4408 scanner()->SeekForward(entry.end_pos() - 1); 4414 scanner()->SeekForward(entry.end_pos() - 1);
4409 4415
4410 scope_->set_end_position(entry.end_pos()); 4416 scope_->set_end_position(entry.end_pos());
4411 Expect(Token::RBRACE, ok); 4417 Expect(Token::RBRACE, ok);
4412 if (!*ok) { 4418 if (!*ok) {
4413 return; 4419 return;
4414 } 4420 }
4415 total_preparse_skipped_ += scope_->end_position() - function_block_pos; 4421 total_preparse_skipped_ += scope_->end_position() - function_block_pos;
4416 *materialized_literal_count = entry.literal_count(); 4422 *materialized_literal_count = entry.literal_count();
4417 *expected_property_count = entry.property_count(); 4423 *expected_property_count = entry.property_count();
4418 scope_->SetLanguageMode(entry.language_mode()); 4424 SetLanguageMode(scope_, entry.language_mode());
4419 if (entry.uses_super_property()) scope_->RecordSuperPropertyUsage(); 4425 if (entry.uses_super_property()) scope_->RecordSuperPropertyUsage();
4420 if (entry.calls_eval()) scope_->RecordEvalCall(); 4426 if (entry.calls_eval()) scope_->RecordEvalCall();
4421 return; 4427 return;
4422 } 4428 }
4423 cached_parse_data_->Reject(); 4429 cached_parse_data_->Reject();
4424 } 4430 }
4425 // With no cached data, we partially parse the function, without building an 4431 // With no cached data, we partially parse the function, without building an
4426 // AST. This gathers the data needed to build a lazy function. 4432 // AST. This gathers the data needed to build a lazy function.
4427 SingletonLogger logger; 4433 SingletonLogger logger;
4428 PreParser::PreParseResult result = 4434 PreParser::PreParseResult result =
(...skipping 15 matching lines...) Expand all
4444 return; 4450 return;
4445 } 4451 }
4446 scope_->set_end_position(logger.end()); 4452 scope_->set_end_position(logger.end());
4447 Expect(Token::RBRACE, ok); 4453 Expect(Token::RBRACE, ok);
4448 if (!*ok) { 4454 if (!*ok) {
4449 return; 4455 return;
4450 } 4456 }
4451 total_preparse_skipped_ += scope_->end_position() - function_block_pos; 4457 total_preparse_skipped_ += scope_->end_position() - function_block_pos;
4452 *materialized_literal_count = logger.literals(); 4458 *materialized_literal_count = logger.literals();
4453 *expected_property_count = logger.properties(); 4459 *expected_property_count = logger.properties();
4454 scope_->SetLanguageMode(logger.language_mode()); 4460 SetLanguageMode(scope_, logger.language_mode());
4455 if (logger.uses_super_property()) { 4461 if (logger.uses_super_property()) {
4456 scope_->RecordSuperPropertyUsage(); 4462 scope_->RecordSuperPropertyUsage();
4457 } 4463 }
4458 if (logger.calls_eval()) { 4464 if (logger.calls_eval()) {
4459 scope_->RecordEvalCall(); 4465 scope_->RecordEvalCall();
4460 } 4466 }
4461 if (produce_cached_parse_data()) { 4467 if (produce_cached_parse_data()) {
4462 DCHECK(log_); 4468 DCHECK(log_);
4463 // Position right after terminal '}'. 4469 // Position right after terminal '}'.
4464 int body_end = scanner()->location().end_pos; 4470 int body_end = scanner()->location().end_pos;
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
4737 zone()); 4743 zone());
4738 } 4744 }
4739 } 4745 }
4740 4746
4741 Expect(Token::RBRACE, CHECK_OK); 4747 Expect(Token::RBRACE, CHECK_OK);
4742 scope_->set_end_position(scanner()->location().end_pos); 4748 scope_->set_end_position(scanner()->location().end_pos);
4743 4749
4744 if (!parameters.is_simple) { 4750 if (!parameters.is_simple) {
4745 DCHECK_NOT_NULL(inner_scope); 4751 DCHECK_NOT_NULL(inner_scope);
4746 DCHECK_EQ(body, inner_block->statements()); 4752 DCHECK_EQ(body, inner_block->statements());
4747 scope_->SetLanguageMode(inner_scope->language_mode()); 4753 SetLanguageMode(scope_, inner_scope->language_mode());
4748 Block* init_block = BuildParameterInitializationBlock(parameters, CHECK_OK); 4754 Block* init_block = BuildParameterInitializationBlock(parameters, CHECK_OK);
4749 DCHECK_NOT_NULL(init_block); 4755 DCHECK_NOT_NULL(init_block);
4750 4756
4751 inner_scope->set_end_position(scanner()->location().end_pos); 4757 inner_scope->set_end_position(scanner()->location().end_pos);
4752 inner_scope = inner_scope->FinalizeBlockScope(); 4758 inner_scope = inner_scope->FinalizeBlockScope();
4753 if (inner_scope != nullptr) { 4759 if (inner_scope != nullptr) {
4754 CheckConflictingVarDeclarations(inner_scope, CHECK_OK); 4760 CheckConflictingVarDeclarations(inner_scope, CHECK_OK);
4755 InsertShadowingVarBindingInitializers(inner_block); 4761 InsertShadowingVarBindingInitializers(inner_block);
4756 } 4762 }
4757 4763
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
4841 return NULL; 4847 return NULL;
4842 } 4848 }
4843 if (is_strong(language_mode()) && IsUndefined(name)) { 4849 if (is_strong(language_mode()) && IsUndefined(name)) {
4844 ReportMessageAt(class_name_location, MessageTemplate::kStrongUndefined); 4850 ReportMessageAt(class_name_location, MessageTemplate::kStrongUndefined);
4845 *ok = false; 4851 *ok = false;
4846 return NULL; 4852 return NULL;
4847 } 4853 }
4848 4854
4849 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE); 4855 Scope* block_scope = NewScope(scope_, BLOCK_SCOPE);
4850 BlockState block_state(&scope_, block_scope); 4856 BlockState block_state(&scope_, block_scope);
4851 scope_->SetLanguageMode( 4857 RaiseLanguageMode(STRICT);
4852 static_cast<LanguageMode>(scope_->language_mode() | STRICT));
4853 scope_->SetScopeName(name); 4858 scope_->SetScopeName(name);
4854 4859
4855 VariableProxy* proxy = NULL; 4860 VariableProxy* proxy = NULL;
4856 if (name != NULL) { 4861 if (name != NULL) {
4857 proxy = NewUnresolved(name, CONST); 4862 proxy = NewUnresolved(name, CONST);
4858 const bool is_class_declaration = true; 4863 const bool is_class_declaration = true;
4859 Declaration* declaration = factory()->NewVariableDeclaration( 4864 Declaration* declaration = factory()->NewVariableDeclaration(
4860 proxy, CONST, block_scope, pos, is_class_declaration, 4865 proxy, CONST, block_scope, pos, is_class_declaration,
4861 scope_->class_declaration_group_start()); 4866 scope_->class_declaration_group_start());
4862 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK); 4867 Declare(declaration, DeclarationDescriptor::NORMAL, true, CHECK_OK);
(...skipping 1516 matching lines...) Expand 10 before | Expand all | Expand 10 after
6379 } 6384 }
6380 6385
6381 6386
6382 Expression* Parser::SpreadCallNew(Expression* function, 6387 Expression* Parser::SpreadCallNew(Expression* function,
6383 ZoneList<v8::internal::Expression*>* args, 6388 ZoneList<v8::internal::Expression*>* args,
6384 int pos) { 6389 int pos) {
6385 args->InsertAt(0, function, zone()); 6390 args->InsertAt(0, function, zone());
6386 6391
6387 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos); 6392 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos);
6388 } 6393 }
6394
6395
6396 void Parser::SetLanguageMode(Scope* scope, LanguageMode mode) {
6397 v8::Isolate::UseCounterFeature feature;
6398 if (is_sloppy(mode))
6399 feature = v8::Isolate::kSloppyMode;
6400 else if (is_strong(mode))
6401 feature = v8::Isolate::kStrongMode;
6402 else if (is_strict(mode))
6403 feature = v8::Isolate::kStrictMode;
6404 else
6405 UNREACHABLE();
6406 ++use_counts_[feature];
6407 scope->SetLanguageMode(mode);
6408 }
6409
6410
6411 void Parser::RaiseLanguageMode(LanguageMode mode) {
6412 SetLanguageMode(scope_,
6413 static_cast<LanguageMode>(scope_->language_mode() | mode));
6414 }
6415
6389 } // namespace internal 6416 } // namespace internal
6390 } // namespace v8 6417 } // namespace v8
OLDNEW
« no previous file with comments | « src/parser.h ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698