Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index 5c18c3e53ebc8d6d3eb2dfc0e36301481621d20d..77111a842e7d55e6aa4a7ea8dfa02635ee431f3c 100755 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -548,7 +548,8 @@ Handle<SharedFunctionInfo> Compiler::Compile(Handle<String> source, |
Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source, |
Handle<Context> context, |
- bool is_global) { |
+ bool is_global, |
+ StrictModeFlag strict_mode) { |
int source_length = source->length(); |
Counters::total_eval_size.Increment(source_length); |
Counters::total_compile_size.Increment(source_length); |
@@ -559,7 +560,10 @@ Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source, |
// Do a lookup in the compilation cache; if the entry is not there, invoke |
// the compiler and add the result to the cache. |
Handle<SharedFunctionInfo> result; |
- result = CompilationCache::LookupEval(source, context, is_global); |
+ result = CompilationCache::LookupEval(source, |
+ context, |
+ is_global, |
+ strict_mode); |
if (result.is_null()) { |
// Create a script object describing the script to be compiled. |
@@ -567,9 +571,14 @@ Handle<SharedFunctionInfo> Compiler::CompileEval(Handle<String> source, |
CompilationInfo info(script); |
info.MarkAsEval(); |
if (is_global) info.MarkAsGlobal(); |
+ if (strict_mode == kStrictMode) info.MarkAsStrict(); |
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: |
+ // eval("'use strict'; ..."); |
+ ASSERT(strict_mode == kNonStrictMode || result->strict_mode()); |
CompilationCache::PutEval(source, context, is_global, result); |
} |
} |
@@ -762,6 +771,7 @@ void Compiler::SetFunctionInfo(Handle<SharedFunctionInfo> function_info, |
*lit->this_property_assignments()); |
function_info->set_try_full_codegen(lit->try_full_codegen()); |
function_info->set_allows_lazy_compilation(lit->AllowsLazyCompilation()); |
+ function_info->set_strict_mode(lit->strict_mode()); |
} |