| Index: src/compilation-cache.cc
|
| ===================================================================
|
| --- src/compilation-cache.cc (revision 4210)
|
| +++ src/compilation-cache.cc (working copy)
|
| @@ -101,18 +101,18 @@
|
| explicit CompilationCacheScript(int generations)
|
| : CompilationSubCache(generations) { }
|
|
|
| - Handle<JSFunction> Lookup(Handle<String> source,
|
| - Handle<Object> name,
|
| - int line_offset,
|
| - int column_offset);
|
| - void Put(Handle<String> source, Handle<JSFunction> boilerplate);
|
| + Handle<SharedFunctionInfo> Lookup(Handle<String> source,
|
| + Handle<Object> name,
|
| + int line_offset,
|
| + int column_offset);
|
| + void Put(Handle<String> source, Handle<SharedFunctionInfo> function_info);
|
|
|
| private:
|
| // Note: Returns a new hash table if operation results in expansion.
|
| - Handle<CompilationCacheTable> TablePut(Handle<String> source,
|
| - Handle<JSFunction> boilerplate);
|
| + Handle<CompilationCacheTable> TablePut(
|
| + Handle<String> source, Handle<SharedFunctionInfo> function_info);
|
|
|
| - bool HasOrigin(Handle<JSFunction> boilerplate,
|
| + bool HasOrigin(Handle<SharedFunctionInfo> function_info,
|
| Handle<Object> name,
|
| int line_offset,
|
| int column_offset);
|
| @@ -127,17 +127,19 @@
|
| explicit CompilationCacheEval(int generations)
|
| : CompilationSubCache(generations) { }
|
|
|
| - Handle<JSFunction> Lookup(Handle<String> source, Handle<Context> context);
|
| + Handle<SharedFunctionInfo> Lookup(Handle<String> source,
|
| + Handle<Context> context);
|
|
|
| void Put(Handle<String> source,
|
| Handle<Context> context,
|
| - Handle<JSFunction> boilerplate);
|
| + Handle<SharedFunctionInfo> function_info);
|
|
|
| private:
|
| // Note: Returns a new hash table if operation results in expansion.
|
| - Handle<CompilationCacheTable> TablePut(Handle<String> source,
|
| - Handle<Context> context,
|
| - Handle<JSFunction> boilerplate);
|
| + Handle<CompilationCacheTable> TablePut(
|
| + Handle<String> source,
|
| + Handle<Context> context,
|
| + Handle<SharedFunctionInfo> function_info);
|
|
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheEval);
|
| };
|
| @@ -225,12 +227,13 @@
|
| // 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.
|
| -bool CompilationCacheScript::HasOrigin(Handle<JSFunction> boilerplate,
|
| - Handle<Object> name,
|
| - int line_offset,
|
| - int column_offset) {
|
| +bool CompilationCacheScript::HasOrigin(
|
| + Handle<SharedFunctionInfo> function_info,
|
| + Handle<Object> name,
|
| + int line_offset,
|
| + int column_offset) {
|
| Handle<Script> script =
|
| - Handle<Script>(Script::cast(boilerplate->shared()->script()));
|
| + Handle<Script>(Script::cast(function_info->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()) {
|
| @@ -250,10 +253,10 @@
|
| // be cached in the same script generation. Currently the first use
|
| // will be cached, but subsequent code from different source / line
|
| // won't.
|
| -Handle<JSFunction> CompilationCacheScript::Lookup(Handle<String> source,
|
| - Handle<Object> name,
|
| - int line_offset,
|
| - int column_offset) {
|
| +Handle<SharedFunctionInfo> CompilationCacheScript::Lookup(Handle<String> source,
|
| + Handle<Object> name,
|
| + int line_offset,
|
| + int column_offset) {
|
| Object* result = NULL;
|
| int generation;
|
|
|
| @@ -263,12 +266,13 @@
|
| for (generation = 0; generation < generations(); generation++) {
|
| Handle<CompilationCacheTable> table = GetTable(generation);
|
| Handle<Object> probe(table->Lookup(*source));
|
| - if (probe->IsJSFunction()) {
|
| - Handle<JSFunction> boilerplate = Handle<JSFunction>::cast(probe);
|
| + if (probe->IsSharedFunctionInfo()) {
|
| + Handle<SharedFunctionInfo> function_info =
|
| + Handle<SharedFunctionInfo>::cast(probe);
|
| // Break when we've found a suitable boilerplate function that
|
| // matches the origin.
|
| - if (HasOrigin(boilerplate, name, line_offset, column_offset)) {
|
| - result = *boilerplate;
|
| + if (HasOrigin(function_info, name, line_offset, column_offset)) {
|
| + result = *function_info;
|
| break;
|
| }
|
| }
|
| @@ -290,38 +294,37 @@
|
| // to see if we actually found a cached script. If so, we return a
|
| // handle created in the caller's handle scope.
|
| if (result != NULL) {
|
| - Handle<JSFunction> boilerplate(JSFunction::cast(result));
|
| - ASSERT(HasOrigin(boilerplate, name, line_offset, column_offset));
|
| + Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(result));
|
| + ASSERT(HasOrigin(shared, name, line_offset, column_offset));
|
| // If the script was found in a later generation, we promote it to
|
| // the first generation to let it survive longer in the cache.
|
| - if (generation != 0) Put(source, boilerplate);
|
| + if (generation != 0) Put(source, shared);
|
| Counters::compilation_cache_hits.Increment();
|
| - return boilerplate;
|
| + return shared;
|
| } else {
|
| Counters::compilation_cache_misses.Increment();
|
| - return Handle<JSFunction>::null();
|
| + return Handle<SharedFunctionInfo>::null();
|
| }
|
| }
|
|
|
|
|
| Handle<CompilationCacheTable> CompilationCacheScript::TablePut(
|
| Handle<String> source,
|
| - Handle<JSFunction> boilerplate) {
|
| - CALL_HEAP_FUNCTION(GetFirstTable()->Put(*source, *boilerplate),
|
| + Handle<SharedFunctionInfo> function_info) {
|
| + CALL_HEAP_FUNCTION(GetFirstTable()->Put(*source, *function_info),
|
| CompilationCacheTable);
|
| }
|
|
|
|
|
| void CompilationCacheScript::Put(Handle<String> source,
|
| - Handle<JSFunction> boilerplate) {
|
| + Handle<SharedFunctionInfo> function_info) {
|
| HandleScope scope;
|
| - ASSERT(boilerplate->IsBoilerplate());
|
| - SetFirstTable(TablePut(source, boilerplate));
|
| + SetFirstTable(TablePut(source, function_info));
|
| }
|
|
|
|
|
| -Handle<JSFunction> CompilationCacheEval::Lookup(Handle<String> source,
|
| - Handle<Context> context) {
|
| +Handle<SharedFunctionInfo> CompilationCacheEval::Lookup(
|
| + Handle<String> source, Handle<Context> context) {
|
| // 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.
|
| @@ -331,21 +334,22 @@
|
| for (generation = 0; generation < generations(); generation++) {
|
| Handle<CompilationCacheTable> table = GetTable(generation);
|
| result = table->LookupEval(*source, *context);
|
| - if (result->IsJSFunction()) {
|
| + if (result->IsSharedFunctionInfo()) {
|
| break;
|
| }
|
| }
|
| }
|
| - if (result->IsJSFunction()) {
|
| - Handle<JSFunction> boilerplate(JSFunction::cast(result));
|
| + if (result->IsSharedFunctionInfo()) {
|
| + Handle<SharedFunctionInfo>
|
| + function_info(SharedFunctionInfo::cast(result));
|
| if (generation != 0) {
|
| - Put(source, context, boilerplate);
|
| + Put(source, context, function_info);
|
| }
|
| Counters::compilation_cache_hits.Increment();
|
| - return boilerplate;
|
| + return function_info;
|
| } else {
|
| Counters::compilation_cache_misses.Increment();
|
| - return Handle<JSFunction>::null();
|
| + return Handle<SharedFunctionInfo>::null();
|
| }
|
| }
|
|
|
| @@ -353,18 +357,19 @@
|
| Handle<CompilationCacheTable> CompilationCacheEval::TablePut(
|
| Handle<String> source,
|
| Handle<Context> context,
|
| - Handle<JSFunction> boilerplate) {
|
| - CALL_HEAP_FUNCTION(GetFirstTable()->PutEval(*source, *context, *boilerplate),
|
| + Handle<SharedFunctionInfo> function_info) {
|
| + CALL_HEAP_FUNCTION(GetFirstTable()->PutEval(*source,
|
| + *context,
|
| + *function_info),
|
| CompilationCacheTable);
|
| }
|
|
|
|
|
| void CompilationCacheEval::Put(Handle<String> source,
|
| Handle<Context> context,
|
| - Handle<JSFunction> boilerplate) {
|
| + Handle<SharedFunctionInfo> function_info) {
|
| HandleScope scope;
|
| - ASSERT(boilerplate->IsBoilerplate());
|
| - SetFirstTable(TablePut(source, context, boilerplate));
|
| + SetFirstTable(TablePut(source, context, function_info));
|
| }
|
|
|
|
|
| @@ -415,26 +420,26 @@
|
| }
|
|
|
|
|
| -Handle<JSFunction> CompilationCache::LookupScript(Handle<String> source,
|
| - Handle<Object> name,
|
| - int line_offset,
|
| - int column_offset) {
|
| +Handle<SharedFunctionInfo> CompilationCache::LookupScript(Handle<String> source,
|
| + Handle<Object> name,
|
| + int line_offset,
|
| + int column_offset) {
|
| if (!IsEnabled()) {
|
| - return Handle<JSFunction>::null();
|
| + return Handle<SharedFunctionInfo>::null();
|
| }
|
|
|
| return script.Lookup(source, name, line_offset, column_offset);
|
| }
|
|
|
|
|
| -Handle<JSFunction> CompilationCache::LookupEval(Handle<String> source,
|
| - Handle<Context> context,
|
| - bool is_global) {
|
| +Handle<SharedFunctionInfo> CompilationCache::LookupEval(Handle<String> source,
|
| + Handle<Context> context,
|
| + bool is_global) {
|
| if (!IsEnabled()) {
|
| - return Handle<JSFunction>::null();
|
| + return Handle<SharedFunctionInfo>::null();
|
| }
|
|
|
| - Handle<JSFunction> result;
|
| + Handle<SharedFunctionInfo> result;
|
| if (is_global) {
|
| result = eval_global.Lookup(source, context);
|
| } else {
|
| @@ -455,30 +460,28 @@
|
|
|
|
|
| void CompilationCache::PutScript(Handle<String> source,
|
| - Handle<JSFunction> boilerplate) {
|
| + Handle<SharedFunctionInfo> function_info) {
|
| if (!IsEnabled()) {
|
| return;
|
| }
|
|
|
| - ASSERT(boilerplate->IsBoilerplate());
|
| - script.Put(source, boilerplate);
|
| + script.Put(source, function_info);
|
| }
|
|
|
|
|
| void CompilationCache::PutEval(Handle<String> source,
|
| Handle<Context> context,
|
| bool is_global,
|
| - Handle<JSFunction> boilerplate) {
|
| + Handle<SharedFunctionInfo> function_info) {
|
| if (!IsEnabled()) {
|
| return;
|
| }
|
|
|
| HandleScope scope;
|
| - ASSERT(boilerplate->IsBoilerplate());
|
| if (is_global) {
|
| - eval_global.Put(source, context, boilerplate);
|
| + eval_global.Put(source, context, function_info);
|
| } else {
|
| - eval_contextual.Put(source, context, boilerplate);
|
| + eval_contextual.Put(source, context, function_info);
|
| }
|
| }
|
|
|
|
|