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

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

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 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 | « runtime/bin/filter_unsupported.cc ('k') | runtime/bin/hashmap_test.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 (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 // Generate a snapshot file after loading all the scripts specified on the 5 // Generate a snapshot file after loading all the scripts specified on the
6 // command line. 6 // command line.
7 7
8 #include <stdio.h> 8 #include <stdio.h>
9 #include <stdlib.h> 9 #include <stdlib.h>
10 #include <string.h> 10 #include <string.h>
11 11
12 #include <cstdarg> 12 #include <cstdarg>
13 13
14 #include "bin/builtin.h" 14 #include "bin/builtin.h"
15 #include "bin/dartutils.h" 15 #include "bin/dartutils.h"
16 #include "bin/dfe.h" 16 #include "bin/dfe.h"
17 #include "bin/eventhandler.h" 17 #include "bin/eventhandler.h"
18 #include "bin/file.h" 18 #include "bin/file.h"
19 #include "bin/loader.h" 19 #include "bin/loader.h"
20 #include "bin/log.h" 20 #include "bin/log.h"
21 #include "bin/thread.h" 21 #include "bin/thread.h"
22 #include "bin/utils.h" 22 #include "bin/utils.h"
23 #include "bin/vmservice_impl.h" 23 #include "bin/vmservice_impl.h"
24 24
25 #include "include/dart_api.h" 25 #include "include/dart_api.h"
26 #include "include/dart_tools_api.h" 26 #include "include/dart_tools_api.h"
27 27
28 #include "platform/hashmap.h"
29 #include "platform/globals.h" 28 #include "platform/globals.h"
30 #include "platform/growable_array.h" 29 #include "platform/growable_array.h"
30 #include "platform/hashmap.h"
31 31
32 namespace dart { 32 namespace dart {
33 namespace bin { 33 namespace bin {
34 34
35 DFE dfe; 35 DFE dfe;
36 36
37 // Exit code indicating an API error. 37 // Exit code indicating an API error.
38 static const int kApiErrorExitCode = 253; 38 static const int kApiErrorExitCode = 253;
39 // Exit code indicating a compilation error. 39 // Exit code indicating a compilation error.
40 static const int kCompilationErrorExitCode = 254; 40 static const int kCompilationErrorExitCode = 254;
41 // Exit code indicating an unhandled error that is not a compilation error. 41 // Exit code indicating an unhandled error that is not a compilation error.
42 static const int kErrorExitCode = 255; 42 static const int kErrorExitCode = 255;
43 43
44 #define CHECK_RESULT(result) \ 44 #define CHECK_RESULT(result) \
45 if (Dart_IsError(result)) { \ 45 if (Dart_IsError(result)) { \
46 intptr_t exit_code = 0; \ 46 intptr_t exit_code = 0; \
47 Log::PrintErr("Error: %s\n", Dart_GetError(result)); \ 47 Log::PrintErr("Error: %s\n", Dart_GetError(result)); \
48 if (Dart_IsCompilationError(result)) { \ 48 if (Dart_IsCompilationError(result)) { \
49 exit_code = kCompilationErrorExitCode; \ 49 exit_code = kCompilationErrorExitCode; \
50 } else if (Dart_IsApiError(result)) { \ 50 } else if (Dart_IsApiError(result)) { \
51 exit_code = kApiErrorExitCode; \ 51 exit_code = kApiErrorExitCode; \
52 } else { \ 52 } else { \
53 exit_code = kErrorExitCode; \ 53 exit_code = kErrorExitCode; \
54 } \ 54 } \
55 Dart_ExitScope(); \ 55 Dart_ExitScope(); \
56 Dart_ShutdownIsolate(); \ 56 Dart_ShutdownIsolate(); \
57 exit(exit_code); \ 57 exit(exit_code); \
58 } 58 }
59 59
60
61 // The core snapshot to use when creating isolates. Normally NULL, but loaded 60 // The core snapshot to use when creating isolates. Normally NULL, but loaded
62 // from a file when creating script snapshots. 61 // from a file when creating script snapshots.
63 const uint8_t* isolate_snapshot_data = NULL; 62 const uint8_t* isolate_snapshot_data = NULL;
64 const uint8_t* isolate_snapshot_instructions = NULL; 63 const uint8_t* isolate_snapshot_instructions = NULL;
65 64
66
67 // Global state that indicates whether a snapshot is to be created and 65 // Global state that indicates whether a snapshot is to be created and
68 // if so which file to write the snapshot into. 66 // if so which file to write the snapshot into.
69 enum SnapshotKind { 67 enum SnapshotKind {
70 kCore, 68 kCore,
71 kCoreJIT, 69 kCoreJIT,
72 kScript, 70 kScript,
73 kAppAOTBlobs, 71 kAppAOTBlobs,
74 kAppAOTAssembly, 72 kAppAOTAssembly,
75 }; 73 };
76 static SnapshotKind snapshot_kind = kCore; 74 static SnapshotKind snapshot_kind = kCore;
77 static const char* vm_snapshot_data_filename = NULL; 75 static const char* vm_snapshot_data_filename = NULL;
78 static const char* vm_snapshot_instructions_filename = NULL; 76 static const char* vm_snapshot_instructions_filename = NULL;
79 static const char* isolate_snapshot_data_filename = NULL; 77 static const char* isolate_snapshot_data_filename = NULL;
80 static const char* isolate_snapshot_instructions_filename = NULL; 78 static const char* isolate_snapshot_instructions_filename = NULL;
81 static const char* assembly_filename = NULL; 79 static const char* assembly_filename = NULL;
82 static const char* script_snapshot_filename = NULL; 80 static const char* script_snapshot_filename = NULL;
83 static bool dependencies_only = false; 81 static bool dependencies_only = false;
84 static bool print_dependencies = false; 82 static bool print_dependencies = false;
85 static const char* dependencies_filename = NULL; 83 static const char* dependencies_filename = NULL;
86 84
87
88 // Value of the --load-compilation-trace flag. 85 // Value of the --load-compilation-trace flag.
89 // (This pointer points into an argv buffer and does not need to be 86 // (This pointer points into an argv buffer and does not need to be
90 // free'd.) 87 // free'd.)
91 static const char* load_compilation_trace_filename = NULL; 88 static const char* load_compilation_trace_filename = NULL;
92 89
93 // Value of the --package-root flag. 90 // Value of the --package-root flag.
94 // (This pointer points into an argv buffer and does not need to be 91 // (This pointer points into an argv buffer and does not need to be
95 // free'd.) 92 // free'd.)
96 static const char* commandline_package_root = NULL; 93 static const char* commandline_package_root = NULL;
97 94
98 // Value of the --packages flag. 95 // Value of the --packages flag.
99 // (This pointer points into an argv buffer and does not need to be 96 // (This pointer points into an argv buffer and does not need to be
100 // free'd.) 97 // free'd.)
101 static const char* commandline_packages_file = NULL; 98 static const char* commandline_packages_file = NULL;
102 99
103
104 // Global state which contains a pointer to the script name for which 100 // Global state which contains a pointer to the script name for which
105 // a snapshot needs to be created (NULL would result in the creation 101 // a snapshot needs to be created (NULL would result in the creation
106 // of a generic snapshot that contains only the corelibs). 102 // of a generic snapshot that contains only the corelibs).
107 static char* app_script_name = NULL; 103 static char* app_script_name = NULL;
108 104
109 // Global state that captures the entry point manifest files specified on the 105 // Global state that captures the entry point manifest files specified on the
110 // command line. 106 // command line.
111 static CommandLineOptions* entry_points_files = NULL; 107 static CommandLineOptions* entry_points_files = NULL;
112 108
113 static bool IsValidFlag(const char* name, 109 static bool IsValidFlag(const char* name,
114 const char* prefix, 110 const char* prefix,
115 intptr_t prefix_length) { 111 intptr_t prefix_length) {
116 intptr_t name_length = strlen(name); 112 intptr_t name_length = strlen(name);
117 return ((name_length > prefix_length) && 113 return ((name_length > prefix_length) &&
118 (strncmp(name, prefix, prefix_length) == 0)); 114 (strncmp(name, prefix, prefix_length) == 0));
119 } 115 }
120 116
121
122 // The environment provided through the command line using -D options. 117 // The environment provided through the command line using -D options.
123 static dart::HashMap* environment = NULL; 118 static dart::HashMap* environment = NULL;
124 119
125 static void* GetHashmapKeyFromString(char* key) { 120 static void* GetHashmapKeyFromString(char* key) {
126 return reinterpret_cast<void*>(key); 121 return reinterpret_cast<void*>(key);
127 } 122 }
128 123
129 static bool ProcessEnvironmentOption(const char* arg) { 124 static bool ProcessEnvironmentOption(const char* arg) {
130 ASSERT(arg != NULL); 125 ASSERT(arg != NULL);
131 if (*arg == '\0') { 126 if (*arg == '\0') {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 name[name_len] = '\0'; 159 name[name_len] = '\0';
165 value = strdup(equals_pos + 1); 160 value = strdup(equals_pos + 1);
166 } 161 }
167 HashMap::Entry* entry = environment->Lookup(GetHashmapKeyFromString(name), 162 HashMap::Entry* entry = environment->Lookup(GetHashmapKeyFromString(name),
168 HashMap::StringHash(name), true); 163 HashMap::StringHash(name), true);
169 ASSERT(entry != NULL); // Lookup adds an entry if key not found. 164 ASSERT(entry != NULL); // Lookup adds an entry if key not found.
170 entry->value = value; 165 entry->value = value;
171 return true; 166 return true;
172 } 167 }
173 168
174
175 static Dart_Handle EnvironmentCallback(Dart_Handle name) { 169 static Dart_Handle EnvironmentCallback(Dart_Handle name) {
176 uint8_t* utf8_array; 170 uint8_t* utf8_array;
177 intptr_t utf8_len; 171 intptr_t utf8_len;
178 Dart_Handle result = Dart_Null(); 172 Dart_Handle result = Dart_Null();
179 Dart_Handle handle = Dart_StringToUTF8(name, &utf8_array, &utf8_len); 173 Dart_Handle handle = Dart_StringToUTF8(name, &utf8_array, &utf8_len);
180 if (Dart_IsError(handle)) { 174 if (Dart_IsError(handle)) {
181 handle = Dart_ThrowException( 175 handle = Dart_ThrowException(
182 DartUtils::NewDartArgumentError(Dart_GetError(handle))); 176 DartUtils::NewDartArgumentError(Dart_GetError(handle)));
183 } else { 177 } else {
184 char* name_chars = reinterpret_cast<char*>(malloc(utf8_len + 1)); 178 char* name_chars = reinterpret_cast<char*>(malloc(utf8_len + 1));
(...skipping 10 matching lines...) Expand all
195 } 189 }
196 if (value != NULL) { 190 if (value != NULL) {
197 result = Dart_NewStringFromUTF8(reinterpret_cast<const uint8_t*>(value), 191 result = Dart_NewStringFromUTF8(reinterpret_cast<const uint8_t*>(value),
198 strlen(value)); 192 strlen(value));
199 } 193 }
200 free(name_chars); 194 free(name_chars);
201 } 195 }
202 return result; 196 return result;
203 } 197 }
204 198
205
206 static const char* ProcessOption(const char* option, const char* name) { 199 static const char* ProcessOption(const char* option, const char* name) {
207 const intptr_t length = strlen(name); 200 const intptr_t length = strlen(name);
208 if (strncmp(option, name, length) == 0) { 201 if (strncmp(option, name, length) == 0) {
209 return (option + length); 202 return (option + length);
210 } 203 }
211 return NULL; 204 return NULL;
212 } 205 }
213 206
214
215 static bool ProcessSnapshotKindOption(const char* option) { 207 static bool ProcessSnapshotKindOption(const char* option) {
216 const char* kind = ProcessOption(option, "--snapshot_kind="); 208 const char* kind = ProcessOption(option, "--snapshot_kind=");
217 if (kind == NULL) { 209 if (kind == NULL) {
218 kind = ProcessOption(option, "--snapshot-kind="); 210 kind = ProcessOption(option, "--snapshot-kind=");
219 } 211 }
220 if (kind == NULL) { 212 if (kind == NULL) {
221 return false; 213 return false;
222 } 214 }
223 if (strcmp(kind, "core-jit") == 0) { 215 if (strcmp(kind, "core-jit") == 0) {
224 snapshot_kind = kCoreJIT; 216 snapshot_kind = kCoreJIT;
(...skipping 11 matching lines...) Expand all
236 snapshot_kind = kAppAOTAssembly; 228 snapshot_kind = kAppAOTAssembly;
237 return true; 229 return true;
238 } 230 }
239 Log::PrintErr( 231 Log::PrintErr(
240 "Unrecognized snapshot kind: '%s'\nValid kinds are: " 232 "Unrecognized snapshot kind: '%s'\nValid kinds are: "
241 "core, script, app-aot-blobs, app-aot-assembly\n", 233 "core, script, app-aot-blobs, app-aot-assembly\n",
242 kind); 234 kind);
243 return false; 235 return false;
244 } 236 }
245 237
246
247 static bool ProcessVmSnapshotDataOption(const char* option) { 238 static bool ProcessVmSnapshotDataOption(const char* option) {
248 const char* name = ProcessOption(option, "--vm_snapshot_data="); 239 const char* name = ProcessOption(option, "--vm_snapshot_data=");
249 if (name == NULL) { 240 if (name == NULL) {
250 name = ProcessOption(option, "--vm-snapshot-data="); 241 name = ProcessOption(option, "--vm-snapshot-data=");
251 } 242 }
252 if (name != NULL) { 243 if (name != NULL) {
253 vm_snapshot_data_filename = name; 244 vm_snapshot_data_filename = name;
254 return true; 245 return true;
255 } 246 }
256 return false; 247 return false;
257 } 248 }
258 249
259
260 static bool ProcessVmSnapshotInstructionsOption(const char* option) { 250 static bool ProcessVmSnapshotInstructionsOption(const char* option) {
261 const char* name = ProcessOption(option, "--vm_snapshot_instructions="); 251 const char* name = ProcessOption(option, "--vm_snapshot_instructions=");
262 if (name == NULL) { 252 if (name == NULL) {
263 name = ProcessOption(option, "--vm-snapshot-instructions="); 253 name = ProcessOption(option, "--vm-snapshot-instructions=");
264 } 254 }
265 if (name != NULL) { 255 if (name != NULL) {
266 vm_snapshot_instructions_filename = name; 256 vm_snapshot_instructions_filename = name;
267 return true; 257 return true;
268 } 258 }
269 return false; 259 return false;
270 } 260 }
271 261
272
273 static bool ProcessIsolateSnapshotDataOption(const char* option) { 262 static bool ProcessIsolateSnapshotDataOption(const char* option) {
274 const char* name = ProcessOption(option, "--isolate_snapshot_data="); 263 const char* name = ProcessOption(option, "--isolate_snapshot_data=");
275 if (name == NULL) { 264 if (name == NULL) {
276 name = ProcessOption(option, "--isolate-snapshot-data="); 265 name = ProcessOption(option, "--isolate-snapshot-data=");
277 } 266 }
278 if (name != NULL) { 267 if (name != NULL) {
279 isolate_snapshot_data_filename = name; 268 isolate_snapshot_data_filename = name;
280 return true; 269 return true;
281 } 270 }
282 return false; 271 return false;
283 } 272 }
284 273
285
286 static bool ProcessIsolateSnapshotInstructionsOption(const char* option) { 274 static bool ProcessIsolateSnapshotInstructionsOption(const char* option) {
287 const char* name = ProcessOption(option, "--isolate_snapshot_instructions="); 275 const char* name = ProcessOption(option, "--isolate_snapshot_instructions=");
288 if (name == NULL) { 276 if (name == NULL) {
289 name = ProcessOption(option, "--isolate-snapshot-instructions="); 277 name = ProcessOption(option, "--isolate-snapshot-instructions=");
290 } 278 }
291 if (name != NULL) { 279 if (name != NULL) {
292 isolate_snapshot_instructions_filename = name; 280 isolate_snapshot_instructions_filename = name;
293 return true; 281 return true;
294 } 282 }
295 return false; 283 return false;
296 } 284 }
297 285
298
299 static bool ProcessAssemblyOption(const char* option) { 286 static bool ProcessAssemblyOption(const char* option) {
300 const char* name = ProcessOption(option, "--assembly="); 287 const char* name = ProcessOption(option, "--assembly=");
301 if (name != NULL) { 288 if (name != NULL) {
302 assembly_filename = name; 289 assembly_filename = name;
303 return true; 290 return true;
304 } 291 }
305 return false; 292 return false;
306 } 293 }
307 294
308
309 static bool ProcessScriptSnapshotOption(const char* option) { 295 static bool ProcessScriptSnapshotOption(const char* option) {
310 const char* name = ProcessOption(option, "--script_snapshot="); 296 const char* name = ProcessOption(option, "--script_snapshot=");
311 if (name == NULL) { 297 if (name == NULL) {
312 name = ProcessOption(option, "--script-snapshot="); 298 name = ProcessOption(option, "--script-snapshot=");
313 } 299 }
314 if (name != NULL) { 300 if (name != NULL) {
315 script_snapshot_filename = name; 301 script_snapshot_filename = name;
316 return true; 302 return true;
317 } 303 }
318 return false; 304 return false;
319 } 305 }
320 306
321
322 static bool ProcessDependenciesOption(const char* option) { 307 static bool ProcessDependenciesOption(const char* option) {
323 const char* name = ProcessOption(option, "--dependencies="); 308 const char* name = ProcessOption(option, "--dependencies=");
324 if (name != NULL) { 309 if (name != NULL) {
325 dependencies_filename = name; 310 dependencies_filename = name;
326 return true; 311 return true;
327 } 312 }
328 return false; 313 return false;
329 } 314 }
330 315
331
332 static bool ProcessDependenciesOnlyOption(const char* option) { 316 static bool ProcessDependenciesOnlyOption(const char* option) {
333 const char* name = ProcessOption(option, "--dependencies_only"); 317 const char* name = ProcessOption(option, "--dependencies_only");
334 if (name == NULL) { 318 if (name == NULL) {
335 name = ProcessOption(option, "--dependencies-only"); 319 name = ProcessOption(option, "--dependencies-only");
336 } 320 }
337 if (name != NULL) { 321 if (name != NULL) {
338 dependencies_only = true; 322 dependencies_only = true;
339 return true; 323 return true;
340 } 324 }
341 return false; 325 return false;
(...skipping 16 matching lines...) Expand all
358 if (name == NULL) { 342 if (name == NULL) {
359 name = ProcessOption(option, "--embedder-entry-points-manifest="); 343 name = ProcessOption(option, "--embedder-entry-points-manifest=");
360 } 344 }
361 if (name != NULL) { 345 if (name != NULL) {
362 entry_points_files->AddArgument(name); 346 entry_points_files->AddArgument(name);
363 return true; 347 return true;
364 } 348 }
365 return false; 349 return false;
366 } 350 }
367 351
368
369 static bool ProcessLoadCompilationTraceOption(const char* option) { 352 static bool ProcessLoadCompilationTraceOption(const char* option) {
370 const char* name = ProcessOption(option, "--load_compilation_trace="); 353 const char* name = ProcessOption(option, "--load_compilation_trace=");
371 if (name == NULL) { 354 if (name == NULL) {
372 name = ProcessOption(option, "--load-compilation-trace="); 355 name = ProcessOption(option, "--load-compilation-trace=");
373 } 356 }
374 if (name != NULL) { 357 if (name != NULL) {
375 load_compilation_trace_filename = name; 358 load_compilation_trace_filename = name;
376 return true; 359 return true;
377 } 360 }
378 return false; 361 return false;
379 } 362 }
380 363
381
382 static bool ProcessPackageRootOption(const char* option) { 364 static bool ProcessPackageRootOption(const char* option) {
383 const char* name = ProcessOption(option, "--package_root="); 365 const char* name = ProcessOption(option, "--package_root=");
384 if (name == NULL) { 366 if (name == NULL) {
385 name = ProcessOption(option, "--package-root="); 367 name = ProcessOption(option, "--package-root=");
386 } 368 }
387 if (name != NULL) { 369 if (name != NULL) {
388 commandline_package_root = name; 370 commandline_package_root = name;
389 return true; 371 return true;
390 } 372 }
391 return false; 373 return false;
392 } 374 }
393 375
394
395 static bool ProcessPackagesOption(const char* option) { 376 static bool ProcessPackagesOption(const char* option) {
396 const char* name = ProcessOption(option, "--packages="); 377 const char* name = ProcessOption(option, "--packages=");
397 if (name != NULL) { 378 if (name != NULL) {
398 commandline_packages_file = name; 379 commandline_packages_file = name;
399 return true; 380 return true;
400 } 381 }
401 return false; 382 return false;
402 } 383 }
403 384
404
405 static bool ProcessURLmappingOption(const char* option) { 385 static bool ProcessURLmappingOption(const char* option) {
406 const char* mapping = ProcessOption(option, "--url_mapping="); 386 const char* mapping = ProcessOption(option, "--url_mapping=");
407 if (mapping == NULL) { 387 if (mapping == NULL) {
408 mapping = ProcessOption(option, "--url-mapping="); 388 mapping = ProcessOption(option, "--url-mapping=");
409 } 389 }
410 if (mapping != NULL) { 390 if (mapping != NULL) {
411 DartUtils::url_mapping->AddArgument(mapping); 391 DartUtils::url_mapping->AddArgument(mapping);
412 return true; 392 return true;
413 } 393 }
414 return false; 394 return false;
415 } 395 }
416 396
417
418 static bool IsSnapshottingForPrecompilation() { 397 static bool IsSnapshottingForPrecompilation() {
419 return (snapshot_kind == kAppAOTBlobs) || (snapshot_kind == kAppAOTAssembly); 398 return (snapshot_kind == kAppAOTBlobs) || (snapshot_kind == kAppAOTAssembly);
420 } 399 }
421 400
422
423 // Parse out the command line arguments. Returns -1 if the arguments 401 // Parse out the command line arguments. Returns -1 if the arguments
424 // are incorrect, 0 otherwise. 402 // are incorrect, 0 otherwise.
425 static int ParseArguments(int argc, 403 static int ParseArguments(int argc,
426 char** argv, 404 char** argv,
427 CommandLineOptions* vm_options, 405 CommandLineOptions* vm_options,
428 char** script_name) { 406 char** script_name) {
429 const char* kPrefix = "-"; 407 const char* kPrefix = "-";
430 const intptr_t kPrefixLen = strlen(kPrefix); 408 const intptr_t kPrefixLen = strlen(kPrefix);
431 409
432 // Skip the binary name. 410 // Skip the binary name.
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 if (IsSnapshottingForPrecompilation() && (entry_points_files->count() == 0)) { 516 if (IsSnapshottingForPrecompilation() && (entry_points_files->count() == 0)) {
539 Log::PrintErr( 517 Log::PrintErr(
540 "Building an AOT snapshot requires at least one embedder " 518 "Building an AOT snapshot requires at least one embedder "
541 "entry points manifest.\n\n"); 519 "entry points manifest.\n\n");
542 return -1; 520 return -1;
543 } 521 }
544 522
545 return 0; 523 return 0;
546 } 524 }
547 525
548
549 static void WriteFile(const char* filename, 526 static void WriteFile(const char* filename,
550 const uint8_t* buffer, 527 const uint8_t* buffer,
551 const intptr_t size) { 528 const intptr_t size) {
552 File* file = File::Open(filename, File::kWriteTruncate); 529 File* file = File::Open(filename, File::kWriteTruncate);
553 if (file == NULL) { 530 if (file == NULL) {
554 Log::PrintErr("Error: Unable to write snapshot file: %s\n\n", filename); 531 Log::PrintErr("Error: Unable to write snapshot file: %s\n\n", filename);
555 Dart_ExitScope(); 532 Dart_ExitScope();
556 Dart_ShutdownIsolate(); 533 Dart_ShutdownIsolate();
557 exit(kErrorExitCode); 534 exit(kErrorExitCode);
558 } 535 }
559 if (!file->WriteFully(buffer, size)) { 536 if (!file->WriteFully(buffer, size)) {
560 Log::PrintErr("Error: Unable to write snapshot file: %s\n\n", filename); 537 Log::PrintErr("Error: Unable to write snapshot file: %s\n\n", filename);
561 Dart_ExitScope(); 538 Dart_ExitScope();
562 Dart_ShutdownIsolate(); 539 Dart_ShutdownIsolate();
563 exit(kErrorExitCode); 540 exit(kErrorExitCode);
564 } 541 }
565 file->Release(); 542 file->Release();
566 } 543 }
567 544
568
569 static void ReadFile(const char* filename, uint8_t** buffer, intptr_t* size) { 545 static void ReadFile(const char* filename, uint8_t** buffer, intptr_t* size) {
570 File* file = File::Open(filename, File::kRead); 546 File* file = File::Open(filename, File::kRead);
571 if (file == NULL) { 547 if (file == NULL) {
572 Log::PrintErr("Unable to open file %s\n", filename); 548 Log::PrintErr("Unable to open file %s\n", filename);
573 Dart_ExitScope(); 549 Dart_ExitScope();
574 Dart_ShutdownIsolate(); 550 Dart_ShutdownIsolate();
575 exit(kErrorExitCode); 551 exit(kErrorExitCode);
576 } 552 }
577 *size = file->Length(); 553 *size = file->Length();
578 *buffer = reinterpret_cast<uint8_t*>(malloc(*size)); 554 *buffer = reinterpret_cast<uint8_t*>(malloc(*size));
579 if (!file->ReadFully(*buffer, *size)) { 555 if (!file->ReadFully(*buffer, *size)) {
580 Log::PrintErr("Unable to read file %s\n", filename); 556 Log::PrintErr("Unable to read file %s\n", filename);
581 Dart_ExitScope(); 557 Dart_ExitScope();
582 Dart_ShutdownIsolate(); 558 Dart_ShutdownIsolate();
583 exit(kErrorExitCode); 559 exit(kErrorExitCode);
584 } 560 }
585 file->Release(); 561 file->Release();
586 } 562 }
587 563
588
589 class UriResolverIsolateScope { 564 class UriResolverIsolateScope {
590 public: 565 public:
591 UriResolverIsolateScope() { 566 UriResolverIsolateScope() {
592 ASSERT(isolate != NULL); 567 ASSERT(isolate != NULL);
593 snapshotted_isolate_ = Dart_CurrentIsolate(); 568 snapshotted_isolate_ = Dart_CurrentIsolate();
594 Dart_ExitIsolate(); 569 Dart_ExitIsolate();
595 Dart_EnterIsolate(isolate); 570 Dart_EnterIsolate(isolate);
596 Dart_EnterScope(); 571 Dart_EnterScope();
597 } 572 }
598 573
599 ~UriResolverIsolateScope() { 574 ~UriResolverIsolateScope() {
600 ASSERT(snapshotted_isolate_ != NULL); 575 ASSERT(snapshotted_isolate_ != NULL);
601 Dart_ExitScope(); 576 Dart_ExitScope();
602 Dart_ExitIsolate(); 577 Dart_ExitIsolate();
603 Dart_EnterIsolate(snapshotted_isolate_); 578 Dart_EnterIsolate(snapshotted_isolate_);
604 } 579 }
605 580
606 static Dart_Isolate isolate; 581 static Dart_Isolate isolate;
607 582
608 private: 583 private:
609 Dart_Isolate snapshotted_isolate_; 584 Dart_Isolate snapshotted_isolate_;
610 585
611 DISALLOW_COPY_AND_ASSIGN(UriResolverIsolateScope); 586 DISALLOW_COPY_AND_ASSIGN(UriResolverIsolateScope);
612 }; 587 };
613 588
614
615 Dart_Isolate UriResolverIsolateScope::isolate = NULL; 589 Dart_Isolate UriResolverIsolateScope::isolate = NULL;
616 590
617
618 static void AddDependency(const char* uri_string) { 591 static void AddDependency(const char* uri_string) {
619 IsolateData* isolate_data = 592 IsolateData* isolate_data =
620 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); 593 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
621 MallocGrowableArray<char*>* dependencies = isolate_data->dependencies(); 594 MallocGrowableArray<char*>* dependencies = isolate_data->dependencies();
622 if (dependencies != NULL) { 595 if (dependencies != NULL) {
623 dependencies->Add(strdup(uri_string)); 596 dependencies->Add(strdup(uri_string));
624 } 597 }
625 } 598 }
626 599
627
628 static Dart_Handle LoadUrlContents(const char* uri_string) { 600 static Dart_Handle LoadUrlContents(const char* uri_string) {
629 bool failed = false; 601 bool failed = false;
630 char* error_string = NULL; 602 char* error_string = NULL;
631 uint8_t* payload = NULL; 603 uint8_t* payload = NULL;
632 intptr_t payload_length = 0; 604 intptr_t payload_length = 0;
633 // Switch to the UriResolver Isolate and load the script. 605 // Switch to the UriResolver Isolate and load the script.
634 { 606 {
635 UriResolverIsolateScope scope; 607 UriResolverIsolateScope scope;
636 608
637 Dart_Handle resolved_uri = Dart_NewStringFromCString(uri_string); 609 Dart_Handle resolved_uri = Dart_NewStringFromCString(uri_string);
(...skipping 11 matching lines...) Expand all
649 if (!failed) { 621 if (!failed) {
650 result = Dart_NewStringFromUTF8(payload, payload_length); 622 result = Dart_NewStringFromUTF8(payload, payload_length);
651 free(payload); 623 free(payload);
652 } else { 624 } else {
653 result = Dart_NewApiError(error_string); 625 result = Dart_NewApiError(error_string);
654 free(error_string); 626 free(error_string);
655 } 627 }
656 return result; 628 return result;
657 } 629 }
658 630
659
660 static Dart_Handle ResolveUriInWorkingDirectory(const char* script_uri) { 631 static Dart_Handle ResolveUriInWorkingDirectory(const char* script_uri) {
661 bool failed = false; 632 bool failed = false;
662 char* result_string = NULL; 633 char* result_string = NULL;
663 634
664 { 635 {
665 UriResolverIsolateScope scope; 636 UriResolverIsolateScope scope;
666 637
667 // Run DartUtils::ResolveUriInWorkingDirectory in context of uri resolver 638 // Run DartUtils::ResolveUriInWorkingDirectory in context of uri resolver
668 // isolate. 639 // isolate.
669 Dart_Handle result = DartUtils::ResolveUriInWorkingDirectory( 640 Dart_Handle result = DartUtils::ResolveUriInWorkingDirectory(
670 DartUtils::NewString(script_uri)); 641 DartUtils::NewString(script_uri));
671 if (Dart_IsError(result)) { 642 if (Dart_IsError(result)) {
672 failed = true; 643 failed = true;
673 result_string = strdup(Dart_GetError(result)); 644 result_string = strdup(Dart_GetError(result));
674 } else { 645 } else {
675 result_string = strdup(DartUtils::GetStringValue(result)); 646 result_string = strdup(DartUtils::GetStringValue(result));
676 } 647 }
677 } 648 }
678 649
679 Dart_Handle result = failed ? Dart_NewApiError(result_string) 650 Dart_Handle result = failed ? Dart_NewApiError(result_string)
680 : DartUtils::NewString(result_string); 651 : DartUtils::NewString(result_string);
681 free(result_string); 652 free(result_string);
682 return result; 653 return result;
683 } 654 }
684 655
685
686 static Dart_Handle LoadSnapshotCreationScript(const char* script_name) { 656 static Dart_Handle LoadSnapshotCreationScript(const char* script_name) {
687 // First resolve the specified script uri with respect to the original 657 // First resolve the specified script uri with respect to the original
688 // working directory. 658 // working directory.
689 Dart_Handle resolved_uri = ResolveUriInWorkingDirectory(script_name); 659 Dart_Handle resolved_uri = ResolveUriInWorkingDirectory(script_name);
690 if (Dart_IsError(resolved_uri)) { 660 if (Dart_IsError(resolved_uri)) {
691 return resolved_uri; 661 return resolved_uri;
692 } 662 }
693 // Now load the contents of the specified uri. 663 // Now load the contents of the specified uri.
694 const char* resolved_uri_string = DartUtils::GetStringValue(resolved_uri); 664 const char* resolved_uri_string = DartUtils::GetStringValue(resolved_uri);
695 Dart_Handle source = LoadUrlContents(resolved_uri_string); 665 Dart_Handle source = LoadUrlContents(resolved_uri_string);
696 666
697 if (Dart_IsError(source)) { 667 if (Dart_IsError(source)) {
698 return source; 668 return source;
699 } 669 }
700 if ((snapshot_kind == kCore) || (snapshot_kind == kCoreJIT)) { 670 if ((snapshot_kind == kCore) || (snapshot_kind == kCoreJIT)) {
701 return Dart_LoadLibrary(resolved_uri, Dart_Null(), source, 0, 0); 671 return Dart_LoadLibrary(resolved_uri, Dart_Null(), source, 0, 0);
702 } else { 672 } else {
703 return Dart_LoadScript(resolved_uri, Dart_Null(), source, 0, 0); 673 return Dart_LoadScript(resolved_uri, Dart_Null(), source, 0, 0);
704 } 674 }
705 } 675 }
706 676
707
708 static Builtin::BuiltinLibraryId BuiltinId(const char* url) { 677 static Builtin::BuiltinLibraryId BuiltinId(const char* url) {
709 if (DartUtils::IsDartBuiltinLibURL(url)) { 678 if (DartUtils::IsDartBuiltinLibURL(url)) {
710 return Builtin::kBuiltinLibrary; 679 return Builtin::kBuiltinLibrary;
711 } 680 }
712 if (DartUtils::IsDartIOLibURL(url)) { 681 if (DartUtils::IsDartIOLibURL(url)) {
713 return Builtin::kIOLibrary; 682 return Builtin::kIOLibrary;
714 } 683 }
715 return Builtin::kInvalidLibrary; 684 return Builtin::kInvalidLibrary;
716 } 685 }
717 686
718
719 // Generates a depfile like gcc -M -MF. Must be consumable by Ninja. 687 // Generates a depfile like gcc -M -MF. Must be consumable by Ninja.
720 class DependenciesFileWriter : public ValueObject { 688 class DependenciesFileWriter : public ValueObject {
721 public: 689 public:
722 DependenciesFileWriter() : dependencies_(NULL), file_(NULL), success_(true) {} 690 DependenciesFileWriter() : dependencies_(NULL), file_(NULL), success_(true) {}
723 691
724 void WriteDependencies(MallocGrowableArray<char*>* dependencies) { 692 void WriteDependencies(MallocGrowableArray<char*>* dependencies) {
725 dependencies_ = dependencies; 693 dependencies_ = dependencies;
726 694
727 file_ = File::Open(dependencies_filename, File::kWriteTruncate); 695 file_ = File::Open(dependencies_filename, File::kWriteTruncate);
728 if (file_ == NULL) { 696 if (file_ == NULL) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 free(escaped_path); 777 free(escaped_path);
810 } 778 }
811 779
812 void Write(const char* string) { success_ &= file_->Print("%s", string); } 780 void Write(const char* string) { success_ &= file_->Print("%s", string); }
813 781
814 MallocGrowableArray<char*>* dependencies_; 782 MallocGrowableArray<char*>* dependencies_;
815 File* file_; 783 File* file_;
816 bool success_; 784 bool success_;
817 }; 785 };
818 786
819
820 static void CreateAndWriteDependenciesFile() { 787 static void CreateAndWriteDependenciesFile() {
821 IsolateData* isolate_data = 788 IsolateData* isolate_data =
822 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData()); 789 reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
823 MallocGrowableArray<char*>* dependencies = isolate_data->dependencies(); 790 MallocGrowableArray<char*>* dependencies = isolate_data->dependencies();
824 if (dependencies == NULL) { 791 if (dependencies == NULL) {
825 return; 792 return;
826 } 793 }
827 794
828 Loader::ResolveDependenciesAsFilePaths(); 795 Loader::ResolveDependenciesAsFilePaths();
829 796
(...skipping 24 matching lines...) Expand all
854 } 821 }
855 } 822 }
856 823
857 for (intptr_t i = 0; i < dependencies->length(); i++) { 824 for (intptr_t i = 0; i < dependencies->length(); i++) {
858 free(dependencies->At(i)); 825 free(dependencies->At(i));
859 } 826 }
860 delete dependencies; 827 delete dependencies;
861 isolate_data->set_dependencies(NULL); 828 isolate_data->set_dependencies(NULL);
862 } 829 }
863 830
864
865 static Dart_Handle CreateSnapshotLibraryTagHandler(Dart_LibraryTag tag, 831 static Dart_Handle CreateSnapshotLibraryTagHandler(Dart_LibraryTag tag,
866 Dart_Handle library, 832 Dart_Handle library,
867 Dart_Handle url) { 833 Dart_Handle url) {
868 if (!Dart_IsLibrary(library)) { 834 if (!Dart_IsLibrary(library)) {
869 return Dart_NewApiError("not a library"); 835 return Dart_NewApiError("not a library");
870 } 836 }
871 Dart_Handle library_url = Dart_LibraryUrl(library); 837 Dart_Handle library_url = Dart_LibraryUrl(library);
872 if (Dart_IsError(library_url)) { 838 if (Dart_IsError(library_url)) {
873 return Dart_NewApiError("accessing library url failed"); 839 return Dart_NewApiError("accessing library url failed");
874 } 840 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
933 return source; 899 return source;
934 } 900 }
935 if (tag == Dart_kImportTag) { 901 if (tag == Dart_kImportTag) {
936 return Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 902 return Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
937 } else { 903 } else {
938 ASSERT(tag == Dart_kSourceTag); 904 ASSERT(tag == Dart_kSourceTag);
939 return Dart_LoadSource(library, url, Dart_Null(), source, 0, 0); 905 return Dart_LoadSource(library, url, Dart_Null(), source, 0, 0);
940 } 906 }
941 } 907 }
942 908
943
944 static Dart_Handle LoadGenericSnapshotCreationScript( 909 static Dart_Handle LoadGenericSnapshotCreationScript(
945 Builtin::BuiltinLibraryId id) { 910 Builtin::BuiltinLibraryId id) {
946 Dart_Handle source = Builtin::Source(id); 911 Dart_Handle source = Builtin::Source(id);
947 if (Dart_IsError(source)) { 912 if (Dart_IsError(source)) {
948 return source; // source contains the error string. 913 return source; // source contains the error string.
949 } 914 }
950 Dart_Handle lib; 915 Dart_Handle lib;
951 // Load the builtin library to make it available in the snapshot 916 // Load the builtin library to make it available in the snapshot
952 // for importing. 917 // for importing.
953 lib = Builtin::LoadAndCheckLibrary(id); 918 lib = Builtin::LoadAndCheckLibrary(id);
954 ASSERT(!Dart_IsError(lib)); 919 ASSERT(!Dart_IsError(lib));
955 return lib; 920 return lib;
956 } 921 }
957 922
958
959 // clang-format off 923 // clang-format off
960 static void PrintUsage() { 924 static void PrintUsage() {
961 Log::PrintErr( 925 Log::PrintErr(
962 "Usage: \n" 926 "Usage: \n"
963 " gen_snapshot [<vm-flags>] [<options>] [<dart-script-file>] \n" 927 " gen_snapshot [<vm-flags>] [<options>] [<dart-script-file>] \n"
964 " \n" 928 " \n"
965 " Global options: \n" 929 " Global options: \n"
966 " --package_root=<path> Where to find packages, that is, \n" 930 " --package_root=<path> Where to find packages, that is, \n"
967 " package:... imports. \n" 931 " package:... imports. \n"
968 " \n" 932 " \n"
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1023 " manifest is a comma separated list of three elements. The first entry is \n" 987 " manifest is a comma separated list of three elements. The first entry is \n"
1024 " the library URI, the second entry is the class name and the final entry \n" 988 " the library URI, the second entry is the class name and the final entry \n"
1025 " the function name. The file must be terminated with a newline character. \n" 989 " the function name. The file must be terminated with a newline character. \n"
1026 " \n" 990 " \n"
1027 " Example: \n" 991 " Example: \n"
1028 " dart:something,SomeClass,doSomething \n" 992 " dart:something,SomeClass,doSomething \n"
1029 "\n"); 993 "\n");
1030 } 994 }
1031 // clang-format on 995 // clang-format on
1032 996
1033
1034 static const char StubNativeFunctionName[] = "StubNativeFunction"; 997 static const char StubNativeFunctionName[] = "StubNativeFunction";
1035 998
1036
1037 void StubNativeFunction(Dart_NativeArguments arguments) { 999 void StubNativeFunction(Dart_NativeArguments arguments) {
1038 // This is a stub function for the resolver 1000 // This is a stub function for the resolver
1039 Dart_SetReturnValue( 1001 Dart_SetReturnValue(
1040 arguments, Dart_NewApiError("<EMBEDDER DID NOT SETUP NATIVE RESOLVER>")); 1002 arguments, Dart_NewApiError("<EMBEDDER DID NOT SETUP NATIVE RESOLVER>"));
1041 } 1003 }
1042 1004
1043
1044 static Dart_NativeFunction StubNativeLookup(Dart_Handle name, 1005 static Dart_NativeFunction StubNativeLookup(Dart_Handle name,
1045 int argument_count, 1006 int argument_count,
1046 bool* auto_setup_scope) { 1007 bool* auto_setup_scope) {
1047 return &StubNativeFunction; 1008 return &StubNativeFunction;
1048 } 1009 }
1049 1010
1050
1051 static const uint8_t* StubNativeSymbol(Dart_NativeFunction nf) { 1011 static const uint8_t* StubNativeSymbol(Dart_NativeFunction nf) {
1052 return reinterpret_cast<const uint8_t*>(StubNativeFunctionName); 1012 return reinterpret_cast<const uint8_t*>(StubNativeFunctionName);
1053 } 1013 }
1054 1014
1055
1056 static void SetupStubNativeResolver(size_t lib_index, 1015 static void SetupStubNativeResolver(size_t lib_index,
1057 const Dart_QualifiedFunctionName* entry) { 1016 const Dart_QualifiedFunctionName* entry) {
1058 // TODO(24686): Remove this. 1017 // TODO(24686): Remove this.
1059 Dart_Handle library_string = Dart_NewStringFromCString(entry->library_uri); 1018 Dart_Handle library_string = Dart_NewStringFromCString(entry->library_uri);
1060 DART_CHECK_VALID(library_string); 1019 DART_CHECK_VALID(library_string);
1061 Dart_Handle library = Dart_LookupLibrary(library_string); 1020 Dart_Handle library = Dart_LookupLibrary(library_string);
1062 // Embedder entry points may be setup in libraries that have not been 1021 // Embedder entry points may be setup in libraries that have not been
1063 // explicitly loaded by the application script. In such cases, library lookup 1022 // explicitly loaded by the application script. In such cases, library lookup
1064 // will fail. Manually load those libraries. 1023 // will fail. Manually load those libraries.
1065 if (Dart_IsError(library)) { 1024 if (Dart_IsError(library)) {
(...skipping 14 matching lines...) Expand all
1080 // Do a fresh lookup 1039 // Do a fresh lookup
1081 library = Dart_LookupLibrary(library_string); 1040 library = Dart_LookupLibrary(library_string);
1082 } 1041 }
1083 1042
1084 DART_CHECK_VALID(library); 1043 DART_CHECK_VALID(library);
1085 Dart_Handle result = 1044 Dart_Handle result =
1086 Dart_SetNativeResolver(library, &StubNativeLookup, &StubNativeSymbol); 1045 Dart_SetNativeResolver(library, &StubNativeLookup, &StubNativeSymbol);
1087 DART_CHECK_VALID(result); 1046 DART_CHECK_VALID(result);
1088 } 1047 }
1089 1048
1090
1091 // Iterate over all libraries and setup the stub native lookup. This must be 1049 // Iterate over all libraries and setup the stub native lookup. This must be
1092 // run after |SetupStubNativeResolversForPrecompilation| because the former 1050 // run after |SetupStubNativeResolversForPrecompilation| because the former
1093 // loads some libraries. 1051 // loads some libraries.
1094 static void SetupStubNativeResolvers() { 1052 static void SetupStubNativeResolvers() {
1095 Dart_Handle libraries = Dart_GetLoadedLibraries(); 1053 Dart_Handle libraries = Dart_GetLoadedLibraries();
1096 intptr_t libraries_length; 1054 intptr_t libraries_length;
1097 Dart_ListLength(libraries, &libraries_length); 1055 Dart_ListLength(libraries, &libraries_length);
1098 for (intptr_t i = 0; i < libraries_length; i++) { 1056 for (intptr_t i = 0; i < libraries_length; i++) {
1099 Dart_Handle library = Dart_ListGetAt(libraries, i); 1057 Dart_Handle library = Dart_ListGetAt(libraries, i);
1100 DART_CHECK_VALID(library); 1058 DART_CHECK_VALID(library);
1101 Dart_NativeEntryResolver old_resolver = NULL; 1059 Dart_NativeEntryResolver old_resolver = NULL;
1102 Dart_GetNativeResolver(library, &old_resolver); 1060 Dart_GetNativeResolver(library, &old_resolver);
1103 if (old_resolver == NULL) { 1061 if (old_resolver == NULL) {
1104 Dart_Handle result = 1062 Dart_Handle result =
1105 Dart_SetNativeResolver(library, &StubNativeLookup, &StubNativeSymbol); 1063 Dart_SetNativeResolver(library, &StubNativeLookup, &StubNativeSymbol);
1106 DART_CHECK_VALID(result); 1064 DART_CHECK_VALID(result);
1107 } 1065 }
1108 } 1066 }
1109 } 1067 }
1110 1068
1111
1112 static void ImportNativeEntryPointLibrariesIntoRoot( 1069 static void ImportNativeEntryPointLibrariesIntoRoot(
1113 const Dart_QualifiedFunctionName* entries) { 1070 const Dart_QualifiedFunctionName* entries) {
1114 if (entries == NULL) { 1071 if (entries == NULL) {
1115 return; 1072 return;
1116 } 1073 }
1117 1074
1118 size_t index = 0; 1075 size_t index = 0;
1119 while (true) { 1076 while (true) {
1120 Dart_QualifiedFunctionName entry = entries[index++]; 1077 Dart_QualifiedFunctionName entry = entries[index++];
1121 if (entry.library_uri == NULL) { 1078 if (entry.library_uri == NULL) {
1122 // The termination sentinel has null members. 1079 // The termination sentinel has null members.
1123 break; 1080 break;
1124 } 1081 }
1125 Dart_Handle entry_library = 1082 Dart_Handle entry_library =
1126 Dart_LookupLibrary(Dart_NewStringFromCString(entry.library_uri)); 1083 Dart_LookupLibrary(Dart_NewStringFromCString(entry.library_uri));
1127 DART_CHECK_VALID(entry_library); 1084 DART_CHECK_VALID(entry_library);
1128 Dart_Handle import_result = Dart_LibraryImportLibrary( 1085 Dart_Handle import_result = Dart_LibraryImportLibrary(
1129 entry_library, Dart_RootLibrary(), Dart_EmptyString()); 1086 entry_library, Dart_RootLibrary(), Dart_EmptyString());
1130 DART_CHECK_VALID(import_result); 1087 DART_CHECK_VALID(import_result);
1131 } 1088 }
1132 } 1089 }
1133 1090
1134
1135 static void SetupStubNativeResolversForPrecompilation( 1091 static void SetupStubNativeResolversForPrecompilation(
1136 const Dart_QualifiedFunctionName* entries) { 1092 const Dart_QualifiedFunctionName* entries) {
1137 if (entries == NULL) { 1093 if (entries == NULL) {
1138 return; 1094 return;
1139 } 1095 }
1140 1096
1141 // Setup native resolvers for all libraries found in the manifest. 1097 // Setup native resolvers for all libraries found in the manifest.
1142 size_t index = 0; 1098 size_t index = 0;
1143 while (true) { 1099 while (true) {
1144 Dart_QualifiedFunctionName entry = entries[index++]; 1100 Dart_QualifiedFunctionName entry = entries[index++];
1145 if (entry.library_uri == NULL) { 1101 if (entry.library_uri == NULL) {
1146 // The termination sentinel has null members. 1102 // The termination sentinel has null members.
1147 break; 1103 break;
1148 } 1104 }
1149 // Setup stub resolvers on loaded libraries 1105 // Setup stub resolvers on loaded libraries
1150 SetupStubNativeResolver(index, &entry); 1106 SetupStubNativeResolver(index, &entry);
1151 } 1107 }
1152 } 1108 }
1153 1109
1154
1155 static void CleanupEntryPointItem(const Dart_QualifiedFunctionName* entry) { 1110 static void CleanupEntryPointItem(const Dart_QualifiedFunctionName* entry) {
1156 if (entry == NULL) { 1111 if (entry == NULL) {
1157 return; 1112 return;
1158 } 1113 }
1159 // The allocation used for these entries is zero'ed. So even in error cases, 1114 // The allocation used for these entries is zero'ed. So even in error cases,
1160 // references to some entries will be null. Calling this on an already cleaned 1115 // references to some entries will be null. Calling this on an already cleaned
1161 // up entry is programmer error. 1116 // up entry is programmer error.
1162 free(const_cast<char*>(entry->library_uri)); 1117 free(const_cast<char*>(entry->library_uri));
1163 free(const_cast<char*>(entry->class_name)); 1118 free(const_cast<char*>(entry->class_name));
1164 free(const_cast<char*>(entry->function_name)); 1119 free(const_cast<char*>(entry->function_name));
1165 } 1120 }
1166 1121
1167
1168 static void CleanupEntryPointsCollection(Dart_QualifiedFunctionName* entries) { 1122 static void CleanupEntryPointsCollection(Dart_QualifiedFunctionName* entries) {
1169 if (entries == NULL) { 1123 if (entries == NULL) {
1170 return; 1124 return;
1171 } 1125 }
1172 1126
1173 size_t index = 0; 1127 size_t index = 0;
1174 while (true) { 1128 while (true) {
1175 Dart_QualifiedFunctionName entry = entries[index++]; 1129 Dart_QualifiedFunctionName entry = entries[index++];
1176 if (entry.library_uri == NULL) { 1130 if (entry.library_uri == NULL) {
1177 break; 1131 break;
1178 } 1132 }
1179 CleanupEntryPointItem(&entry); 1133 CleanupEntryPointItem(&entry);
1180 } 1134 }
1181 free(entries); 1135 free(entries);
1182 } 1136 }
1183 1137
1184
1185 char* ParserErrorStringCreate(const char* format, ...) { 1138 char* ParserErrorStringCreate(const char* format, ...) {
1186 static const size_t kErrorBufferSize = 256; 1139 static const size_t kErrorBufferSize = 256;
1187 1140
1188 char* error_buffer = 1141 char* error_buffer =
1189 reinterpret_cast<char*>(calloc(kErrorBufferSize, sizeof(char))); 1142 reinterpret_cast<char*>(calloc(kErrorBufferSize, sizeof(char)));
1190 va_list args; 1143 va_list args;
1191 va_start(args, format); 1144 va_start(args, format);
1192 vsnprintf(error_buffer, kErrorBufferSize, format, args); 1145 vsnprintf(error_buffer, kErrorBufferSize, format, args);
1193 va_end(args); 1146 va_end(args);
1194 1147
1195 // In case of error, the buffer is released by the caller 1148 // In case of error, the buffer is released by the caller
1196 return error_buffer; 1149 return error_buffer;
1197 } 1150 }
1198 1151
1199
1200 const char* ParseEntryNameForIndex(uint8_t index) { 1152 const char* ParseEntryNameForIndex(uint8_t index) {
1201 switch (index) { 1153 switch (index) {
1202 case 0: 1154 case 0:
1203 return "Library"; 1155 return "Library";
1204 case 1: 1156 case 1:
1205 return "Class"; 1157 return "Class";
1206 case 2: 1158 case 2:
1207 return "Function"; 1159 return "Function";
1208 default: 1160 default:
1209 return "Unknown"; 1161 return "Unknown";
1210 } 1162 }
1211 return NULL; 1163 return NULL;
1212 } 1164 }
1213 1165
1214
1215 static bool ParseEntryPointsManifestSingleLine( 1166 static bool ParseEntryPointsManifestSingleLine(
1216 const char* line, 1167 const char* line,
1217 Dart_QualifiedFunctionName* entry, 1168 Dart_QualifiedFunctionName* entry,
1218 char** error) { 1169 char** error) {
1219 bool success = true; 1170 bool success = true;
1220 size_t offset = 0; 1171 size_t offset = 0;
1221 for (uint8_t i = 0; i < 3; i++) { 1172 for (uint8_t i = 0; i < 3; i++) {
1222 const char* component = strchr(line + offset, i == 2 ? '\n' : ','); 1173 const char* component = strchr(line + offset, i == 2 ? '\n' : ',');
1223 if (component == NULL) { 1174 if (component == NULL) {
1224 success = false; 1175 success = false;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1260 *error = ParserErrorStringCreate("Internal parser error\n"); 1211 *error = ParserErrorStringCreate("Internal parser error\n");
1261 break; 1212 break;
1262 } 1213 }
1263 } 1214 }
1264 1215
1265 offset += chars_read + 1; 1216 offset += chars_read + 1;
1266 } 1217 }
1267 return success; 1218 return success;
1268 } 1219 }
1269 1220
1270
1271 int64_t ParseEntryPointsManifestLines(FILE* file, 1221 int64_t ParseEntryPointsManifestLines(FILE* file,
1272 Dart_QualifiedFunctionName* collection) { 1222 Dart_QualifiedFunctionName* collection) {
1273 int64_t entries = 0; 1223 int64_t entries = 0;
1274 1224
1275 static const int kManifestMaxLineLength = 1024; 1225 static const int kManifestMaxLineLength = 1024;
1276 char* line = reinterpret_cast<char*>(malloc(kManifestMaxLineLength)); 1226 char* line = reinterpret_cast<char*>(malloc(kManifestMaxLineLength));
1277 size_t line_number = 0; 1227 size_t line_number = 0;
1278 while (true) { 1228 while (true) {
1279 line_number++; 1229 line_number++;
1280 char* read_line = fgets(line, kManifestMaxLineLength, file); 1230 char* read_line = fgets(line, kManifestMaxLineLength, file);
(...skipping 23 matching lines...) Expand all
1304 } 1254 }
1305 1255
1306 entries++; 1256 entries++;
1307 } 1257 }
1308 1258
1309 free(line); 1259 free(line);
1310 1260
1311 return entries; 1261 return entries;
1312 } 1262 }
1313 1263
1314
1315 static Dart_QualifiedFunctionName* ParseEntryPointsManifestFiles() { 1264 static Dart_QualifiedFunctionName* ParseEntryPointsManifestFiles() {
1316 // Total number of entries across all manifest files. 1265 // Total number of entries across all manifest files.
1317 int64_t entry_count = 0; 1266 int64_t entry_count = 0;
1318 1267
1319 // Parse the files once but don't store the results. This is done to first 1268 // Parse the files once but don't store the results. This is done to first
1320 // determine the number of entries in the manifest 1269 // determine the number of entries in the manifest
1321 for (intptr_t i = 0; i < entry_points_files->count(); i++) { 1270 for (intptr_t i = 0; i < entry_points_files->count(); i++) {
1322 const char* path = entry_points_files->GetArgument(i); 1271 const char* path = entry_points_files->GetArgument(i);
1323 1272
1324 FILE* file = fopen(path, "r"); 1273 FILE* file = fopen(path, "r");
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1356 fclose(file); 1305 fclose(file);
1357 } 1306 }
1358 1307
1359 ASSERT(parsed_entry_count == entry_count); 1308 ASSERT(parsed_entry_count == entry_count);
1360 1309
1361 // The entries allocation must be explicitly cleaned up via 1310 // The entries allocation must be explicitly cleaned up via
1362 // |CleanupEntryPointsCollection| 1311 // |CleanupEntryPointsCollection|
1363 return entries; 1312 return entries;
1364 } 1313 }
1365 1314
1366
1367 static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() { 1315 static Dart_QualifiedFunctionName* ParseEntryPointsManifestIfPresent() {
1368 Dart_QualifiedFunctionName* entries = ParseEntryPointsManifestFiles(); 1316 Dart_QualifiedFunctionName* entries = ParseEntryPointsManifestFiles();
1369 if ((entries == NULL) && IsSnapshottingForPrecompilation()) { 1317 if ((entries == NULL) && IsSnapshottingForPrecompilation()) {
1370 Log::PrintErr( 1318 Log::PrintErr(
1371 "Could not find native embedder entry points during precompilation\n"); 1319 "Could not find native embedder entry points during precompilation\n");
1372 exit(kErrorExitCode); 1320 exit(kErrorExitCode);
1373 } 1321 }
1374 return entries; 1322 return entries;
1375 } 1323 }
1376 1324
1377
1378 static void LoadCompilationTrace() { 1325 static void LoadCompilationTrace() {
1379 if ((load_compilation_trace_filename != NULL) && 1326 if ((load_compilation_trace_filename != NULL) &&
1380 (snapshot_kind == kCoreJIT)) { 1327 (snapshot_kind == kCoreJIT)) {
1381 uint8_t* buffer = NULL; 1328 uint8_t* buffer = NULL;
1382 intptr_t size = 0; 1329 intptr_t size = 0;
1383 ReadFile(load_compilation_trace_filename, &buffer, &size); 1330 ReadFile(load_compilation_trace_filename, &buffer, &size);
1384 Dart_Handle result = Dart_LoadCompilationTrace(buffer, size); 1331 Dart_Handle result = Dart_LoadCompilationTrace(buffer, size);
1385 CHECK_RESULT(result); 1332 CHECK_RESULT(result);
1386 } 1333 }
1387 } 1334 }
1388 1335
1389
1390 static void CreateAndWriteCoreSnapshot() { 1336 static void CreateAndWriteCoreSnapshot() {
1391 ASSERT(snapshot_kind == kCore); 1337 ASSERT(snapshot_kind == kCore);
1392 ASSERT(vm_snapshot_data_filename != NULL); 1338 ASSERT(vm_snapshot_data_filename != NULL);
1393 ASSERT(isolate_snapshot_data_filename != NULL); 1339 ASSERT(isolate_snapshot_data_filename != NULL);
1394 1340
1395 Dart_Handle result; 1341 Dart_Handle result;
1396 uint8_t* vm_snapshot_data_buffer = NULL; 1342 uint8_t* vm_snapshot_data_buffer = NULL;
1397 intptr_t vm_snapshot_data_size = 0; 1343 intptr_t vm_snapshot_data_size = 0;
1398 uint8_t* isolate_snapshot_data_buffer = NULL; 1344 uint8_t* isolate_snapshot_data_buffer = NULL;
1399 intptr_t isolate_snapshot_data_size = 0; 1345 intptr_t isolate_snapshot_data_size = 0;
(...skipping 11 matching lines...) Expand all
1411 if (vm_snapshot_instructions_filename != NULL) { 1357 if (vm_snapshot_instructions_filename != NULL) {
1412 WriteFile(vm_snapshot_instructions_filename, NULL, 0); 1358 WriteFile(vm_snapshot_instructions_filename, NULL, 0);
1413 } 1359 }
1414 WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer, 1360 WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer,
1415 isolate_snapshot_data_size); 1361 isolate_snapshot_data_size);
1416 if (isolate_snapshot_instructions_filename != NULL) { 1362 if (isolate_snapshot_instructions_filename != NULL) {
1417 WriteFile(isolate_snapshot_instructions_filename, NULL, 0); 1363 WriteFile(isolate_snapshot_instructions_filename, NULL, 0);
1418 } 1364 }
1419 } 1365 }
1420 1366
1421
1422 static void CreateAndWriteCoreJITSnapshot() { 1367 static void CreateAndWriteCoreJITSnapshot() {
1423 ASSERT(snapshot_kind == kCoreJIT); 1368 ASSERT(snapshot_kind == kCoreJIT);
1424 ASSERT(vm_snapshot_data_filename != NULL); 1369 ASSERT(vm_snapshot_data_filename != NULL);
1425 ASSERT(vm_snapshot_instructions_filename != NULL); 1370 ASSERT(vm_snapshot_instructions_filename != NULL);
1426 ASSERT(isolate_snapshot_data_filename != NULL); 1371 ASSERT(isolate_snapshot_data_filename != NULL);
1427 ASSERT(isolate_snapshot_instructions_filename != NULL); 1372 ASSERT(isolate_snapshot_instructions_filename != NULL);
1428 1373
1429 Dart_Handle result; 1374 Dart_Handle result;
1430 uint8_t* vm_snapshot_data_buffer = NULL; 1375 uint8_t* vm_snapshot_data_buffer = NULL;
1431 intptr_t vm_snapshot_data_size = 0; 1376 intptr_t vm_snapshot_data_size = 0;
(...skipping 19 matching lines...) Expand all
1451 vm_snapshot_data_size); 1396 vm_snapshot_data_size);
1452 WriteFile(vm_snapshot_instructions_filename, vm_snapshot_instructions_buffer, 1397 WriteFile(vm_snapshot_instructions_filename, vm_snapshot_instructions_buffer,
1453 vm_snapshot_instructions_size); 1398 vm_snapshot_instructions_size);
1454 WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer, 1399 WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer,
1455 isolate_snapshot_data_size); 1400 isolate_snapshot_data_size);
1456 WriteFile(isolate_snapshot_instructions_filename, 1401 WriteFile(isolate_snapshot_instructions_filename,
1457 isolate_snapshot_instructions_buffer, 1402 isolate_snapshot_instructions_buffer,
1458 isolate_snapshot_instructions_size); 1403 isolate_snapshot_instructions_size);
1459 } 1404 }
1460 1405
1461
1462 static void CreateAndWriteScriptSnapshot() { 1406 static void CreateAndWriteScriptSnapshot() {
1463 ASSERT(snapshot_kind == kScript); 1407 ASSERT(snapshot_kind == kScript);
1464 ASSERT(script_snapshot_filename != NULL); 1408 ASSERT(script_snapshot_filename != NULL);
1465 1409
1466 // First create a snapshot. 1410 // First create a snapshot.
1467 uint8_t* buffer = NULL; 1411 uint8_t* buffer = NULL;
1468 intptr_t size = 0; 1412 intptr_t size = 0;
1469 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size); 1413 Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size);
1470 CHECK_RESULT(result); 1414 CHECK_RESULT(result);
1471 1415
1472 // Now write it out to the specified file. 1416 // Now write it out to the specified file.
1473 WriteFile(script_snapshot_filename, buffer, size); 1417 WriteFile(script_snapshot_filename, buffer, size);
1474 } 1418 }
1475 1419
1476
1477 static void CreateAndWritePrecompiledSnapshot( 1420 static void CreateAndWritePrecompiledSnapshot(
1478 Dart_QualifiedFunctionName* standalone_entry_points) { 1421 Dart_QualifiedFunctionName* standalone_entry_points) {
1479 ASSERT(IsSnapshottingForPrecompilation()); 1422 ASSERT(IsSnapshottingForPrecompilation());
1480 Dart_Handle result; 1423 Dart_Handle result;
1481 1424
1482 // Precompile with specified embedder entry points 1425 // Precompile with specified embedder entry points
1483 result = Dart_Precompile(standalone_entry_points, NULL, 0); 1426 result = Dart_Precompile(standalone_entry_points, NULL, 0);
1484 CHECK_RESULT(result); 1427 CHECK_RESULT(result);
1485 1428
1486 // Create a precompiled snapshot. 1429 // Create a precompiled snapshot.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1519 WriteFile(vm_snapshot_instructions_filename, 1462 WriteFile(vm_snapshot_instructions_filename,
1520 vm_snapshot_instructions_buffer, vm_snapshot_instructions_size); 1463 vm_snapshot_instructions_buffer, vm_snapshot_instructions_size);
1521 WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer, 1464 WriteFile(isolate_snapshot_data_filename, isolate_snapshot_data_buffer,
1522 isolate_snapshot_data_size); 1465 isolate_snapshot_data_size);
1523 WriteFile(isolate_snapshot_instructions_filename, 1466 WriteFile(isolate_snapshot_instructions_filename,
1524 isolate_snapshot_instructions_buffer, 1467 isolate_snapshot_instructions_buffer,
1525 isolate_snapshot_instructions_size); 1468 isolate_snapshot_instructions_size);
1526 } 1469 }
1527 } 1470 }
1528 1471
1529
1530 static void SetupForUriResolution() { 1472 static void SetupForUriResolution() {
1531 // Set up the library tag handler for this isolate. 1473 // Set up the library tag handler for this isolate.
1532 Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler); 1474 Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler);
1533 if (Dart_IsError(result)) { 1475 if (Dart_IsError(result)) {
1534 Log::PrintErr("%s\n", Dart_GetError(result)); 1476 Log::PrintErr("%s\n", Dart_GetError(result));
1535 Dart_ExitScope(); 1477 Dart_ExitScope();
1536 Dart_ShutdownIsolate(); 1478 Dart_ShutdownIsolate();
1537 exit(kErrorExitCode); 1479 exit(kErrorExitCode);
1538 } 1480 }
1539 // This is a generic dart snapshot which needs builtin library setup. 1481 // This is a generic dart snapshot which needs builtin library setup.
1540 Dart_Handle library = 1482 Dart_Handle library =
1541 LoadGenericSnapshotCreationScript(Builtin::kBuiltinLibrary); 1483 LoadGenericSnapshotCreationScript(Builtin::kBuiltinLibrary);
1542 CHECK_RESULT(library); 1484 CHECK_RESULT(library);
1543 } 1485 }
1544 1486
1545
1546 static void SetupForGenericSnapshotCreation() { 1487 static void SetupForGenericSnapshotCreation() {
1547 SetupForUriResolution(); 1488 SetupForUriResolution();
1548 1489
1549 Dart_Handle library = LoadGenericSnapshotCreationScript(Builtin::kIOLibrary); 1490 Dart_Handle library = LoadGenericSnapshotCreationScript(Builtin::kIOLibrary);
1550 CHECK_RESULT(library); 1491 CHECK_RESULT(library);
1551 Dart_Handle result = Dart_FinalizeLoading(false); 1492 Dart_Handle result = Dart_FinalizeLoading(false);
1552 if (Dart_IsError(result)) { 1493 if (Dart_IsError(result)) {
1553 const char* err_msg = Dart_GetError(library); 1494 const char* err_msg = Dart_GetError(library);
1554 Log::PrintErr("Errors encountered while loading: %s\n", err_msg); 1495 Log::PrintErr("Errors encountered while loading: %s\n", err_msg);
1555 Dart_ExitScope(); 1496 Dart_ExitScope();
1556 Dart_ShutdownIsolate(); 1497 Dart_ShutdownIsolate();
1557 exit(kErrorExitCode); 1498 exit(kErrorExitCode);
1558 } 1499 }
1559 } 1500 }
1560 1501
1561
1562 static Dart_Isolate CreateServiceIsolate(const char* script_uri, 1502 static Dart_Isolate CreateServiceIsolate(const char* script_uri,
1563 const char* main, 1503 const char* main,
1564 const char* package_root, 1504 const char* package_root,
1565 const char* package_config, 1505 const char* package_config,
1566 Dart_IsolateFlags* flags, 1506 Dart_IsolateFlags* flags,
1567 void* data, 1507 void* data,
1568 char** error) { 1508 char** error) {
1569 IsolateData* isolate_data = 1509 IsolateData* isolate_data =
1570 new IsolateData(script_uri, package_root, package_config, NULL); 1510 new IsolateData(script_uri, package_root, package_config, NULL);
1571 Dart_Isolate isolate = NULL; 1511 Dart_Isolate isolate = NULL;
(...skipping 26 matching lines...) Expand all
1598 false /* server dev mode */, 1538 false /* server dev mode */,
1599 false /* trace_loading */)) { 1539 false /* trace_loading */)) {
1600 *error = strdup(VmService::GetErrorMessage()); 1540 *error = strdup(VmService::GetErrorMessage());
1601 return NULL; 1541 return NULL;
1602 } 1542 }
1603 Dart_ExitScope(); 1543 Dart_ExitScope();
1604 Dart_ExitIsolate(); 1544 Dart_ExitIsolate();
1605 return isolate; 1545 return isolate;
1606 } 1546 }
1607 1547
1608
1609 static MappedMemory* MapFile(const char* filename, 1548 static MappedMemory* MapFile(const char* filename,
1610 File::MapType type, 1549 File::MapType type,
1611 const uint8_t** buffer) { 1550 const uint8_t** buffer) {
1612 File* file = File::Open(filename, File::kRead); 1551 File* file = File::Open(filename, File::kRead);
1613 if (file == NULL) { 1552 if (file == NULL) {
1614 Log::PrintErr("Failed to open: %s\n", filename); 1553 Log::PrintErr("Failed to open: %s\n", filename);
1615 exit(kErrorExitCode); 1554 exit(kErrorExitCode);
1616 } 1555 }
1617 intptr_t length = file->Length(); 1556 intptr_t length = file->Length();
1618 if (length == 0) { 1557 if (length == 0) {
1619 // Can't map an empty file. 1558 // Can't map an empty file.
1620 *buffer = NULL; 1559 *buffer = NULL;
1621 return NULL; 1560 return NULL;
1622 } 1561 }
1623 MappedMemory* mapping = file->Map(type, 0, length); 1562 MappedMemory* mapping = file->Map(type, 0, length);
1624 if (mapping == NULL) { 1563 if (mapping == NULL) {
1625 Log::PrintErr("Failed to read: %s\n", filename); 1564 Log::PrintErr("Failed to read: %s\n", filename);
1626 exit(kErrorExitCode); 1565 exit(kErrorExitCode);
1627 } 1566 }
1628 file->Release(); 1567 file->Release();
1629 *buffer = reinterpret_cast<const uint8_t*>(mapping->address()); 1568 *buffer = reinterpret_cast<const uint8_t*>(mapping->address());
1630 return mapping; 1569 return mapping;
1631 } 1570 }
1632 1571
1633
1634 int main(int argc, char** argv) { 1572 int main(int argc, char** argv) {
1635 const int EXTRA_VM_ARGUMENTS = 2; 1573 const int EXTRA_VM_ARGUMENTS = 2;
1636 CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS); 1574 CommandLineOptions vm_options(argc + EXTRA_VM_ARGUMENTS);
1637 1575
1638 // Initialize the URL mapping array. 1576 // Initialize the URL mapping array.
1639 CommandLineOptions cmdline_url_mapping(argc); 1577 CommandLineOptions cmdline_url_mapping(argc);
1640 DartUtils::url_mapping = &cmdline_url_mapping; 1578 DartUtils::url_mapping = &cmdline_url_mapping;
1641 1579
1642 // Initialize the entrypoints array. 1580 // Initialize the entrypoints array.
1643 CommandLineOptions entry_points_files_array(argc); 1581 CommandLineOptions entry_points_files_array(argc);
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
1897 delete mapped_isolate_snapshot_instructions; 1835 delete mapped_isolate_snapshot_instructions;
1898 return 0; 1836 return 0;
1899 } 1837 }
1900 1838
1901 } // namespace bin 1839 } // namespace bin
1902 } // namespace dart 1840 } // namespace dart
1903 1841
1904 int main(int argc, char** argv) { 1842 int main(int argc, char** argv) {
1905 return dart::bin::main(argc, argv); 1843 return dart::bin::main(argc, argv);
1906 } 1844 }
OLDNEW
« no previous file with comments | « runtime/bin/filter_unsupported.cc ('k') | runtime/bin/hashmap_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698