| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index 1de62f2e4cc5c0346292ec8e0fc20b4d7df7371a..e72abc87de14ecf523fe5d892b694287db3cbc26 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -386,7 +386,10 @@ bool RunExtraCode(Isolate* isolate, Local<Context> context,
|
|
|
| struct SnapshotCreatorData {
|
| explicit SnapshotCreatorData(Isolate* isolate)
|
| - : isolate_(isolate), contexts_(isolate), created_(false) {}
|
| + : isolate_(isolate),
|
| + contexts_(isolate),
|
| + templates_(isolate),
|
| + created_(false) {}
|
|
|
| static SnapshotCreatorData* cast(void* data) {
|
| return reinterpret_cast<SnapshotCreatorData*>(data);
|
| @@ -395,6 +398,7 @@ struct SnapshotCreatorData {
|
| ArrayBufferAllocator allocator_;
|
| Isolate* isolate_;
|
| PersistentValueVector<Context> contexts_;
|
| + PersistentValueVector<Template> templates_;
|
| bool created_;
|
| };
|
|
|
| @@ -442,12 +446,35 @@ size_t SnapshotCreator::AddContext(Local<Context> context) {
|
| return index;
|
| }
|
|
|
| +size_t SnapshotCreator::AddTemplate(Local<Template> template_obj) {
|
| + DCHECK(!template_obj.IsEmpty());
|
| + SnapshotCreatorData* data = SnapshotCreatorData::cast(data_);
|
| + DCHECK(!data->created_);
|
| + DCHECK_EQ(reinterpret_cast<i::Isolate*>(data->isolate_),
|
| + Utils::OpenHandle(*template_obj)->GetIsolate());
|
| + size_t index = static_cast<int>(data->templates_.Size());
|
| + data->templates_.Append(template_obj);
|
| + return index;
|
| +}
|
| +
|
| StartupData SnapshotCreator::CreateBlob(
|
| SnapshotCreator::FunctionCodeHandling function_code_handling) {
|
| SnapshotCreatorData* data = SnapshotCreatorData::cast(data_);
|
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(data->isolate_);
|
| DCHECK(!data->created_);
|
|
|
| + {
|
| + int num_templates = static_cast<int>(data->templates_.Size());
|
| + i::HandleScope scope(isolate);
|
| + i::Handle<i::FixedArray> templates =
|
| + isolate->factory()->NewFixedArray(num_templates, i::TENURED);
|
| + for (int i = 0; i < num_templates; i++) {
|
| + templates->set(i, *v8::Utils::OpenHandle(*data->templates_.Get(i)));
|
| + }
|
| + isolate->heap()->SetSerializedTemplates(*templates);
|
| + data->templates_.Clear();
|
| + }
|
| +
|
| // If we don't do this then we end up with a stray root pointing at the
|
| // context even after we have disposed of the context.
|
| isolate->heap()->CollectAllAvailableGarbage("mksnapshot");
|
| @@ -1173,6 +1200,20 @@ Local<FunctionTemplate> FunctionTemplate::New(Isolate* isolate,
|
| length, false);
|
| }
|
|
|
| +Local<FunctionTemplate> FunctionTemplate::FromSnapshot(Isolate* isolate,
|
| + size_t index) {
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + i::FixedArray* templates = i_isolate->heap()->serialized_templates();
|
| + int int_index = static_cast<int>(index);
|
| + if (int_index < templates->length()) {
|
| + i::Object* info = i_isolate->heap()->serialized_templates()->get(int_index);
|
| + if (info->IsFunctionTemplateInfo()) {
|
| + return Utils::ToLocal(i::Handle<i::FunctionTemplateInfo>(
|
| + i::FunctionTemplateInfo::cast(info)));
|
| + }
|
| + }
|
| + return Local<FunctionTemplate>();
|
| +}
|
|
|
| Local<FunctionTemplate> FunctionTemplate::NewWithFastHandler(
|
| Isolate* isolate, FunctionCallback callback,
|
| @@ -1384,6 +1425,21 @@ Local<ObjectTemplate> ObjectTemplate::New(
|
| return ObjectTemplateNew(isolate, constructor, false);
|
| }
|
|
|
| +Local<ObjectTemplate> ObjectTemplate::FromSnapshot(Isolate* isolate,
|
| + size_t index) {
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + i::FixedArray* templates = i_isolate->heap()->serialized_templates();
|
| + int int_index = static_cast<int>(index);
|
| + if (int_index < templates->length()) {
|
| + i::Object* info = i_isolate->heap()->serialized_templates()->get(int_index);
|
| + if (info->IsObjectTemplateInfo()) {
|
| + return Utils::ToLocal(
|
| + i::Handle<i::ObjectTemplateInfo>(i::ObjectTemplateInfo::cast(info)));
|
| + }
|
| + }
|
| + return Local<ObjectTemplate>();
|
| +}
|
| +
|
| // Ensure that the object template has a constructor. If no
|
| // constructor is available we create one.
|
| static i::Handle<i::FunctionTemplateInfo> EnsureConstructor(
|
|
|