Disable the compilation caching for scripts to make it
authorkasperl@chromium.org <kasperl@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 3 Mar 2009 13:35:05 +0000 (13:35 +0000)
committerkasperl@chromium.org <kasperl@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 3 Mar 2009 13:35:05 +0000 (13:35 +0000)
possible to start generating code specific to a global
object. We should start caching scripts but make the
mechanism local to a specific global context inspired
by the way we handle eval-caching.
Review URL: http://codereview.chromium.org/40007

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1406 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/codegen-ia32.cc
src/compilation-cache.cc
src/compilation-cache.h
src/compiler.cc
src/macro-assembler-ia32.cc

index 704f0b1d6eb874fbdbc4d91fa0964700d3bb1bab..c41a57ed6ade21cf279eb1ea4210406cdb887721 100644 (file)
@@ -154,18 +154,14 @@ void CodeGenerator::GenCode(FunctionLiteral* fun) {
       // Get outer context and create a new context based on it.
       frame_->PushFunction();
       Result context = frame_->CallRuntime(Runtime::kNewContext, 1);
+
       // Update context local.
       frame_->SaveContextRegister();
 
-      if (kDebug) {
-        JumpTarget verified_true(this);
-        // Verify eax and esi are the same in debug mode
+      // Verify that the runtime call result and esi agree.
+      if (FLAG_debug_code) {
         __ cmp(context.reg(), Operand(esi));
-        context.Unuse();
-        verified_true.Branch(equal);
-        frame_->SpillAll();
-        __ int3();
-        verified_true.Bind();
+        __ Assert(equal, "Runtime::NewContext should end up in esi");
       }
     }
 
@@ -1870,16 +1866,10 @@ void CodeGenerator::VisitWithEnterStatement(WithEnterStatement* node) {
   // Update context local.
   frame_->SaveContextRegister();
 
-  if (kDebug) {
-    JumpTarget verified_true(this);
-    // Verify that the result of the runtime call and the esi register are
-    // the same in debug mode.
+  // Verify that the runtime call result and esi agree.
+  if (FLAG_debug_code) {
     __ cmp(context.reg(), Operand(esi));
-    context.Unuse();
-    verified_true.Branch(equal);
-    frame_->SpillAll();
-    __ int3();
-    verified_true.Bind();
+    __ Assert(equal, "Runtime::NewContext should end up in esi");
   }
 }
 
index d5a00489bbcf3453c7385dcb6d31bd8de5d3998c..3775bc2fbed0467ad1a2817e42a7bab74d81139f 100644 (file)
@@ -60,31 +60,8 @@ static Handle<CompilationCacheTable> GetTable(CompilationCache::Entry entry) {
 }
 
 
-// We only re-use a cached function for some script source code if the
-// script originates from the same places. This is to avoid issues
-// when reporting errors, etc.
-static bool HasOrigin(Handle<JSFunction> boilerplate,
-                      Handle<Object> name,
-                      int line_offset,
-                      int column_offset) {
-  Handle<Script> script =
-      Handle<Script>(Script::cast(boilerplate->shared()->script()));
-  // If the script name isn't set, the boilerplate script should have
-  // an undefined name to have the same origin.
-  if (name.is_null()) {
-    return script->name()->IsUndefined();
-  }
-  // Do the fast bailout checks first.
-  if (line_offset != script->line_offset()->value()) return false;
-  if (column_offset != script->column_offset()->value()) return false;
-  // Check that both names are strings. If not, no match.
-  if (!name->IsString() || !script->name()->IsString()) return false;
-  // Compare the two name strings for equality.
-  return String::cast(*name)->Equals(String::cast(script->name()));
-}
-
-
 static Handle<JSFunction> Lookup(Handle<String> source,
+                                 Handle<Context> context,
                                  CompilationCache::Entry entry) {
   // Make sure not to leak the table into the surrounding handle
   // scope. Otherwise, we risk keeping old tables around even after
@@ -92,7 +69,7 @@ static Handle<JSFunction> Lookup(Handle<String> source,
   Object* result;
   { HandleScope scope;
     Handle<CompilationCacheTable> table = GetTable(entry);
-    result = table->Lookup(*source);
+    result = table->LookupEval(*source, *context);
   }
   if (result->IsJSFunction()) {
     return Handle<JSFunction>(JSFunction::cast(result));
@@ -102,21 +79,20 @@ static Handle<JSFunction> Lookup(Handle<String> source,
 }
 
 
-static Handle<JSFunction> Lookup(Handle<String> source,
-                                 Handle<Context> context,
-                                 CompilationCache::Entry entry) {
+static Handle<FixedArray> Lookup(Handle<String> source,
+                                 JSRegExp::Flags flags) {
   // Make sure not to leak the table into the surrounding handle
   // scope. Otherwise, we risk keeping old tables around even after
   // having cleared the cache.
   Object* result;
   { HandleScope scope;
-    Handle<CompilationCacheTable> table = GetTable(entry);
-    result = table->LookupEval(*source, *context);
+    Handle<CompilationCacheTable> table = GetTable(CompilationCache::REGEXP);
+    result = table->LookupRegExp(*source, flags);
   }
-  if (result->IsJSFunction()) {
-    return Handle<JSFunction>(JSFunction::cast(result));
+  if (result->IsFixedArray()) {
+    return Handle<FixedArray>(FixedArray::cast(result));
   } else {
-    return Handle<JSFunction>::null();
+    return Handle<FixedArray>::null();
   }
 }
 
@@ -125,16 +101,10 @@ Handle<JSFunction> CompilationCache::LookupScript(Handle<String> source,
                                                   Handle<Object> name,
                                                   int line_offset,
                                                   int column_offset) {
-  Handle<JSFunction> result = Lookup(source, SCRIPT);
-  if (result.is_null()) {
-    Counters::compilation_cache_misses.Increment();
-  } else if (HasOrigin(result, name, line_offset, column_offset)) {
-    Counters::compilation_cache_hits.Increment();
-  } else {
-    result = Handle<JSFunction>::null();
-    Counters::compilation_cache_misses.Increment();
-  }
-  return result;
+  // TODO(245): Start caching scripts again but make it local to a
+  // global context to avoid sharing code between independent
+  // environments.
+  return Handle<JSFunction>::null();
 }
 
 
@@ -152,20 +122,31 @@ Handle<JSFunction> CompilationCache::LookupEval(Handle<String> source,
 }
 
 
-void CompilationCache::PutFunction(Handle<String> source,
-                                   Entry entry,
-                                   Handle<JSFunction> boilerplate) {
-  HandleScope scope;
-  ASSERT(boilerplate->IsBoilerplate());
-  Handle<CompilationCacheTable> table = GetTable(entry);
-  CALL_HEAP_FUNCTION_VOID(table->Put(*source, *boilerplate));
+Handle<FixedArray> CompilationCache::LookupRegExp(Handle<String> source,
+                                                  JSRegExp::Flags flags) {
+  Handle<FixedArray> result = Lookup(source, flags);
+  if (result.is_null()) {
+    Counters::compilation_cache_misses.Increment();
+  } else {
+    Counters::compilation_cache_hits.Increment();
+  }
+  return result;
 }
 
 
-void CompilationCache::PutEvalFunction(Handle<String> source,
-                                       Handle<Context> context,
-                                       Entry entry,
-                                       Handle<JSFunction> boilerplate) {
+void CompilationCache::PutScript(Handle<String> source,
+                                 Entry entry,
+                                 Handle<JSFunction> boilerplate) {
+  // TODO(245): Start caching scripts again but make it local to a
+  // global context to avoid sharing code between independent
+  // environments.
+}
+
+
+void CompilationCache::PutEval(Handle<String> source,
+                               Handle<Context> context,
+                               Entry entry,
+                               Handle<JSFunction> boilerplate) {
   HandleScope scope;
   ASSERT(boilerplate->IsBoilerplate());
   Handle<CompilationCacheTable> table = GetTable(entry);
@@ -173,19 +154,6 @@ void CompilationCache::PutEvalFunction(Handle<String> source,
 }
 
 
-Handle<FixedArray> CompilationCache::LookupRegExp(Handle<String> source,
-                                                  JSRegExp::Flags flags) {
-  Handle<CompilationCacheTable> table = GetTable(REGEXP);
-  Object* result = table->LookupRegExp(*source, flags);
-  if (result->IsFixedArray()) {
-    Counters::regexp_cache_hits.Increment();
-    return Handle<FixedArray>(FixedArray::cast(result));
-  } else {
-    Counters::regexp_cache_misses.Increment();
-    return Handle<FixedArray>();
-  }
-}
-
 
 void CompilationCache::PutRegExp(Handle<String> source,
                                  JSRegExp::Flags flags,
index 3fc65c2724aebf9feac20d49363181e017e80096..045a6f8d9fb380e06efdccc48628590afe028d38 100644 (file)
@@ -67,26 +67,25 @@ class CompilationCache {
   static Handle<FixedArray> LookupRegExp(Handle<String> source,
                                          JSRegExp::Flags flags);
 
+  // Associate the (source, kind) pair to the boilerplate. This may
+  // overwrite an existing mapping.
+  static void PutScript(Handle<String> source,
+                        Entry entry,
+                        Handle<JSFunction> boilerplate);
+
+  // Associate the (source, context->closure()->shared(), kind) triple
+  // with the boilerplate. This may overwrite an existing mapping.
+  static void PutEval(Handle<String> source,
+                      Handle<Context> context,
+                      Entry entry,
+                      Handle<JSFunction> boilerplate);
+
   // Associate the (source, flags) pair to the given regexp data.
   // This may overwrite an existing mapping.
   static void PutRegExp(Handle<String> source,
                         JSRegExp::Flags flags,
                         Handle<FixedArray> data);
 
-  // Associate the (source, kind) pair to the boilerplate. This may
-  // overwrite an existing mapping.
-  static void PutFunction(Handle<String> source,
-                          Entry entry,
-                          Handle<JSFunction> boilerplate);
-
-  // Associate the (source, context->closure()->shared(), kind)
-  // triple with the boilerplate. This may overwrite an existing
-  // mapping.
-  static void PutEvalFunction(Handle<String> source,
-                              Handle<Context> context,
-                              Entry entry,
-                              Handle<JSFunction> boilerplate);
-
   // Clear the cache - also used to initialize the cache at startup.
   static void Clear();
 
index 896e9d4faeb881ef4a0c8497d6dee4b3b03026ec..89917d8edfd5471909acfd3391394f7c4ae65c0d 100644 (file)
@@ -210,7 +210,7 @@ Handle<JSFunction> Compiler::Compile(Handle<String> source,
                           extension,
                           pre_data);
     if (extension == NULL && !result.is_null()) {
-      CompilationCache::PutFunction(source, CompilationCache::SCRIPT, result);
+      CompilationCache::PutScript(source, CompilationCache::SCRIPT, result);
     }
 
     // Get rid of the pre-parsing data (if necessary).
@@ -220,7 +220,6 @@ Handle<JSFunction> Compiler::Compile(Handle<String> source,
   }
 
   if (result.is_null()) Top::ReportPendingMessages();
-
   return result;
 }
 
@@ -249,7 +248,7 @@ Handle<JSFunction> Compiler::CompileEval(Handle<String> source,
     script->set_line_offset(Smi::FromInt(line_offset));
     result = MakeFunction(is_global, true, script, context, NULL, NULL);
     if (!result.is_null()) {
-      CompilationCache::PutEvalFunction(source, context, entry, result);
+      CompilationCache::PutEval(source, context, entry, result);
     }
   }
 
index cada45ffa5046f4954cdac5df21216a7998eee04..63340f53655b83a3770d9561c5a3c6168c85adf1 100644 (file)
@@ -877,7 +877,7 @@ void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag) {
   bool resolved;
   Handle<Code> code = ResolveBuiltin(id, &resolved);
 
-    // Calls are not allowed in some stubs.
+  // Calls are not allowed in some stubs.
   ASSERT(flag == JUMP_FUNCTION || allow_stub_calls());
 
   // Rely on the assertion to check that the number of provided