Chromium Code Reviews| Index: src/compilation-cache.cc |
| =================================================================== |
| --- src/compilation-cache.cc (revision 1671) |
| +++ src/compilation-cache.cc (working copy) |
| @@ -97,14 +97,65 @@ |
| } |
| +// 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 |
|
iposva
2009/04/02 18:24:16
places -> place?
DaveMoore
2009/04/06 18:08:23
Done.
|
| +// when reporting errors, etc. |
| +// 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. |
|
iposva
2009/04/02 18:24:16
Duplicated comment.
DaveMoore
2009/04/06 18:08:23
Done.
|
| +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(); |
| + } |
| +} |
| + |
| + |
| Handle<JSFunction> CompilationCache::LookupScript(Handle<String> source, |
| Handle<Object> name, |
| int line_offset, |
| int column_offset) { |
|
iposva
2009/04/02 18:24:16
Please refer to the bug 254 in a TODO here.
DaveMoore
2009/04/06 18:08:23
Done, but the details are slightly different. We w
iposva
2009/04/06 18:11:20
I must be missing how you protect against sharing
|
| - // 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)); |
| } |