Author: [email protected]
Date: Mon Apr  6 11:08:06 2009
New Revision: 1679

Modified:
    branches/bleeding_edge/src/compilation-cache.cc
    branches/bleeding_edge/src/compilation-cache.h
    branches/bleeding_edge/src/compiler.cc

Log:
Put back compilation cache
Review URL: http://codereview.chromium.org/56185

Modified: branches/bleeding_edge/src/compilation-cache.cc
==============================================================================
--- branches/bleeding_edge/src/compilation-cache.cc     (original)
+++ branches/bleeding_edge/src/compilation-cache.cc     Mon Apr  6 11:08:06 2009
@@ -97,14 +97,65 @@
  }


+// We only re-use a cached function for some script source code if the
+// script originates from the same place. 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,
+                                 CompilationCache::Entry entry) {
+  // 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->Lookup(*source);
+  }
+  if (result->IsJSFunction()) {
+    return Handle<JSFunction>(JSFunction::cast(result));
+  } else {
+    return Handle<JSFunction>::null();
+  }
+}
+
+
+// TODO(245): Need to allow identical code from different contexts to be
+// cached. Currently the first use will be cached, but subsequent code
+// from different source / line won't.
  Handle<JSFunction> CompilationCache::LookupScript(Handle<String> source,
                                                    Handle<Object> name,
                                                    int line_offset,
                                                    int column_offset) {
-  // 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();
+  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;
  }


@@ -135,11 +186,11 @@


  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.
+  HandleScope scope;
+  ASSERT(boilerplate->IsBoilerplate());
+  Handle<CompilationCacheTable> table = GetTable(SCRIPT);
+  CALL_HEAP_FUNCTION_VOID(table->Put(*source, *boilerplate));
  }



Modified: branches/bleeding_edge/src/compilation-cache.h
==============================================================================
--- branches/bleeding_edge/src/compilation-cache.h      (original)
+++ branches/bleeding_edge/src/compilation-cache.h      Mon Apr  6 11:08:06 2009
@@ -70,7 +70,6 @@
    // 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

Modified: branches/bleeding_edge/src/compiler.cc
==============================================================================
--- branches/bleeding_edge/src/compiler.cc      (original)
+++ branches/bleeding_edge/src/compiler.cc      Mon Apr  6 11:08:06 2009
@@ -215,7 +215,7 @@
                            extension,
                            pre_data);
      if (extension == NULL && !result.is_null()) {
-      CompilationCache::PutScript(source, CompilationCache::SCRIPT,  
result);
+      CompilationCache::PutScript(source, result);
      }

      // Get rid of the pre-parsing data (if necessary).

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to