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

Unified Diff: src/parser.cc

Issue 898983002: Add strong mode. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 10 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
Index: src/parser.cc
diff --git a/src/parser.cc b/src/parser.cc
index 0dbfe5d18522d4799207318a42f22f879fd08f35..ecc14782792147f1545eb61774680165d6394f46 100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -289,7 +289,7 @@ FunctionLiteral* Parser::DefaultConstructor(bool call_super, Scope* scope,
Scope* function_scope =
NewScope(scope, FUNCTION_SCOPE, FunctionKind::kDefaultConstructor);
function_scope->SetLanguageMode(
- static_cast<LanguageMode>(scope->language_mode() | STRICT));
+ static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT));
// Set start and end position to the same value
function_scope->set_start_position(pos);
function_scope->set_end_position(pos);
@@ -1145,13 +1145,23 @@ void* Parser::ParseStatementList(ZoneList<Statement*>* body, int end_token,
if ((e_stat = stat->AsExpressionStatement()) != NULL &&
(literal = e_stat->expression()->AsLiteral()) != NULL &&
literal->raw_value()->IsString()) {
- // Check "use strict" directive (ES5 14.1) and "use asm" directive. Only
- // one can be present.
- if (is_sloppy(language_mode()) &&
+ // Check "use strict" directive (ES5 14.1), "use asm" directive, and
+ // "use sanity" directive (experimental). Only one can be present.
+ bool use_strict_found =
+ is_sloppy(language_mode()) &&
literal->raw_value()->AsString() ==
ast_value_factory()->use_strict_string() &&
token_loc.end_pos - token_loc.beg_pos ==
- ast_value_factory()->use_strict_string()->length() + 2) {
+ ast_value_factory()->use_strict_string()->length() + 2;
+ bool use_sanity_found =
arv (Not doing code reviews) 2015/02/04 16:17:11 Don't we want a flag for this work?
rossberg 2015/02/04 16:19:57 Ah, excellent point! Yes, we need a flag. I sugges
marja 2015/02/05 12:11:37 Done.
+ !use_strict_found && !is_sane(language_mode()) &&
rossberg 2015/02/04 16:18:09 If I read this correctly then "use sanity"; "us
marja 2015/02/05 12:11:37 Done. (Oops, preparser was already following that
+ literal->raw_value()->AsString() ==
+ ast_value_factory()->use_sanity_string() &&
+ token_loc.end_pos - token_loc.beg_pos ==
+ ast_value_factory()->use_sanity_string()->length() + 2;
+ if (use_strict_found || use_sanity_found) {
+ // Sane mode implies strict mode.
+
// TODO(mstarzinger): Global strict eval calls, need their own scope
// as specified in ES5 10.4.2(3). The correct fix would be to always
// add this scope in DoParseProgram(), but that requires adaptations
@@ -1170,8 +1180,14 @@ void* Parser::ParseStatementList(ZoneList<Statement*>* body, int end_token,
mode_ = PARSE_EAGERLY;
}
scope_->SetLanguageMode(
- static_cast<LanguageMode>(scope_->language_mode() | STRICT));
- // "use strict" is the only directive for now.
+ static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT));
+
+ if (use_sanity_found) {
+ scope_->SetLanguageMode(
+ static_cast<LanguageMode>(scope_->language_mode() | SANE_BIT));
+ }
+
+ // Don't allow additional directives.
directive_prologue = false;
} else if (literal->raw_value()->AsString() ==
ast_value_factory()->use_asm_string() &&
@@ -1181,6 +1197,8 @@ void* Parser::ParseStatementList(ZoneList<Statement*>* body, int end_token,
// incremented after parsing is done.
++use_counts_[v8::Isolate::kUseAsm];
scope_->SetAsmModule();
+ // Don't allow additional directives.
+ directive_prologue = false;
}
} else {
// End of the directive prologue.
@@ -1257,7 +1275,7 @@ Module* Parser::ParseModule(bool* ok) {
scope->set_start_position(scanner()->location().beg_pos);
scope->SetLanguageMode(
- static_cast<LanguageMode>(scope->language_mode() | STRICT));
+ static_cast<LanguageMode>(scope->language_mode() | STRICT_BIT));
{
BlockState block_state(&scope_, scope);
@@ -4036,7 +4054,7 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name,
Scope* block_scope = NewScope(scope_, BLOCK_SCOPE);
BlockState block_state(&scope_, block_scope);
scope_->SetLanguageMode(
- static_cast<LanguageMode>(scope_->language_mode() | STRICT));
+ static_cast<LanguageMode>(scope_->language_mode() | STRICT_BIT));
scope_->SetScopeName(name);
VariableProxy* proxy = NULL;

Powered by Google App Engine
This is Rietveld 408576698