| Index: src/compiler.cc
|
| diff --git a/src/compiler.cc b/src/compiler.cc
|
| index 1e90469a92c0f413aaba24c3aff8af90b18adde4..e8dff5bc378fd159d878faa92b948b495eb87149 100644
|
| --- a/src/compiler.cc
|
| +++ b/src/compiler.cc
|
| @@ -53,7 +53,7 @@ namespace internal {
|
|
|
| CompilationInfo::CompilationInfo(Handle<Script> script)
|
| : isolate_(script->GetIsolate()),
|
| - flags_(0),
|
| + flags_(LanguageModeField::encode(CLASSIC_MODE)),
|
| function_(NULL),
|
| scope_(NULL),
|
| script_(script),
|
| @@ -66,7 +66,8 @@ CompilationInfo::CompilationInfo(Handle<Script> script)
|
|
|
| CompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info)
|
| : isolate_(shared_info->GetIsolate()),
|
| - flags_(IsLazy::encode(true)),
|
| + flags_(LanguageModeField::encode(CLASSIC_MODE) |
|
| + IsLazy::encode(true)),
|
| function_(NULL),
|
| scope_(NULL),
|
| shared_info_(shared_info),
|
| @@ -80,7 +81,8 @@ CompilationInfo::CompilationInfo(Handle<SharedFunctionInfo> shared_info)
|
|
|
| CompilationInfo::CompilationInfo(Handle<JSFunction> closure)
|
| : isolate_(closure->GetIsolate()),
|
| - flags_(IsLazy::encode(true)),
|
| + flags_(LanguageModeField::encode(CLASSIC_MODE) |
|
| + IsLazy::encode(true)),
|
| function_(NULL),
|
| scope_(NULL),
|
| closure_(closure),
|
| @@ -533,7 +535,7 @@ Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source,
|
| Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source,
|
| Handle<Context> context,
|
| bool is_global,
|
| - StrictModeFlag strict_mode,
|
| + LanguageMode language_mode,
|
| int scope_position) {
|
| Isolate* isolate = source->GetIsolate();
|
| int source_length = source->length();
|
| @@ -550,7 +552,7 @@ Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source,
|
| result = compilation_cache->LookupEval(source,
|
| context,
|
| is_global,
|
| - strict_mode,
|
| + language_mode,
|
| scope_position);
|
|
|
| if (result.is_null()) {
|
| @@ -559,15 +561,18 @@ Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source,
|
| CompilationInfo info(script);
|
| info.MarkAsEval();
|
| if (is_global) info.MarkAsGlobal();
|
| - info.SetStrictModeFlag(strict_mode);
|
| + info.SetLanguageMode(language_mode);
|
| info.SetCallingContext(context);
|
| result = MakeFunctionInfo(&info);
|
| if (!result.is_null()) {
|
| - // If caller is strict mode, the result must be strict as well,
|
| - // but not the other way around. Consider:
|
| + // If caller is strict mode, the result must be in strict mode or
|
| + // extended mode as well, but not the other way around. Consider:
|
| // eval("'use strict'; ...");
|
| - // TODO(keuchel): adapt this for extended mode.
|
| - ASSERT(strict_mode == kNonStrictMode || result->strict_mode());
|
| + ASSERT(language_mode != STRICT_MODE || !result->is_classic_mode());
|
| + // If caller is in extended mode, the result must also be in
|
| + // extended mode.
|
| + ASSERT(language_mode != EXTENDED_MODE ||
|
| + result->is_extended_mode());
|
| compilation_cache->PutEval(
|
| source, context, is_global, result, scope_position);
|
| }
|
| @@ -598,14 +603,10 @@ bool Compiler::CompileLazy(CompilationInfo* info) {
|
| // parsing statistics.
|
| HistogramTimerScope timer(isolate->counters()->compile_lazy());
|
|
|
| - // After parsing we know function's strict mode. Remember it.
|
| - StrictModeFlag strict_mode = info->function()->strict_mode_flag();
|
| - ASSERT(info->strict_mode_flag() == kNonStrictMode ||
|
| - info->strict_mode_flag() == strict_mode);
|
| - ASSERT(shared->strict_mode_flag() == kNonStrictMode ||
|
| - shared->strict_mode_flag() == strict_mode);
|
| - info->SetStrictModeFlag(strict_mode);
|
| - shared->set_strict_mode_flag(strict_mode);
|
| + // After parsing we know the function's language mode. Remember it.
|
| + LanguageMode language_mode = info->function()->language_mode();
|
| + info->SetLanguageMode(language_mode);
|
| + shared->set_language_mode(language_mode);
|
|
|
| // Compile the code.
|
| if (!MakeCode(info)) {
|
| @@ -684,7 +685,7 @@ Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(FunctionLiteral* literal,
|
| CompilationInfo info(script);
|
| info.SetFunction(literal);
|
| info.SetScope(literal->scope());
|
| - info.SetStrictModeFlag(literal->scope()->strict_mode_flag());
|
| + info.SetLanguageMode(literal->scope()->language_mode());
|
|
|
| LiveEditFunctionTracker live_edit_tracker(info.isolate(), literal);
|
| // Determine if the function can be lazily compiled. This is necessary to
|
| @@ -750,7 +751,7 @@ void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info,
|
| lit->has_only_simple_this_property_assignments(),
|
| *lit->this_property_assignments());
|
| function_info->set_allows_lazy_compilation(lit->AllowsLazyCompilation());
|
| - function_info->set_strict_mode_flag(lit->strict_mode_flag());
|
| + function_info->set_language_mode(lit->language_mode());
|
| function_info->set_uses_arguments(lit->scope()->arguments() != NULL);
|
| function_info->set_has_duplicate_parameters(lit->has_duplicate_parameters());
|
| }
|
|
|