Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(229)

Unified Diff: src/compiler.cc

Issue 1933: Generalized the EvalCache into a CompilationCache and enabled... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 12 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/compiler.cc
===================================================================
--- src/compiler.cc (revision 268)
+++ src/compiler.cc (working copy)
@@ -29,6 +29,7 @@
#include "bootstrapper.h"
#include "codegen-inl.h"
+#include "compilation-cache.h"
#include "compiler.h"
#include "debug.h"
#include "scopes.h"
@@ -170,27 +171,44 @@
// The VM is in the COMPILER state until exiting this function.
VMState state(COMPILER);
- ScriptDataImpl* pre_data = input_pre_data;
- if (pre_data == NULL && source->length() >= FLAG_min_preparse_length) {
- Access<SafeStringInputBuffer> buf(&safe_string_input_buffer);
- buf->Reset(source.location());
- pre_data = PreParse(buf.value(), extension);
+ // Do a lookup in the compilation cache but not for extensions.
+ Handle<JSFunction> result;
+ if (extension == NULL) {
+ result = CompilationCache::LookupScript(source,
+ script_name,
+ line_offset,
+ column_offset);
}
- // Create a script object describing the script to be compiled.
- Handle<Script> script = Factory::NewScript(source);
- if (!script_name.is_null()) {
- script->set_name(*script_name);
- script->set_line_offset(Smi::FromInt(line_offset));
- script->set_column_offset(Smi::FromInt(column_offset));
- }
+ if (result.is_null()) {
+ // No cache entry found. Do pre-parsing and compile the script.
+ ScriptDataImpl* pre_data = input_pre_data;
+ if (pre_data == NULL && source->length() >= FLAG_min_preparse_length) {
+ Access<SafeStringInputBuffer> buf(&safe_string_input_buffer);
+ buf->Reset(source.location());
+ pre_data = PreParse(buf.value(), extension);
+ }
- Handle<JSFunction> result =
- MakeFunction(true, false, script, extension, pre_data);
+ // Create a script object describing the script to be compiled.
+ Handle<Script> script = Factory::NewScript(source);
+ if (!script_name.is_null()) {
+ script->set_name(*script_name);
+ script->set_line_offset(Smi::FromInt(line_offset));
+ script->set_column_offset(Smi::FromInt(column_offset));
+ }
- if (input_pre_data == NULL && pre_data != NULL)
- delete pre_data;
+ // Compile the function and add it to the cache.
+ result = MakeFunction(true, false, script, extension, pre_data);
+ if (extension == NULL && !result.is_null()) {
+ CompilationCache::Associate(source, CompilationCache::SCRIPT, result);
+ }
+ // Get rid of the pre-parsing data (if necessary).
+ if (input_pre_data == NULL && pre_data != NULL) {
+ delete pre_data;
+ }
+ }
+
return result;
}
@@ -202,10 +220,22 @@
// The VM is in the COMPILER state until exiting this function.
VMState state(COMPILER);
+ CompilationCache::Entry entry = is_global
+ ? CompilationCache::EVAL_GLOBAL
+ : CompilationCache::EVAL_CONTEXTUAL;
- // Create a script object describing the script to be compiled.
- Handle<Script> script = Factory::NewScript(source);
- return MakeFunction(is_global, true, script, NULL, NULL);
+ // Do a lookup in the compilation cache; if the entry is not there,
+ // invoke the compiler and add the result to the cache.
+ Handle<JSFunction> result = CompilationCache::LookupEval(source, entry);
+ if (result.is_null()) {
+ // Create a script object describing the script to be compiled.
+ Handle<Script> script = Factory::NewScript(source);
+ result = MakeFunction(is_global, true, script, NULL, NULL);
+ if (!result.is_null()) {
+ CompilationCache::Associate(source, entry, result);
+ }
+ }
+ return result;
}
« src/compilation-cache.h ('K') | « src/compilation-cache.cc ('k') | src/handles.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698