Index: src/compilation-cache.cc |
=================================================================== |
--- src/compilation-cache.cc (revision 4014) |
+++ src/compilation-cache.cc (working copy) |
@@ -32,7 +32,6 @@ |
namespace v8 { |
namespace internal { |
- |
// The number of sub caches covering the different types to cache. |
static const int kSubCacheCount = 4; |
@@ -47,6 +46,9 @@ |
// Initial size of each compilation cache table allocated. |
static const int kInitialCacheSize = 64; |
+// Index for the first generation in the cache. |
+static const int kFirstGeneration = 0; |
+ |
// The compilation cache consists of several generational sub-caches which uses |
// this class as a base class. A sub-cache contains a compilation cache tables |
// for each generation of the sub-cache. Since the same source code string has |
@@ -63,6 +65,15 @@ |
// Get the compilation cache tables for a specific generation. |
Handle<CompilationCacheTable> GetTable(int generation); |
+ // Accessors for first generation. |
+ Handle<CompilationCacheTable> GetFirstTable() { |
+ return GetTable(kFirstGeneration); |
+ } |
+ void SetFirstTable(Handle<CompilationCacheTable> value) { |
+ ASSERT(kFirstGeneration < generations_); |
+ tables_[kFirstGeneration] = *value; |
+ } |
+ |
// Age the sub-cache by evicting the oldest generation and creating a new |
// young generation. |
void Age(); |
@@ -97,6 +108,10 @@ |
void Put(Handle<String> source, Handle<JSFunction> boilerplate); |
private: |
+ // Note: Returns a new hash table if operation results in expansion. |
+ Handle<CompilationCacheTable> TablePut(Handle<String> source, |
+ Handle<JSFunction> boilerplate); |
+ |
bool HasOrigin(Handle<JSFunction> boilerplate, |
Handle<Object> name, |
int line_offset, |
@@ -118,6 +133,12 @@ |
Handle<Context> context, |
Handle<JSFunction> boilerplate); |
+ private: |
+ // Note: Returns a new hash table if operation results in expansion. |
+ Handle<CompilationCacheTable> TablePut(Handle<String> source, |
+ Handle<Context> context, |
+ Handle<JSFunction> boilerplate); |
+ |
DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheEval); |
}; |
@@ -133,6 +154,11 @@ |
void Put(Handle<String> source, |
JSRegExp::Flags flags, |
Handle<FixedArray> data); |
+ private: |
+ // Note: Returns a new hash table if operation results in expansion. |
+ Handle<CompilationCacheTable> TablePut(Handle<String> source, |
+ JSRegExp::Flags flags, |
+ Handle<FixedArray> data); |
DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheRegExp); |
}; |
@@ -280,12 +306,19 @@ |
} |
+Handle<CompilationCacheTable> CompilationCacheScript::TablePut( |
+ Handle<String> source, |
+ Handle<JSFunction> boilerplate) { |
+ CALL_HEAP_FUNCTION(GetFirstTable()->Put(*source, *boilerplate), |
+ CompilationCacheTable); |
+} |
+ |
+ |
void CompilationCacheScript::Put(Handle<String> source, |
Handle<JSFunction> boilerplate) { |
HandleScope scope; |
ASSERT(boilerplate->IsBoilerplate()); |
- Handle<CompilationCacheTable> table = GetTable(0); |
- CALL_HEAP_FUNCTION_VOID(table->Put(*source, *boilerplate)); |
+ SetFirstTable(TablePut(source, boilerplate)); |
} |
@@ -319,13 +352,21 @@ |
} |
+Handle<CompilationCacheTable> CompilationCacheEval::TablePut( |
+ Handle<String> source, |
+ Handle<Context> context, |
+ Handle<JSFunction> boilerplate) { |
+ CALL_HEAP_FUNCTION(GetFirstTable()->PutEval(*source, *context, *boilerplate), |
+ CompilationCacheTable); |
+} |
+ |
+ |
void CompilationCacheEval::Put(Handle<String> source, |
Handle<Context> context, |
Handle<JSFunction> boilerplate) { |
HandleScope scope; |
ASSERT(boilerplate->IsBoilerplate()); |
- Handle<CompilationCacheTable> table = GetTable(0); |
- CALL_HEAP_FUNCTION_VOID(table->PutEval(*source, *context, *boilerplate)); |
+ SetFirstTable(TablePut(source, context, boilerplate)); |
} |
@@ -359,12 +400,20 @@ |
} |
+Handle<CompilationCacheTable> CompilationCacheRegExp::TablePut( |
+ Handle<String> source, |
+ JSRegExp::Flags flags, |
+ Handle<FixedArray> data) { |
+ CALL_HEAP_FUNCTION(GetFirstTable()->PutRegExp(*source, flags, *data), |
+ CompilationCacheTable); |
+} |
+ |
+ |
void CompilationCacheRegExp::Put(Handle<String> source, |
JSRegExp::Flags flags, |
Handle<FixedArray> data) { |
HandleScope scope; |
- Handle<CompilationCacheTable> table = GetTable(0); |
- CALL_HEAP_FUNCTION_VOID(table->PutRegExp(*source, flags, *data)); |
+ SetFirstTable(TablePut(source, flags, data)); |
} |