Chromium Code Reviews| Index: src/parser.cc |
| diff --git a/src/parser.cc b/src/parser.cc |
| index c0976988ea3c077800842816c03981ee5cf7b248..a259af77a5e38fcaacfa0f549f13b36211b71788 100644 |
| --- a/src/parser.cc |
| +++ b/src/parser.cc |
| @@ -616,7 +616,8 @@ Parser::Parser(Handle<Script> script, |
| FunctionLiteral* Parser::ParseProgram(Handle<String> source, |
| - bool in_global_context) { |
| + bool in_global_context, |
| + bool strict_mode) { |
| CompilationZoneScope zone_scope(DONT_DELETE_ON_EXIT); |
| HistogramTimerScope timer(&Counters::parse); |
| @@ -632,17 +633,18 @@ FunctionLiteral* Parser::ParseProgram(Handle<String> source, |
| ExternalTwoByteStringUC16CharacterStream stream( |
| Handle<ExternalTwoByteString>::cast(source), 0, source->length()); |
| scanner_.Initialize(&stream); |
| - return DoParseProgram(source, in_global_context, &zone_scope); |
| + return DoParseProgram(source, in_global_context, strict_mode, &zone_scope); |
| } else { |
| GenericStringUC16CharacterStream stream(source, 0, source->length()); |
| scanner_.Initialize(&stream); |
| - return DoParseProgram(source, in_global_context, &zone_scope); |
| + return DoParseProgram(source, in_global_context, strict_mode, &zone_scope); |
| } |
| } |
| FunctionLiteral* Parser::DoParseProgram(Handle<String> source, |
| bool in_global_context, |
| + bool strict_mode, |
| ZoneScope* zone_scope) { |
| ASSERT(target_stack_ == NULL); |
| if (pre_data_ != NULL) pre_data_->Initialize(); |
| @@ -662,6 +664,7 @@ FunctionLiteral* Parser::DoParseProgram(Handle<String> source, |
| LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_, |
| scope); |
| TemporaryScope temp_scope(&this->temp_scope_); |
| + if (strict_mode) temp_scope.EnableStrictMode(); |
| ZoneList<Statement*>* body = new ZoneList<Statement*>(16); |
| bool ok = true; |
| int beg_loc = scanner().location().beg_pos; |
| @@ -746,6 +749,9 @@ FunctionLiteral* Parser::ParseLazy(Handle<SharedFunctionInfo> info, |
| LexicalScope lexical_scope(&this->top_scope_, &this->with_nesting_level_, |
| scope); |
| TemporaryScope temp_scope(&this->temp_scope_); |
| + if (info->strict_mode()) { |
| + temp_scope.EnableStrictMode(); |
| + } |
| FunctionLiteralType type = |
| info->is_expression() ? EXPRESSION : DECLARATION; |
| @@ -3540,7 +3546,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
| end_pos = scanner().location().end_pos; |
| } |
| - // Validate strict mode. |
| + // Strict mode. |
| if (temp_scope_->StrictMode()) { |
| if (IsEvalOrArguments(name)) { |
| int position = function_token_position != RelocInfo::kNoPosition |
| @@ -3564,6 +3570,9 @@ FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> var_name, |
| return NULL; |
| } |
| CheckOctalLiteral(start_pos, end_pos, CHECK_OK); |
| + |
| + // In strict mode, arguments are const. |
| + top_scope_->SetAttributesConst(); |
|
Lasse Reichstein
2011/02/01 11:26:24
Attributes? Should that be "Arguments"?
|
| } |
| FunctionLiteral* function_literal = |
| @@ -5025,7 +5034,9 @@ bool ParserApi::Parse(CompilationInfo* info) { |
| ASSERT(Top::has_pending_exception()); |
| } else { |
| Handle<String> source = Handle<String>(String::cast(script->source())); |
| - result = parser.ParseProgram(source, info->is_global()); |
| + result = parser.ParseProgram(source, |
| + info->is_global(), |
| + info->is_strict()); |
| } |
| } |