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

Side by Side Diff: src/api.cc

Issue 2066993004: [snapshot] serialize embedder-provided external references. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: address comment Created 4 years, 6 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 unified diff | Download patch
« no previous file with comments | « include/v8.h ('k') | src/external-reference-table.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 } 393 }
394 394
395 ArrayBufferAllocator allocator_; 395 ArrayBufferAllocator allocator_;
396 Isolate* isolate_; 396 Isolate* isolate_;
397 PersistentValueVector<Context> contexts_; 397 PersistentValueVector<Context> contexts_;
398 bool created_; 398 bool created_;
399 }; 399 };
400 400
401 } // namespace 401 } // namespace
402 402
403 SnapshotCreator::SnapshotCreator(StartupData* existing_snapshot) { 403 SnapshotCreator::SnapshotCreator(intptr_t* external_references,
404 StartupData* existing_snapshot) {
404 i::Isolate* internal_isolate = new i::Isolate(true); 405 i::Isolate* internal_isolate = new i::Isolate(true);
405 Isolate* isolate = reinterpret_cast<Isolate*>(internal_isolate); 406 Isolate* isolate = reinterpret_cast<Isolate*>(internal_isolate);
406 SnapshotCreatorData* data = new SnapshotCreatorData(isolate); 407 SnapshotCreatorData* data = new SnapshotCreatorData(isolate);
407 data->isolate_ = isolate; 408 data->isolate_ = isolate;
408 internal_isolate->set_array_buffer_allocator(&data->allocator_); 409 internal_isolate->set_array_buffer_allocator(&data->allocator_);
410 internal_isolate->set_api_external_references(external_references);
409 isolate->Enter(); 411 isolate->Enter();
410 if (existing_snapshot) { 412 if (existing_snapshot) {
411 internal_isolate->set_snapshot_blob(existing_snapshot); 413 internal_isolate->set_snapshot_blob(existing_snapshot);
412 i::Snapshot::Initialize(internal_isolate); 414 i::Snapshot::Initialize(internal_isolate);
413 } else { 415 } else {
414 internal_isolate->Init(nullptr); 416 internal_isolate->Init(nullptr);
415 } 417 }
416 data_ = data; 418 data_ = data;
417 } 419 }
418 420
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 // Use following steps to create a warmed up snapshot blob from a cold one: 526 // Use following steps to create a warmed up snapshot blob from a cold one:
525 // - Create a new isolate from the cold snapshot. 527 // - Create a new isolate from the cold snapshot.
526 // - Create a new context to run the warmup script. This will trigger 528 // - Create a new context to run the warmup script. This will trigger
527 // compilation of executed functions. 529 // compilation of executed functions.
528 // - Create a new context. This context will be unpolluted. 530 // - Create a new context. This context will be unpolluted.
529 // - Serialize the isolate and the second context into a new snapshot blob. 531 // - Serialize the isolate and the second context into a new snapshot blob.
530 StartupData result = {nullptr, 0}; 532 StartupData result = {nullptr, 0};
531 base::ElapsedTimer timer; 533 base::ElapsedTimer timer;
532 timer.Start(); 534 timer.Start();
533 { 535 {
534 SnapshotCreator snapshot_creator(&cold_snapshot_blob); 536 SnapshotCreator snapshot_creator(nullptr, &cold_snapshot_blob);
535 Isolate* isolate = snapshot_creator.GetIsolate(); 537 Isolate* isolate = snapshot_creator.GetIsolate();
536 { 538 {
537 HandleScope scope(isolate); 539 HandleScope scope(isolate);
538 Local<Context> context = Context::New(isolate); 540 Local<Context> context = Context::New(isolate);
539 if (!RunExtraCode(isolate, context, warmup_source, "<warm-up>")) { 541 if (!RunExtraCode(isolate, context, warmup_source, "<warm-up>")) {
540 return result; 542 return result;
541 } 543 }
542 } 544 }
543 { 545 {
544 HandleScope handle_scope(isolate); 546 HandleScope handle_scope(isolate);
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data, 1133 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data,
1132 v8::Local<Signature> signature, int length, bool do_not_cache) { 1134 v8::Local<Signature> signature, int length, bool do_not_cache) {
1133 i::Handle<i::Struct> struct_obj = 1135 i::Handle<i::Struct> struct_obj =
1134 isolate->factory()->NewStruct(i::FUNCTION_TEMPLATE_INFO_TYPE); 1136 isolate->factory()->NewStruct(i::FUNCTION_TEMPLATE_INFO_TYPE);
1135 i::Handle<i::FunctionTemplateInfo> obj = 1137 i::Handle<i::FunctionTemplateInfo> obj =
1136 i::Handle<i::FunctionTemplateInfo>::cast(struct_obj); 1138 i::Handle<i::FunctionTemplateInfo>::cast(struct_obj);
1137 InitializeFunctionTemplate(obj); 1139 InitializeFunctionTemplate(obj);
1138 obj->set_do_not_cache(do_not_cache); 1140 obj->set_do_not_cache(do_not_cache);
1139 int next_serial_number = 0; 1141 int next_serial_number = 0;
1140 if (!do_not_cache) { 1142 if (!do_not_cache) {
1141 next_serial_number = isolate->next_serial_number() + 1; 1143 next_serial_number = isolate->heap()->GetNextTemplateSerialNumber();
1142 isolate->set_next_serial_number(next_serial_number);
1143 } 1144 }
1144 obj->set_serial_number(i::Smi::FromInt(next_serial_number)); 1145 obj->set_serial_number(i::Smi::FromInt(next_serial_number));
1145 if (callback != 0) { 1146 if (callback != 0) {
1146 if (data.IsEmpty()) { 1147 if (data.IsEmpty()) {
1147 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 1148 data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
1148 } 1149 }
1149 Utils::ToLocal(obj)->SetCallHandler(callback, data, fast_handler); 1150 Utils::ToLocal(obj)->SetCallHandler(callback, data, fast_handler);
1150 } 1151 }
1151 obj->set_length(length); 1152 obj->set_length(length);
1152 obj->set_undetectable(false); 1153 obj->set_undetectable(false);
1153 obj->set_needs_access_check(false); 1154 obj->set_needs_access_check(false);
1154 obj->set_accept_any_receiver(true); 1155 obj->set_accept_any_receiver(true);
1155 if (!signature.IsEmpty()) 1156 if (!signature.IsEmpty())
1156 obj->set_signature(*Utils::OpenHandle(*signature)); 1157 obj->set_signature(*Utils::OpenHandle(*signature));
1157 return Utils::ToLocal(obj); 1158 return Utils::ToLocal(obj);
1158 } 1159 }
1159 1160
1160 1161
1161 Local<FunctionTemplate> FunctionTemplate::New(Isolate* isolate, 1162 Local<FunctionTemplate> FunctionTemplate::New(Isolate* isolate,
1162 FunctionCallback callback, 1163 FunctionCallback callback,
1163 v8::Local<Value> data, 1164 v8::Local<Value> data,
1164 v8::Local<Signature> signature, 1165 v8::Local<Signature> signature,
1165 int length) { 1166 int length) {
1166 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 1167 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
1167 // Changes to the environment cannot be captured in the snapshot. Expect no 1168 // Changes to the environment cannot be captured in the snapshot. Expect no
1168 // function templates when the isolate is created for serialization. 1169 // function templates when the isolate is created for serialization.
1169 DCHECK(!i_isolate->serializer_enabled());
1170 LOG_API(i_isolate, FunctionTemplate, New); 1170 LOG_API(i_isolate, FunctionTemplate, New);
1171 ENTER_V8(i_isolate); 1171 ENTER_V8(i_isolate);
1172 return FunctionTemplateNew(i_isolate, callback, nullptr, data, signature, 1172 return FunctionTemplateNew(i_isolate, callback, nullptr, data, signature,
1173 length, false); 1173 length, false);
1174 } 1174 }
1175 1175
1176 1176
1177 Local<FunctionTemplate> FunctionTemplate::NewWithFastHandler( 1177 Local<FunctionTemplate> FunctionTemplate::NewWithFastHandler(
1178 Isolate* isolate, FunctionCallback callback, 1178 Isolate* isolate, FunctionCallback callback,
1179 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data, 1179 experimental::FastAccessorBuilder* fast_handler, v8::Local<Value> data,
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1354 } 1354 }
1355 1355
1356 1356
1357 Local<ObjectTemplate> ObjectTemplate::New() { 1357 Local<ObjectTemplate> ObjectTemplate::New() {
1358 return New(i::Isolate::Current(), Local<FunctionTemplate>()); 1358 return New(i::Isolate::Current(), Local<FunctionTemplate>());
1359 } 1359 }
1360 1360
1361 static Local<ObjectTemplate> ObjectTemplateNew( 1361 static Local<ObjectTemplate> ObjectTemplateNew(
1362 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor, 1362 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor,
1363 bool do_not_cache) { 1363 bool do_not_cache) {
1364 // Changes to the environment cannot be captured in the snapshot. Expect no
1365 // object templates when the isolate is created for serialization.
1366 DCHECK(!isolate->serializer_enabled());
1367 LOG_API(isolate, ObjectTemplate, New); 1364 LOG_API(isolate, ObjectTemplate, New);
1368 ENTER_V8(isolate); 1365 ENTER_V8(isolate);
1369 i::Handle<i::Struct> struct_obj = 1366 i::Handle<i::Struct> struct_obj =
1370 isolate->factory()->NewStruct(i::OBJECT_TEMPLATE_INFO_TYPE); 1367 isolate->factory()->NewStruct(i::OBJECT_TEMPLATE_INFO_TYPE);
1371 i::Handle<i::ObjectTemplateInfo> obj = 1368 i::Handle<i::ObjectTemplateInfo> obj =
1372 i::Handle<i::ObjectTemplateInfo>::cast(struct_obj); 1369 i::Handle<i::ObjectTemplateInfo>::cast(struct_obj);
1373 InitializeTemplate(obj, Consts::OBJECT_TEMPLATE); 1370 InitializeTemplate(obj, Consts::OBJECT_TEMPLATE);
1374 int next_serial_number = 0; 1371 int next_serial_number = 0;
1375 if (!do_not_cache) { 1372 if (!do_not_cache) {
1376 next_serial_number = isolate->next_serial_number() + 1; 1373 next_serial_number = isolate->heap()->GetNextTemplateSerialNumber();
1377 isolate->set_next_serial_number(next_serial_number);
1378 } 1374 }
1379 obj->set_serial_number(i::Smi::FromInt(next_serial_number)); 1375 obj->set_serial_number(i::Smi::FromInt(next_serial_number));
1380 if (!constructor.IsEmpty()) 1376 if (!constructor.IsEmpty())
1381 obj->set_constructor(*Utils::OpenHandle(*constructor)); 1377 obj->set_constructor(*Utils::OpenHandle(*constructor));
1382 obj->set_internal_field_count(i::Smi::FromInt(0)); 1378 obj->set_internal_field_count(i::Smi::FromInt(0));
1383 return Utils::ToLocal(obj); 1379 return Utils::ToLocal(obj);
1384 } 1380 }
1385 1381
1386 Local<ObjectTemplate> ObjectTemplate::New( 1382 Local<ObjectTemplate> ObjectTemplate::New(
1387 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) { 1383 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) {
(...skipping 5884 matching lines...) Expand 10 before | Expand all | Expand 10 after
7272 } 7268 }
7273 7269
7274 if (params.create_histogram_callback) { 7270 if (params.create_histogram_callback) {
7275 v8_isolate->SetCreateHistogramFunction(params.create_histogram_callback); 7271 v8_isolate->SetCreateHistogramFunction(params.create_histogram_callback);
7276 } 7272 }
7277 7273
7278 if (params.add_histogram_sample_callback) { 7274 if (params.add_histogram_sample_callback) {
7279 v8_isolate->SetAddHistogramSampleFunction( 7275 v8_isolate->SetAddHistogramSampleFunction(
7280 params.add_histogram_sample_callback); 7276 params.add_histogram_sample_callback);
7281 } 7277 }
7278
7279 isolate->set_api_external_references(params.external_references);
7282 SetResourceConstraints(isolate, params.constraints); 7280 SetResourceConstraints(isolate, params.constraints);
7283 // TODO(jochen): Once we got rid of Isolate::Current(), we can remove this. 7281 // TODO(jochen): Once we got rid of Isolate::Current(), we can remove this.
7284 Isolate::Scope isolate_scope(v8_isolate); 7282 Isolate::Scope isolate_scope(v8_isolate);
7285 if (params.entry_hook || !i::Snapshot::Initialize(isolate)) { 7283 if (params.entry_hook || !i::Snapshot::Initialize(isolate)) {
7286 isolate->Init(NULL); 7284 isolate->Init(NULL);
7287 } 7285 }
7288 return v8_isolate; 7286 return v8_isolate;
7289 } 7287 }
7290 7288
7291 7289
(...skipping 1532 matching lines...) Expand 10 before | Expand all | Expand 10 after
8824 Address callback_address = 8822 Address callback_address =
8825 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 8823 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8826 VMState<EXTERNAL> state(isolate); 8824 VMState<EXTERNAL> state(isolate);
8827 ExternalCallbackScope call_scope(isolate, callback_address); 8825 ExternalCallbackScope call_scope(isolate, callback_address);
8828 callback(info); 8826 callback(info);
8829 } 8827 }
8830 8828
8831 8829
8832 } // namespace internal 8830 } // namespace internal
8833 } // namespace v8 8831 } // namespace v8
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/external-reference-table.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698