| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| 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. |
| 4 |
| 5 #include "bin/dartutils.h" |
| 6 #include "vm/kernel.h" |
| 7 #include "vm/timer.h" |
| 8 |
| 9 namespace dart { |
| 10 namespace bin { |
| 11 |
| 12 class BufferedFileWriter : public dart::ByteWriter { |
| 13 public: |
| 14 explicit BufferedFileWriter(char* filename) { |
| 15 this->filename_ = filename; |
| 16 buffer_size_ = 1048576; |
| 17 buffer_ = new uint8_t[buffer_size_]; |
| 18 used_ = 0; |
| 19 } |
| 20 |
| 21 ~BufferedFileWriter() { |
| 22 void* out_file = DartUtils::OpenFile(filename_, true); |
| 23 if (out_file != NULL) { |
| 24 DartUtils::WriteFile(buffer_, used_, out_file); |
| 25 } |
| 26 delete buffer_; |
| 27 } |
| 28 |
| 29 void WriteByte(uint8_t byte) { |
| 30 EnsureSpaceFor(1); |
| 31 buffer_[used_++] = byte; |
| 32 } |
| 33 |
| 34 void WriteBytes(uint8_t* buffer, int count) { |
| 35 EnsureSpaceFor(count); |
| 36 for (int i = 0; i < count; ++i) { |
| 37 this->buffer_[used_++] = buffer[i]; |
| 38 } |
| 39 } |
| 40 |
| 41 private: |
| 42 void EnsureSpaceFor(int bytes) { |
| 43 int needed = used_ + bytes; |
| 44 if (needed < buffer_size_) return; |
| 45 while (buffer_size_ < needed) { |
| 46 buffer_size_ *= 2; |
| 47 } |
| 48 uint8_t* tmp = new uint8_t[buffer_size_]; |
| 49 for (int i = 0; i < used_; ++i) { |
| 50 tmp[i] = buffer_[i]; |
| 51 } |
| 52 delete buffer_; |
| 53 buffer_ = tmp; |
| 54 } |
| 55 |
| 56 char* filename_; |
| 57 uint8_t* buffer_; |
| 58 int buffer_size_; |
| 59 int used_; |
| 60 }; |
| 61 |
| 62 extern const uint8_t* vm_isolate_snapshot_buffer; |
| 63 |
| 64 static Dart_Isolate CreateIsolateAndSetup(const char* script_uri, |
| 65 const char* main, |
| 66 const char* package_root, |
| 67 const char* package_config, |
| 68 Dart_IsolateFlags* flags, |
| 69 void* data, |
| 70 char** error) { |
| 71 return NULL; |
| 72 } |
| 73 |
| 74 int main(int argc, char** argv) { |
| 75 Dart_SetVMFlags(0, NULL); |
| 76 Dart_InitializeParams init_params; |
| 77 memset(&init_params, 0, sizeof(init_params)); |
| 78 init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION; |
| 79 init_params.vm_isolate_snapshot = vm_isolate_snapshot_buffer; |
| 80 init_params.create = CreateIsolateAndSetup; |
| 81 char* error = Dart_Initialize(&init_params); |
| 82 if (error != NULL) { |
| 83 printf("VM initialization failed: %s\n", error); |
| 84 return 2; |
| 85 } |
| 86 |
| 87 if (argc != 3) { |
| 88 printf("Usage: %s <input.dill> <output.dill>\n", argv[0]); |
| 89 return 1; |
| 90 } |
| 91 |
| 92 char* filename = argv[1]; |
| 93 char* out_filename = argv[2]; |
| 94 |
| 95 dart::kernel::Program* kernel = NULL; |
| 96 dart::Timer reader_timer(true, ""); |
| 97 { |
| 98 dart::TimerScope ts(true, &reader_timer); |
| 99 const uint8_t* kernel_file = NULL; |
| 100 intptr_t kernel_length = -1; |
| 101 const bool is_kernel = |
| 102 TryReadKernel(filename, &kernel_file, &kernel_length); |
| 103 |
| 104 if (is_kernel) { |
| 105 kernel = reinterpret_cast<dart::kernel::Program*>( |
| 106 Dart_ReadKernelBinary(kernel_file, kernel_length)); |
| 107 free(const_cast<uint8_t*>(kernel_file)); |
| 108 } |
| 109 if (kernel == NULL) { |
| 110 FATAL("Failed to read input file."); |
| 111 } |
| 112 } |
| 113 |
| 114 dart::Timer writer_time(true, ""); |
| 115 { |
| 116 dart::TimerScope ts(true, &writer_time); |
| 117 { |
| 118 BufferedFileWriter writer(out_filename); |
| 119 dart::WritePrecompiledKernel(&writer, kernel); |
| 120 } |
| 121 } |
| 122 |
| 123 dart::Timer delete_timer(true, ""); |
| 124 { |
| 125 dart::TimerScope ts(true, &delete_timer); |
| 126 delete kernel; |
| 127 } |
| 128 |
| 129 printf("Took %4.2lf ms to read\n", reader_timer.TotalElapsedTime() / 1000.0); |
| 130 printf("Took %4.2lf ms to write\n", writer_time.TotalElapsedTime() / 1000.0); |
| 131 printf("Took %4.2lf ms to delete\n", |
| 132 delete_timer.TotalElapsedTime() / 1000.0); |
| 133 |
| 134 return 0; |
| 135 } |
| 136 } // namespace bin |
| 137 } // namespace dart |
| 138 |
| 139 int main(int argc, char** argv) { |
| 140 return dart::bin::main(argc, argv); |
| 141 } |
| OLD | NEW |