Index: src/bootstrapper.cc |
=================================================================== |
--- src/bootstrapper.cc (revision 3220) |
+++ src/bootstrapper.cc (working copy) |
@@ -36,6 +36,7 @@ |
#include "global-handles.h" |
#include "macro-assembler.h" |
#include "natives.h" |
+#include "snapshot.h" |
namespace v8 { |
namespace internal { |
@@ -92,14 +93,34 @@ |
static SourceCodeCache natives_cache(Script::TYPE_NATIVE); |
static SourceCodeCache extensions_cache(Script::TYPE_EXTENSION); |
+// This is for delete, not delete[]. |
+static List<char*>* delete_these_non_arrays_on_tear_down = NULL; |
Handle<String> Bootstrapper::NativesSourceLookup(int index) { |
ASSERT(0 <= index && index < Natives::GetBuiltinsCount()); |
if (Heap::natives_source_cache()->get(index)->IsUndefined()) { |
- Handle<String> source_code = |
- Factory::NewStringFromAscii(Natives::GetScriptSource(index)); |
- Heap::natives_source_cache()->set(index, *source_code); |
+ if (!Snapshot::IsEnabled || FLAG_new_snapshot) { |
+ if (delete_these_non_arrays_on_tear_down == NULL) { |
+ delete_these_non_arrays_on_tear_down = new List<char*>(2); |
+ } |
+ // We can use external strings for the natives. |
+ NativesExternalStringResource* resource = |
+ new NativesExternalStringResource( |
+ Natives::GetScriptSource(index).start()); |
+ // The resources are small objects and we only make a fixed number of |
+ // them, but lets clean them up on exit for neatness. |
+ delete_these_non_arrays_on_tear_down-> |
+ Add(reinterpret_cast<char*>(resource)); |
+ Handle<String> source_code = |
+ Factory::NewExternalStringFromAscii(resource); |
+ Heap::natives_source_cache()->set(index, *source_code); |
+ } else { |
+ // Old snapshot code can't cope with external strings at all. |
+ Handle<String> source_code = |
+ Factory::NewStringFromAscii(Natives::GetScriptSource(index)); |
+ Heap::natives_source_cache()->set(index, *source_code); |
+ } |
} |
Handle<Object> cached_source(Heap::natives_source_cache()->get(index)); |
return Handle<String>::cast(cached_source); |
@@ -125,6 +146,16 @@ |
void Bootstrapper::TearDown() { |
+ if (delete_these_non_arrays_on_tear_down != NULL) { |
+ int len = delete_these_non_arrays_on_tear_down->length(); |
+ ASSERT(len < 20); // Don't use this mechanism for unbounded allocations. |
+ for (int i = 0; i < len; i++) { |
+ delete delete_these_non_arrays_on_tear_down->at(i); |
+ } |
+ delete delete_these_non_arrays_on_tear_down; |
+ delete_these_non_arrays_on_tear_down = NULL; |
+ } |
+ |
natives_cache.Initialize(false); // Yes, symmetrical |
extensions_cache.Initialize(false); |
} |