OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/api.h" | 5 #include "src/api.h" |
6 | 6 |
7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 i::PrintF("Executing custom snapshot script %s took %0.3f ms\n", name, | 379 i::PrintF("Executing custom snapshot script %s took %0.3f ms\n", name, |
380 timer.Elapsed().InMillisecondsF()); | 380 timer.Elapsed().InMillisecondsF()); |
381 } | 381 } |
382 timer.Stop(); | 382 timer.Stop(); |
383 CHECK(!try_catch.HasCaught()); | 383 CHECK(!try_catch.HasCaught()); |
384 return true; | 384 return true; |
385 } | 385 } |
386 | 386 |
387 struct SnapshotCreatorData { | 387 struct SnapshotCreatorData { |
388 explicit SnapshotCreatorData(Isolate* isolate) | 388 explicit SnapshotCreatorData(Isolate* isolate) |
389 : isolate_(isolate), contexts_(isolate), created_(false) {} | 389 : isolate_(isolate), |
| 390 contexts_(isolate), |
| 391 templates_(isolate), |
| 392 created_(false) {} |
390 | 393 |
391 static SnapshotCreatorData* cast(void* data) { | 394 static SnapshotCreatorData* cast(void* data) { |
392 return reinterpret_cast<SnapshotCreatorData*>(data); | 395 return reinterpret_cast<SnapshotCreatorData*>(data); |
393 } | 396 } |
394 | 397 |
395 ArrayBufferAllocator allocator_; | 398 ArrayBufferAllocator allocator_; |
396 Isolate* isolate_; | 399 Isolate* isolate_; |
397 PersistentValueVector<Context> contexts_; | 400 PersistentValueVector<Context> contexts_; |
| 401 PersistentValueVector<Template> templates_; |
398 bool created_; | 402 bool created_; |
399 }; | 403 }; |
400 | 404 |
401 } // namespace | 405 } // namespace |
402 | 406 |
403 SnapshotCreator::SnapshotCreator(intptr_t* external_references, | 407 SnapshotCreator::SnapshotCreator(intptr_t* external_references, |
404 StartupData* existing_snapshot) { | 408 StartupData* existing_snapshot) { |
405 i::Isolate* internal_isolate = new i::Isolate(true); | 409 i::Isolate* internal_isolate = new i::Isolate(true); |
406 Isolate* isolate = reinterpret_cast<Isolate*>(internal_isolate); | 410 Isolate* isolate = reinterpret_cast<Isolate*>(internal_isolate); |
407 SnapshotCreatorData* data = new SnapshotCreatorData(isolate); | 411 SnapshotCreatorData* data = new SnapshotCreatorData(isolate); |
(...skipping 27 matching lines...) Expand all Loading... |
435 DCHECK(!context.IsEmpty()); | 439 DCHECK(!context.IsEmpty()); |
436 SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); | 440 SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); |
437 DCHECK(!data->created_); | 441 DCHECK(!data->created_); |
438 Isolate* isolate = data->isolate_; | 442 Isolate* isolate = data->isolate_; |
439 CHECK_EQ(isolate, context->GetIsolate()); | 443 CHECK_EQ(isolate, context->GetIsolate()); |
440 size_t index = static_cast<int>(data->contexts_.Size()); | 444 size_t index = static_cast<int>(data->contexts_.Size()); |
441 data->contexts_.Append(context); | 445 data->contexts_.Append(context); |
442 return index; | 446 return index; |
443 } | 447 } |
444 | 448 |
| 449 size_t SnapshotCreator::AddTemplate(Local<Template> template_obj) { |
| 450 DCHECK(!template_obj.IsEmpty()); |
| 451 SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); |
| 452 DCHECK(!data->created_); |
| 453 DCHECK_EQ(reinterpret_cast<i::Isolate*>(data->isolate_), |
| 454 Utils::OpenHandle(*template_obj)->GetIsolate()); |
| 455 size_t index = static_cast<int>(data->templates_.Size()); |
| 456 data->templates_.Append(template_obj); |
| 457 return index; |
| 458 } |
| 459 |
445 StartupData SnapshotCreator::CreateBlob( | 460 StartupData SnapshotCreator::CreateBlob( |
446 SnapshotCreator::FunctionCodeHandling function_code_handling) { | 461 SnapshotCreator::FunctionCodeHandling function_code_handling) { |
447 SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); | 462 SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); |
448 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(data->isolate_); | 463 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(data->isolate_); |
449 DCHECK(!data->created_); | 464 DCHECK(!data->created_); |
450 | 465 |
| 466 { |
| 467 int num_templates = static_cast<int>(data->templates_.Size()); |
| 468 i::HandleScope scope(isolate); |
| 469 i::Handle<i::FixedArray> templates = |
| 470 isolate->factory()->NewFixedArray(num_templates, i::TENURED); |
| 471 for (int i = 0; i < num_templates; i++) { |
| 472 templates->set(i, *v8::Utils::OpenHandle(*data->templates_.Get(i))); |
| 473 } |
| 474 isolate->heap()->SetSerializedTemplates(*templates); |
| 475 data->templates_.Clear(); |
| 476 } |
| 477 |
451 // If we don't do this then we end up with a stray root pointing at the | 478 // If we don't do this then we end up with a stray root pointing at the |
452 // context even after we have disposed of the context. | 479 // context even after we have disposed of the context. |
453 isolate->heap()->CollectAllAvailableGarbage("mksnapshot"); | 480 isolate->heap()->CollectAllAvailableGarbage("mksnapshot"); |
454 isolate->heap()->CompactWeakFixedArrays(); | 481 isolate->heap()->CompactWeakFixedArrays(); |
455 | 482 |
456 i::DisallowHeapAllocation no_gc_from_here_on; | 483 i::DisallowHeapAllocation no_gc_from_here_on; |
457 | 484 |
458 int num_contexts = static_cast<int>(data->contexts_.Size()); | 485 int num_contexts = static_cast<int>(data->contexts_.Size()); |
459 i::List<i::Object*> contexts(num_contexts); | 486 i::List<i::Object*> contexts(num_contexts); |
460 for (int i = 0; i < num_contexts; i++) { | 487 for (int i = 0; i < num_contexts; i++) { |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1166 int length) { | 1193 int length) { |
1167 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 1194 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
1168 // Changes to the environment cannot be captured in the snapshot. Expect no | 1195 // Changes to the environment cannot be captured in the snapshot. Expect no |
1169 // function templates when the isolate is created for serialization. | 1196 // function templates when the isolate is created for serialization. |
1170 LOG_API(i_isolate, FunctionTemplate, New); | 1197 LOG_API(i_isolate, FunctionTemplate, New); |
1171 ENTER_V8(i_isolate); | 1198 ENTER_V8(i_isolate); |
1172 return FunctionTemplateNew(i_isolate, callback, nullptr, data, signature, | 1199 return FunctionTemplateNew(i_isolate, callback, nullptr, data, signature, |
1173 length, false); | 1200 length, false); |
1174 } | 1201 } |
1175 | 1202 |
| 1203 Local<FunctionTemplate> FunctionTemplate::FromSnapshot(Isolate* isolate, |
| 1204 size_t index) { |
| 1205 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 1206 i::FixedArray* templates = i_isolate->heap()->serialized_templates(); |
| 1207 int int_index = static_cast<int>(index); |
| 1208 if (int_index < templates->length()) { |
| 1209 i::Object* info = i_isolate->heap()->serialized_templates()->get(int_index); |
| 1210 if (info->IsFunctionTemplateInfo()) { |
| 1211 return Utils::ToLocal(i::Handle<i::FunctionTemplateInfo>( |
| 1212 i::FunctionTemplateInfo::cast(info))); |
| 1213 } |
| 1214 } |
| 1215 return Local<FunctionTemplate>(); |
| 1216 } |
1176 | 1217 |
1177 Local<FunctionTemplate> FunctionTemplate::NewWithFastHandler( | 1218 Local<FunctionTemplate> FunctionTemplate::NewWithFastHandler( |
1178 Isolate* isolate, FunctionCallback callback, | 1219 Isolate* isolate, FunctionCallback callback, |
1179 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data, | 1220 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data, |
1180 v8::Local<Signature> signature, int length) { | 1221 v8::Local<Signature> signature, int length) { |
1181 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 1222 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
1182 DCHECK(!i_isolate->serializer_enabled()); | 1223 DCHECK(!i_isolate->serializer_enabled()); |
1183 LOG_API(i_isolate, FunctionTemplate, NewWithFastHandler); | 1224 LOG_API(i_isolate, FunctionTemplate, NewWithFastHandler); |
1184 ENTER_V8(i_isolate); | 1225 ENTER_V8(i_isolate); |
1185 return FunctionTemplateNew(i_isolate, callback, fast_handler, data, signature, | 1226 return FunctionTemplateNew(i_isolate, callback, fast_handler, data, signature, |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1377 obj->set_constructor(*Utils::OpenHandle(*constructor)); | 1418 obj->set_constructor(*Utils::OpenHandle(*constructor)); |
1378 obj->set_internal_field_count(i::Smi::FromInt(0)); | 1419 obj->set_internal_field_count(i::Smi::FromInt(0)); |
1379 return Utils::ToLocal(obj); | 1420 return Utils::ToLocal(obj); |
1380 } | 1421 } |
1381 | 1422 |
1382 Local<ObjectTemplate> ObjectTemplate::New( | 1423 Local<ObjectTemplate> ObjectTemplate::New( |
1383 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) { | 1424 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) { |
1384 return ObjectTemplateNew(isolate, constructor, false); | 1425 return ObjectTemplateNew(isolate, constructor, false); |
1385 } | 1426 } |
1386 | 1427 |
| 1428 Local<ObjectTemplate> ObjectTemplate::FromSnapshot(Isolate* isolate, |
| 1429 size_t index) { |
| 1430 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 1431 i::FixedArray* templates = i_isolate->heap()->serialized_templates(); |
| 1432 int int_index = static_cast<int>(index); |
| 1433 if (int_index < templates->length()) { |
| 1434 i::Object* info = i_isolate->heap()->serialized_templates()->get(int_index); |
| 1435 if (info->IsObjectTemplateInfo()) { |
| 1436 return Utils::ToLocal( |
| 1437 i::Handle<i::ObjectTemplateInfo>(i::ObjectTemplateInfo::cast(info))); |
| 1438 } |
| 1439 } |
| 1440 return Local<ObjectTemplate>(); |
| 1441 } |
| 1442 |
1387 // Ensure that the object template has a constructor. If no | 1443 // Ensure that the object template has a constructor. If no |
1388 // constructor is available we create one. | 1444 // constructor is available we create one. |
1389 static i::Handle<i::FunctionTemplateInfo> EnsureConstructor( | 1445 static i::Handle<i::FunctionTemplateInfo> EnsureConstructor( |
1390 i::Isolate* isolate, | 1446 i::Isolate* isolate, |
1391 ObjectTemplate* object_template) { | 1447 ObjectTemplate* object_template) { |
1392 i::Object* obj = Utils::OpenHandle(object_template)->constructor(); | 1448 i::Object* obj = Utils::OpenHandle(object_template)->constructor(); |
1393 if (!obj->IsUndefined(isolate)) { | 1449 if (!obj->IsUndefined(isolate)) { |
1394 i::FunctionTemplateInfo* info = i::FunctionTemplateInfo::cast(obj); | 1450 i::FunctionTemplateInfo* info = i::FunctionTemplateInfo::cast(obj); |
1395 return i::Handle<i::FunctionTemplateInfo>(info, isolate); | 1451 return i::Handle<i::FunctionTemplateInfo>(info, isolate); |
1396 } | 1452 } |
(...skipping 7425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8822 Address callback_address = | 8878 Address callback_address = |
8823 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8879 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
8824 VMState<EXTERNAL> state(isolate); | 8880 VMState<EXTERNAL> state(isolate); |
8825 ExternalCallbackScope call_scope(isolate, callback_address); | 8881 ExternalCallbackScope call_scope(isolate, callback_address); |
8826 callback(info); | 8882 callback(info); |
8827 } | 8883 } |
8828 | 8884 |
8829 | 8885 |
8830 } // namespace internal | 8886 } // namespace internal |
8831 } // namespace v8 | 8887 } // namespace v8 |
OLD | NEW |