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

Side by Side Diff: runtime/bin/main.cc

Issue 2405393002: Use a single file for app snapshots. (Closed)
Patch Set: . Created 4 years, 2 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
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include <stdlib.h> 5 #include <stdlib.h>
6 #include <string.h> 6 #include <string.h>
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include "include/dart_api.h" 9 #include "include/dart_api.h"
10 #include "include/dart_tools_api.h" 10 #include "include/dart_tools_api.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 // the same way as precompilation before main, then continue running in the 90 // the same way as precompilation before main, then continue running in the
91 // same process. 91 // same process.
92 // Always set this with dart_noopt. 92 // Always set this with dart_noopt.
93 #if defined(DART_PRECOMPILER) && !defined(DART_NO_SNAPSHOT) 93 #if defined(DART_PRECOMPILER) && !defined(DART_NO_SNAPSHOT)
94 static const bool is_noopt = true; 94 static const bool is_noopt = true;
95 #else 95 #else
96 static const bool is_noopt = false; 96 static const bool is_noopt = false;
97 #endif 97 #endif
98 98
99 99
100 extern const char* kPrecompiledLibraryName; 100 extern const char* kPrecompiledVMIsolateSymbolName;
101 extern const char* kPrecompiledIsolateSymbolName;
101 extern const char* kPrecompiledInstructionsSymbolName; 102 extern const char* kPrecompiledInstructionsSymbolName;
102 extern const char* kPrecompiledDataSymbolName; 103 extern const char* kPrecompiledDataSymbolName;
103 104
104 static const char* kVMIsolateSuffix = "snapshot.vmisolate";
105 static const char* kIsolateSuffix = "snapshot.isolate";
106 static const char* kAssemblySuffix = "snapshot.S";
107 static const char* kInstructionsSuffix = "snapshot.instructions";
108 static const char* kRODataSuffix = "snapshot.rodata";
109
110 105
111 // Global flag that is used to indicate that we want to trace resolution of 106 // Global flag that is used to indicate that we want to trace resolution of
112 // URIs and the loading of libraries, parts and scripts. 107 // URIs and the loading of libraries, parts and scripts.
113 static bool trace_loading = false; 108 static bool trace_loading = false;
114 109
115 110
116 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1"; 111 static const char* DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1";
117 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181; 112 static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
118 // VM Service options. 113 // VM Service options.
119 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP; 114 static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP;
(...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after
1200 "Unable to write file %s for writing snapshot\n", 1195 "Unable to write file %s for writing snapshot\n",
1201 qualified_filename); 1196 qualified_filename);
1202 } 1197 }
1203 file->Release(); 1198 file->Release();
1204 if (concat != NULL) { 1199 if (concat != NULL) {
1205 delete concat; 1200 delete concat;
1206 } 1201 }
1207 } 1202 }
1208 1203
1209 1204
1210 static void ReadSnapshotFile(const char* snapshot_directory, 1205 static const int64_t kAppSnapshotHeaderSize = 5 * sizeof(int64_t); // NOLINT
1211 const char* filename, 1206 static const int64_t kAppSnapshotMagicNumber = 0xf6f6dcdc;
1212 const uint8_t** buffer) { 1207 static const int64_t kAppSnapshotPageSize = 4 * KB;
1213 char* concat = NULL; 1208
1214 const char* qualified_filename; 1209
1215 if ((snapshot_directory != NULL) && (strlen(snapshot_directory) > 0)) { 1210 static bool ReadAppSnapshotBlobs(const char* script_name,
1216 intptr_t len = snprintf(NULL, 0, "%s/%s", snapshot_directory, filename); 1211 const uint8_t** vmisolate_buffer,
1217 concat = new char[len + 1]; 1212 const uint8_t** isolate_buffer,
1218 snprintf(concat, len + 1, "%s/%s", snapshot_directory, filename); 1213 const uint8_t** instructions_buffer,
1219 qualified_filename = concat; 1214 const uint8_t** rodata_buffer) {
1215 File* file = File::Open(script_name, File::kRead);
1216 if (file == NULL) {
1217 return false;
1218 }
1219 if (file->Length() < kAppSnapshotHeaderSize) {
1220 file->Release();
1221 return false;
1222 }
1223 int64_t magic = 0;
1224 int64_t vmisolate_size = 0;
1225 int64_t isolate_size = 0;
1226 int64_t instructions_size = 0;
1227 int64_t rodata_size = 0;
1228 if (!file->ReadFully(&magic, sizeof(magic))) {
1229 file->Release();
1230 return false;
1231 }
1232 if (magic != kAppSnapshotMagicNumber) {
1233 file->Release();
1234 return false;
1235 }
1236 file->ReadFully(&vmisolate_size, sizeof(vmisolate_size));
1237 file->ReadFully(&isolate_size, sizeof(isolate_size));
1238 file->ReadFully(&instructions_size, sizeof(instructions_size));
1239 file->ReadFully(&rodata_size, sizeof(rodata_size));
1240 ASSERT(file->Position() == kAppSnapshotHeaderSize);
siva 2016/10/12 20:37:33 Instead of these individual reads of the magic num
rmacnak 2016/10/13 01:08:16 Done.
1241
1242 int64_t position = file->Position();
1243 position = Utils::RoundUp(position, kAppSnapshotPageSize);
1244 *vmisolate_buffer = reinterpret_cast<const uint8_t*>(
1245 file->MapReadOnly(position, vmisolate_size));
1246 if (*vmisolate_buffer == NULL) {
1247 ErrorExit(kErrorExitCode, "Failed to memory map snapshot\n");
1248 }
1249 position += vmisolate_size;
1250
1251 position = Utils::RoundUp(position, kAppSnapshotPageSize);
1252 *isolate_buffer = reinterpret_cast<const uint8_t*>(
1253 file->MapReadOnly(position, isolate_size));
1254 if (*isolate_buffer == NULL) {
1255 ErrorExit(kErrorExitCode, "Failed to memory map snapshot\n");
1256 }
1257 position += isolate_size;
1258
1259 if (instructions_size == 0) {
1260 *instructions_buffer = NULL;
1220 } else { 1261 } else {
1221 qualified_filename = filename; 1262 position = Utils::RoundUp(position, kAppSnapshotPageSize);
1222 } 1263 *instructions_buffer = reinterpret_cast<const uint8_t*>(
1223 1264 file->MapReadExecute(position, instructions_size));
1224 void* file = DartUtils::OpenFile(qualified_filename, false); 1265 if (*instructions_buffer == NULL) {
1266 ErrorExit(kErrorExitCode, "Failed to memory map snapshot\n");
1267 }
1268 position += instructions_size;
1269 }
1270
1271 if (rodata_size == 0) {
1272 *rodata_buffer = NULL;
1273 } else {
1274 position = Utils::RoundUp(position, kAppSnapshotPageSize);
1275 *rodata_buffer = reinterpret_cast<const uint8_t*>(
1276 file->MapReadOnly(position, rodata_size));
1277 if (*rodata_buffer == NULL) {
1278 ErrorExit(kErrorExitCode, "Failed to memory map snapshot\n");
1279 }
1280 }
1281
siva 2016/10/12 20:37:33 Can the order of rodata be swapped with instructio
rmacnak 2016/10/13 01:08:16 Done.
1282 return true;
siva 2016/10/12 20:37:33 Missing file->Release() for the success case? On L
rmacnak 2016/10/13 01:08:16 Done.
1283 }
1284
1285
1286 static bool ReadAppSnapshotDynamicLibrary(const char* script_name,
1287 const uint8_t** vmisolate_buffer,
1288 const uint8_t** isolate_buffer,
1289 const uint8_t** instructions_buffer,
1290 const uint8_t** rodata_buffer) {
1291 void* library = Extensions::LoadExtensionLibrary(script_name);
siva 2016/10/12 20:37:33 Can you make sure that this will work for any name
rmacnak 2016/10/13 01:08:16 Done, using the same for both platforms in the tes
1292 if (library == NULL) {
1293 return false;
1294 }
1295
1296 *vmisolate_buffer = reinterpret_cast<const uint8_t*>(
1297 Extensions::ResolveSymbol(library, kPrecompiledVMIsolateSymbolName));
1298 if (*vmisolate_buffer == NULL) {
1299 ErrorExit(kErrorExitCode, "Failed to resolve symbol '%s'\n",
1300 kPrecompiledVMIsolateSymbolName);
1301 }
1302
1303 *isolate_buffer = reinterpret_cast<const uint8_t*>(
1304 Extensions::ResolveSymbol(library, kPrecompiledIsolateSymbolName));
1305 if (*isolate_buffer == NULL) {
1306 ErrorExit(kErrorExitCode, "Failed to resolve symbol '%s'\n",
1307 kPrecompiledIsolateSymbolName);
1308 }
1309
1310 *instructions_buffer = reinterpret_cast<const uint8_t*>(
1311 Extensions::ResolveSymbol(library, kPrecompiledInstructionsSymbolName));
1312 if (*instructions_buffer == NULL) {
1313 ErrorExit(kErrorExitCode, "Failed to resolve symbol '%s'\n",
1314 kPrecompiledInstructionsSymbolName);
1315 }
1316
1317 *rodata_buffer = reinterpret_cast<const uint8_t*>(
1318 Extensions::ResolveSymbol(library, kPrecompiledDataSymbolName));
1319 if (*rodata_buffer == NULL) {
1320 ErrorExit(kErrorExitCode, "Failed to resolve symbol '%s'\n",
1321 kPrecompiledDataSymbolName);
1322 }
1323
1324 return true;
1325 }
1326
1327
1328 static bool ReadAppSnapshot(const char* script_name,
1329 const uint8_t** vmisolate_buffer,
1330 const uint8_t** isolate_buffer,
1331 const uint8_t** instructions_buffer,
1332 const uint8_t** rodata_buffer) {
1333 if (ReadAppSnapshotBlobs(script_name,
1334 vmisolate_buffer,
1335 isolate_buffer,
1336 instructions_buffer,
1337 rodata_buffer)) {
1338 return true;
1339 }
1340 return ReadAppSnapshotDynamicLibrary(script_name,
1341 vmisolate_buffer,
1342 isolate_buffer,
1343 instructions_buffer,
1344 rodata_buffer);
1345 }
1346
1347
1348 static bool WriteInt64(File* file, int64_t size) {
1349 return file->WriteFully(&size, sizeof(size));
1350 }
1351
1352
1353 static void WriteAppSnapshot(const char* filename,
1354 uint8_t* vmisolate_buffer,
1355 intptr_t vmisolate_size,
1356 uint8_t* isolate_buffer,
1357 intptr_t isolate_size,
1358 uint8_t* instructions_buffer,
1359 intptr_t instructions_size,
1360 uint8_t* rodata_buffer,
1361 intptr_t rodata_size) {
1362 File* file = File::Open(filename, File::kWriteTruncate);
1225 if (file == NULL) { 1363 if (file == NULL) {
1226 fprintf(stderr, 1364 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
1227 "Error: Unable to open file %s for reading snapshot\n", 1365 }
1228 qualified_filename); 1366
1229 fflush(stderr); 1367 file->WriteFully(&kAppSnapshotMagicNumber, sizeof(kAppSnapshotMagicNumber));
1230 Platform::Exit(kErrorExitCode); 1368 WriteInt64(file, vmisolate_size);
1231 } 1369 WriteInt64(file, isolate_size);
1232 intptr_t len = -1; 1370 WriteInt64(file, instructions_size);
1233 DartUtils::ReadFile(buffer, &len, file); 1371 WriteInt64(file, rodata_size);
1234 if ((*buffer == NULL) || (len == -1)) { 1372 ASSERT(file->Position() == kAppSnapshotHeaderSize);
1235 fprintf(stderr, 1373
1236 "Error: Unable to read snapshot file %s\n", qualified_filename); 1374 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1237 fflush(stderr); 1375 if (!file->WriteFully(vmisolate_buffer, vmisolate_size)) {
1238 Platform::Exit(kErrorExitCode); 1376 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
1239 } 1377 }
1240 DartUtils::CloseFile(file); 1378
1241 if (concat != NULL) { 1379 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1242 delete[] concat; 1380 if (!file->WriteFully(isolate_buffer, isolate_size)) {
1243 } 1381 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n", filename);
1244 } 1382 }
1245 1383
1246 1384 if (instructions_size != 0) {
1247 static void ReadExecutableSnapshotFile(const char* snapshot_directory, 1385 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1248 const char* filename, 1386 if (!file->WriteFully(instructions_buffer, instructions_size)) {
1249 const uint8_t** buffer) { 1387 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n",
1250 char* concat = NULL; 1388 filename);
1251 const char* qualified_filename; 1389 }
1252 if ((snapshot_directory != NULL) && (strlen(snapshot_directory) > 0)) { 1390 }
1253 intptr_t len = snprintf(NULL, 0, "%s/%s", snapshot_directory, filename); 1391
1254 concat = new char[len + 1]; 1392 if (rodata_size != 0) {
1255 snprintf(concat, len + 1, "%s/%s", snapshot_directory, filename); 1393 file->SetPosition(Utils::RoundUp(file->Position(), kAppSnapshotPageSize));
1256 qualified_filename = concat; 1394 if (!file->WriteFully(rodata_buffer, rodata_size)) {
1257 } else { 1395 ErrorExit(kErrorExitCode, "Unable to write snapshot file '%s'\n",
1258 qualified_filename = filename; 1396 filename);
1259 } 1397 }
1260 1398 }
1261 intptr_t len = -1; 1399
1262 *buffer = reinterpret_cast<uint8_t*>( 1400 file->Flush();
1263 DartUtils::MapExecutable(qualified_filename, &len)); 1401 file->Release();
1264 if ((*buffer == NULL) || (len == -1)) { 1402 }
1265 fprintf(stderr, 1403
1266 "Error: Unable to read snapshot file %s\n", qualified_filename); 1404
1267 fflush(stderr);
1268 Platform::Exit(kErrorExitCode);
1269 }
1270 if (concat != NULL) {
1271 delete[] concat;
1272 }
1273 }
1274
1275
1276 static void* LoadLibrarySymbol(const char* snapshot_directory,
1277 const char* libname,
1278 const char* symname) {
1279 char* concat = NULL;
1280 const char* qualified_libname;
1281 if ((snapshot_directory != NULL) && (strlen(snapshot_directory) > 0)) {
1282 intptr_t len = snprintf(NULL, 0, "%s/%s", snapshot_directory, libname);
1283 concat = new char[len + 1];
1284 snprintf(concat, len + 1, "%s/%s", snapshot_directory, libname);
1285 qualified_libname = concat;
1286 } else {
1287 qualified_libname = libname;
1288 }
1289 void* library = Extensions::LoadExtensionLibrary(qualified_libname);
1290 if (concat != NULL) {
1291 delete concat;
1292 }
1293 if (library == NULL) {
1294 return NULL;
1295 }
1296 return Extensions::ResolveSymbol(library, symname);
1297 }
1298
1299
1300 static void GenerateScriptSnapshot() { 1405 static void GenerateScriptSnapshot() {
1301 // First create a snapshot. 1406 // First create a snapshot.
1302 uint8_t* buffer = NULL; 1407 uint8_t* buffer = NULL;
1303 intptr_t size = 0; 1408 intptr_t size = 0;
1304 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size); 1409 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size);
1305 if (Dart_IsError(result)) { 1410 if (Dart_IsError(result)) {
1306 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1411 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1307 } 1412 }
1308 1413
1309 WriteSnapshotFile(NULL, snapshot_filename, true, buffer, size); 1414 WriteSnapshotFile(NULL, snapshot_filename, true, buffer, size);
(...skipping 17 matching lines...) Expand all
1327 &vm_isolate_buffer, 1432 &vm_isolate_buffer,
1328 &vm_isolate_size, 1433 &vm_isolate_size,
1329 &isolate_buffer, 1434 &isolate_buffer,
1330 &isolate_size, 1435 &isolate_size,
1331 &instructions_blob_buffer, 1436 &instructions_blob_buffer,
1332 &instructions_blob_size, 1437 &instructions_blob_size,
1333 &rodata_blob_buffer, 1438 &rodata_blob_buffer,
1334 &rodata_blob_size); 1439 &rodata_blob_size);
1335 } else { 1440 } else {
1336 result = Dart_CreatePrecompiledSnapshotAssembly( 1441 result = Dart_CreatePrecompiledSnapshotAssembly(
1337 &vm_isolate_buffer,
1338 &vm_isolate_size,
1339 &isolate_buffer,
1340 &isolate_size,
1341 &assembly_buffer, 1442 &assembly_buffer,
1342 &assembly_size); 1443 &assembly_size);
1343 } 1444 }
1344 if (Dart_IsError(result)) { 1445 if (Dart_IsError(result)) {
1345 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1446 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1346 } 1447 }
1347 WriteSnapshotFile(snapshot_filename, kVMIsolateSuffix,
1348 false,
1349 vm_isolate_buffer,
1350 vm_isolate_size);
1351 WriteSnapshotFile(snapshot_filename, kIsolateSuffix,
1352 false,
1353 isolate_buffer,
1354 isolate_size);
1355 if (use_blobs) { 1448 if (use_blobs) {
1356 WriteSnapshotFile(snapshot_filename, kInstructionsSuffix, 1449 WriteAppSnapshot(snapshot_filename,
1357 false, 1450 vm_isolate_buffer,
1358 instructions_blob_buffer, 1451 vm_isolate_size,
1359 instructions_blob_size); 1452 isolate_buffer,
1360 WriteSnapshotFile(snapshot_filename, kRODataSuffix, 1453 isolate_size,
1361 false, 1454 instructions_blob_buffer,
1362 rodata_blob_buffer, 1455 instructions_blob_size,
1363 rodata_blob_size); 1456 rodata_blob_buffer,
1457 rodata_blob_size);
1364 } else { 1458 } else {
1365 WriteSnapshotFile(snapshot_filename, kAssemblySuffix, 1459 WriteSnapshotFile(NULL, snapshot_filename,
1366 false, 1460 false,
1367 assembly_buffer, 1461 assembly_buffer,
1368 assembly_size); 1462 assembly_size);
1369 } 1463 }
1370 } 1464 }
1371 1465
1372 1466
1373 static void GeneratePrecompiledJITSnapshot() { 1467 static void GeneratePrecompiledJITSnapshot() {
1374 if (!use_blobs) {
1375 ErrorExit(kErrorExitCode,
1376 "Generating app JIT snapshots as assembly unimplemented\n");
1377 }
1378 uint8_t* vm_isolate_buffer = NULL; 1468 uint8_t* vm_isolate_buffer = NULL;
1379 intptr_t vm_isolate_size = 0; 1469 intptr_t vm_isolate_size = 0;
1380 uint8_t* isolate_buffer = NULL; 1470 uint8_t* isolate_buffer = NULL;
1381 intptr_t isolate_size = 0; 1471 intptr_t isolate_size = 0;
1382 uint8_t* instructions_blob_buffer = NULL; 1472 uint8_t* instructions_blob_buffer = NULL;
1383 intptr_t instructions_blob_size = 0; 1473 intptr_t instructions_blob_size = 0;
1384 uint8_t* rodata_blob_buffer = NULL; 1474 uint8_t* rodata_blob_buffer = NULL;
1385 intptr_t rodata_blob_size = 0; 1475 intptr_t rodata_blob_size = 0;
1386 Dart_Handle result = Dart_CreateAppJITSnapshot( 1476 Dart_Handle result = Dart_CreateAppJITSnapshot(
1387 &vm_isolate_buffer, 1477 &vm_isolate_buffer,
1388 &vm_isolate_size, 1478 &vm_isolate_size,
1389 &isolate_buffer, 1479 &isolate_buffer,
1390 &isolate_size, 1480 &isolate_size,
1391 &instructions_blob_buffer, 1481 &instructions_blob_buffer,
1392 &instructions_blob_size, 1482 &instructions_blob_size,
1393 &rodata_blob_buffer, 1483 &rodata_blob_buffer,
1394 &rodata_blob_size); 1484 &rodata_blob_size);
1395 if (Dart_IsError(result)) { 1485 if (Dart_IsError(result)) {
1396 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1486 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1397 } 1487 }
1398 WriteSnapshotFile(snapshot_filename, kVMIsolateSuffix, 1488 WriteAppSnapshot(snapshot_filename,
1399 false, 1489 vm_isolate_buffer,
1400 vm_isolate_buffer, 1490 vm_isolate_size,
1401 vm_isolate_size); 1491 isolate_buffer,
1402 WriteSnapshotFile(snapshot_filename, kIsolateSuffix, 1492 isolate_size,
1403 false, 1493 instructions_blob_buffer,
1404 isolate_buffer, 1494 instructions_blob_size,
1405 isolate_size); 1495 rodata_blob_buffer,
1406 WriteSnapshotFile(snapshot_filename, kInstructionsSuffix, 1496 rodata_blob_size);
1407 false,
1408 instructions_blob_buffer,
1409 instructions_blob_size);
1410 WriteSnapshotFile(snapshot_filename, kRODataSuffix,
1411 false,
1412 rodata_blob_buffer,
1413 rodata_blob_size);
1414 } 1497 }
1415 1498
1416 1499
1417 static void GenerateFullSnapshot() { 1500 static void GenerateFullSnapshot() {
1418 // Create a full snapshot of the script. 1501 // Create a full snapshot of the script.
1419 Dart_Handle result; 1502 Dart_Handle result;
1420 uint8_t* vm_isolate_buffer = NULL; 1503 uint8_t* vm_isolate_buffer = NULL;
1421 intptr_t vm_isolate_size = 0; 1504 intptr_t vm_isolate_size = 0;
1422 uint8_t* isolate_buffer = NULL; 1505 uint8_t* isolate_buffer = NULL;
1423 intptr_t isolate_size = 0; 1506 intptr_t isolate_size = 0;
1424 1507
1425 result = Dart_CreateSnapshot(&vm_isolate_buffer, 1508 result = Dart_CreateSnapshot(&vm_isolate_buffer,
1426 &vm_isolate_size, 1509 &vm_isolate_size,
1427 &isolate_buffer, 1510 &isolate_buffer,
1428 &isolate_size); 1511 &isolate_size);
1429 if (Dart_IsError(result)) { 1512 if (Dart_IsError(result)) {
1430 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result)); 1513 ErrorExit(kErrorExitCode, "%s\n", Dart_GetError(result));
1431 } 1514 }
1432 1515
1433 WriteSnapshotFile(snapshot_filename, 1516 WriteAppSnapshot(snapshot_filename,
1434 kVMIsolateSuffix, 1517 vm_isolate_buffer,
1435 false, 1518 vm_isolate_size,
1436 vm_isolate_buffer, 1519 isolate_buffer,
1437 vm_isolate_size); 1520 isolate_size,
1438 WriteSnapshotFile(snapshot_filename, 1521 NULL, 0, NULL, 0);
1439 kIsolateSuffix,
1440 false,
1441 isolate_buffer,
1442 isolate_size);
1443 } 1522 }
1444 1523
1445 1524
1446 #define CHECK_RESULT(result) \ 1525 #define CHECK_RESULT(result) \
1447 if (Dart_IsError(result)) { \ 1526 if (Dart_IsError(result)) { \
1448 if (Dart_IsVMRestartRequest(result)) { \ 1527 if (Dart_IsVMRestartRequest(result)) { \
1449 Dart_ExitScope(); \ 1528 Dart_ExitScope(); \
1450 Dart_ShutdownIsolate(); \ 1529 Dart_ShutdownIsolate(); \
1451 return true; \ 1530 return true; \
1452 } \ 1531 } \
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1771 1850
1772 Loader::InitOnce(); 1851 Loader::InitOnce();
1773 1852
1774 if (!DartUtils::SetOriginalWorkingDirectory()) { 1853 if (!DartUtils::SetOriginalWorkingDirectory()) {
1775 OSError err; 1854 OSError err;
1776 fprintf(stderr, "Error determining current directory: %s\n", err.message()); 1855 fprintf(stderr, "Error determining current directory: %s\n", err.message());
1777 fflush(stderr); 1856 fflush(stderr);
1778 Platform::Exit(kErrorExitCode); 1857 Platform::Exit(kErrorExitCode);
1779 } 1858 }
1780 1859
1860 const uint8_t* instructions_snapshot = NULL;
1861 const uint8_t* data_snapshot = NULL;
1862
1863 if (ReadAppSnapshot(script_name,
1864 &vm_isolate_snapshot_buffer,
1865 &isolate_snapshot_buffer,
1866 &instructions_snapshot,
1867 &data_snapshot)) {
1868 run_app_snapshot = true;
1869 }
1870
1781 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME) 1871 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
1782 // Constant true if PRODUCT or DART_PRECOMPILED_RUNTIME. 1872 // Constant true if PRODUCT or DART_PRECOMPILED_RUNTIME.
1783 if ((gen_snapshot_kind != kNone) || run_app_snapshot) { 1873 if ((gen_snapshot_kind != kNone) || run_app_snapshot) {
1784 vm_options.AddArgument("--load_deferred_eagerly"); 1874 vm_options.AddArgument("--load_deferred_eagerly");
1785 } 1875 }
1786 #endif 1876 #endif
1787 1877
1788 if (gen_snapshot_kind == kAppJITAfterRun) { 1878 if (gen_snapshot_kind == kAppJITAfterRun) {
1789 vm_options.AddArgument("--fields_may_be_reset"); 1879 vm_options.AddArgument("--fields_may_be_reset");
1790 } 1880 }
1791 if ((gen_snapshot_kind == kAppAOT) || is_noopt) { 1881 if ((gen_snapshot_kind == kAppAOT) || is_noopt) {
1792 vm_options.AddArgument("--precompilation"); 1882 vm_options.AddArgument("--precompilation");
1793 } 1883 }
1794 #if defined(DART_PRECOMPILED_RUNTIME) 1884 #if defined(DART_PRECOMPILED_RUNTIME)
1795 vm_options.AddArgument("--precompilation"); 1885 vm_options.AddArgument("--precompilation");
1796 #endif 1886 #endif
1797 1887
1798 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); 1888 Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
1799 1889
1800 // Start event handler. 1890 // Start event handler.
1801 TimerUtils::InitOnce(); 1891 TimerUtils::InitOnce();
1802 EventHandler::Start(); 1892 EventHandler::Start();
1803 1893
1804 const uint8_t* instructions_snapshot = NULL;
1805 const uint8_t* data_snapshot = NULL;
1806 if (run_app_snapshot) {
1807 ReadSnapshotFile(snapshot_filename, kVMIsolateSuffix,
1808 &vm_isolate_snapshot_buffer);
1809 ReadSnapshotFile(snapshot_filename, kIsolateSuffix,
1810 &isolate_snapshot_buffer);
1811 if (use_blobs) {
1812 ReadExecutableSnapshotFile(snapshot_filename,
1813 kInstructionsSuffix,
1814 &instructions_snapshot);
1815 ReadSnapshotFile(snapshot_filename, kRODataSuffix,
1816 &data_snapshot);
1817 } else {
1818 instructions_snapshot = reinterpret_cast<const uint8_t*>(
1819 LoadLibrarySymbol(snapshot_filename,
1820 kPrecompiledLibraryName,
1821 kPrecompiledInstructionsSymbolName));
1822 data_snapshot = reinterpret_cast<const uint8_t*>(
1823 LoadLibrarySymbol(snapshot_filename,
1824 kPrecompiledLibraryName,
1825 kPrecompiledDataSymbolName));
1826 }
1827 }
1828
1829 // Initialize the Dart VM. 1894 // Initialize the Dart VM.
1830 Dart_InitializeParams init_params; 1895 Dart_InitializeParams init_params;
1831 memset(&init_params, 0, sizeof(init_params)); 1896 memset(&init_params, 0, sizeof(init_params));
1832 init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION; 1897 init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
1833 init_params.vm_isolate_snapshot = vm_isolate_snapshot_buffer; 1898 init_params.vm_isolate_snapshot = vm_isolate_snapshot_buffer;
1834 init_params.instructions_snapshot = instructions_snapshot; 1899 init_params.instructions_snapshot = instructions_snapshot;
1835 init_params.data_snapshot = data_snapshot; 1900 init_params.data_snapshot = data_snapshot;
1836 init_params.create = CreateIsolateAndSetup; 1901 init_params.create = CreateIsolateAndSetup;
1837 init_params.shutdown = ShutdownIsolate; 1902 init_params.shutdown = ShutdownIsolate;
1838 init_params.file_open = DartUtils::OpenFile; 1903 init_params.file_open = DartUtils::OpenFile;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1893 Platform::Exit(Process::GlobalExitCode()); 1958 Platform::Exit(Process::GlobalExitCode());
1894 } 1959 }
1895 1960
1896 } // namespace bin 1961 } // namespace bin
1897 } // namespace dart 1962 } // namespace dart
1898 1963
1899 int main(int argc, char** argv) { 1964 int main(int argc, char** argv) {
1900 dart::bin::main(argc, argv); 1965 dart::bin::main(argc, argv);
1901 UNREACHABLE(); 1966 UNREACHABLE();
1902 } 1967 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698