Index: src/parser.cc |
diff --git a/src/parser.cc b/src/parser.cc |
index a2900b51ae3821b8218395df5f4701bc542ab802..cecfbc2af0c8d846edef5ce05cc386b2ef8792a5 100644 |
--- a/src/parser.cc |
+++ b/src/parser.cc |
@@ -783,6 +783,10 @@ Parser::Parser(CompilationInfo* info) |
set_allow_generators(FLAG_harmony_generators); |
set_allow_for_of(FLAG_harmony_iteration); |
set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals); |
+ for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; |
+ ++feature) { |
+ use_counts_[feature] = 0; |
+ } |
} |
@@ -1087,11 +1091,13 @@ void* Parser::ParseSourceElements(ZoneList<Statement*>* processor, |
if ((e_stat = stat->AsExpressionStatement()) != NULL && |
(literal = e_stat->expression()->AsLiteral()) != NULL && |
literal->raw_value()->IsString()) { |
- // Check "use strict" directive (ES5 14.1). |
+ // Check "use strict" directive (ES5 14.1) and "use asm" directive. Only |
+ // one can be present. |
if (strict_mode() == SLOPPY && |
literal->raw_value()->AsString() == |
ast_value_factory_->use_strict_string() && |
- token_loc.end_pos - token_loc.beg_pos == 12) { |
+ token_loc.end_pos - token_loc.beg_pos == |
+ ast_value_factory_->use_strict_string()->length() + 2) { |
// 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 |
@@ -1108,6 +1114,13 @@ void* Parser::ParseSourceElements(ZoneList<Statement*>* processor, |
scope_->SetStrictMode(STRICT); |
// "use strict" is the only directive for now. |
directive_prologue = false; |
+ } else if (literal->raw_value()->AsString() == |
+ ast_value_factory_->use_asm_string() && |
+ token_loc.end_pos - token_loc.beg_pos == |
+ ast_value_factory_->use_asm_string()->length() + 2) { |
+ // Store the usage count; The actual use counter on the isolate is |
+ // incremented after parsing is done. |
+ ++use_counts_[v8::Isolate::kUseAsm]; |
} |
} else { |
// End of the directive prologue. |
@@ -3899,6 +3912,16 @@ void Parser::ThrowPendingError() { |
} |
+void Parser::InternalizeUseCounts() { |
+ for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; |
+ ++feature) { |
+ for (int i = 0; i < use_counts_[feature]; ++i) { |
+ isolate()->CountUsage(v8::Isolate::UseCounterFeature(feature)); |
+ } |
+ } |
+} |
+ |
+ |
// ---------------------------------------------------------------------------- |
// Regular expressions |
@@ -4840,6 +4863,9 @@ bool Parser::Parse() { |
info()->SetAstValueFactory(ast_value_factory_); |
} |
ast_value_factory_ = NULL; |
+ |
+ InternalizeUseCounts(); |
+ |
return (result != NULL); |
} |