Author: [email protected]
Date: Tue Mar  3 05:35:05 2009
New Revision: 1406

Modified:
    branches/bleeding_edge/src/codegen-ia32.cc
    branches/bleeding_edge/src/compilation-cache.cc
    branches/bleeding_edge/src/compilation-cache.h
    branches/bleeding_edge/src/compiler.cc
    branches/bleeding_edge/src/macro-assembler-ia32.cc

Log:
Disable the compilation caching for scripts to make it
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

Modified: branches/bleeding_edge/src/codegen-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/codegen-ia32.cc  (original)
+++ branches/bleeding_edge/src/codegen-ia32.cc  Tue Mar  3 05:35:05 2009
@@ -154,18 +154,14 @@
        // 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 @@
    // 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");
    }
  }


Modified: branches/bleeding_edge/src/compilation-cache.cc
==============================================================================
--- branches/bleeding_edge/src/compilation-cache.cc     (original)
+++ branches/bleeding_edge/src/compilation-cache.cc     Tue Mar  3 05:35:05 2009
@@ -60,31 +60,8 @@
  }


-// 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 @@
    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,
-                                 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<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,39 +122,37 @@
  }


-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);
    CALL_HEAP_FUNCTION_VOID(table->PutEval(*source, *context, *boilerplate));
  }

-
-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,

Modified: branches/bleeding_edge/src/compilation-cache.h
==============================================================================
--- branches/bleeding_edge/src/compilation-cache.h      (original)
+++ branches/bleeding_edge/src/compilation-cache.h      Tue Mar  3 05:35:05 2009
@@ -67,25 +67,24 @@
    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();

Modified: branches/bleeding_edge/src/compiler.cc
==============================================================================
--- branches/bleeding_edge/src/compiler.cc      (original)
+++ branches/bleeding_edge/src/compiler.cc      Tue Mar  3 05:35:05 2009
@@ -210,7 +210,7 @@
                            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 @@
    }

    if (result.is_null()) Top::ReportPendingMessages();
-
    return result;
  }

@@ -249,7 +248,7 @@
      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);
      }
    }


Modified: branches/bleeding_edge/src/macro-assembler-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/macro-assembler-ia32.cc  (original)
+++ branches/bleeding_edge/src/macro-assembler-ia32.cc  Tue Mar  3 05:35:05  
2009
@@ -877,7 +877,7 @@
    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

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

Reply via email to