Chromium Code Reviews| Index: src/mksnapshot.cc |
| =================================================================== |
| --- src/mksnapshot.cc (revision 3179) |
| +++ src/mksnapshot.cc (working copy) |
| @@ -109,6 +109,46 @@ |
| } |
| +class CppByteSink : public i::SnapshotByteSink { |
| + public: |
| + explicit CppByteSink(const char* snapshot_file) : bytes_written_(0) { |
| + fp_ = i::OS::FOpen(snapshot_file, "wb"); |
| + if (fp_ == NULL) { |
| + i::PrintF("Unable to write to snapshot file \"%s\"\n", snapshot_file); |
| + exit(1); |
| + } |
| + fprintf(fp_, "// Autogenerated snapshot file. Do not edit.\n\n"); |
| + fprintf(fp_, "#include \"v8.h\"\n"); |
| + fprintf(fp_, "#include \"platform.h\"\n\n"); |
| + fprintf(fp_, "#include \"snapshot.h\"\n\n"); |
| + fprintf(fp_, "namespace v8 {\nnamespace internal {\n\n"); |
| + fprintf(fp_, "const byte Snapshot::data_[] = {"); |
| + } |
| + virtual ~CppByteSink() { |
|
Mads Ager (chromium)
2009/10/30 10:17:11
Space between the methods?
|
| + if (fp_ != NULL) { |
| + fprintf(fp_, "};\n\n"); |
| + fprintf(fp_, "int Snapshot::size_ = %d;\n\n", bytes_written_); |
| + fprintf(fp_, "} } // namespace v8::internal\n"); |
| + fclose(fp_); |
| + } |
| + } |
| + virtual void Put(int byte, const char* description) { |
| + if (bytes_written_ != 0) { |
| + fprintf(fp_, ","); |
| + } |
| + fprintf(fp_, "%d", byte); |
| + bytes_written_++; |
| + if ((bytes_written_ & 0x3f) == 0) { |
| + fprintf(fp_, "\n"); |
| + } |
| + } |
| + |
| + private: |
| + FILE* fp_; |
| + int bytes_written_; |
| +}; |
| + |
| + |
| // Write C++ code that defines Snapshot::snapshot_ to contain the snapshot |
| // to the file given by filename. Only the first size chars are written. |
| static int WriteInternalSnapshotToFile(const char* filename, |
| @@ -116,7 +156,7 @@ |
| int size) { |
| FILE* f = i::OS::FOpen(filename, "wb"); |
| if (f == NULL) { |
| - i::OS::PrintError("Cannot open file %s for reading.\n", filename); |
| + i::OS::PrintError("Cannot open file %s for writing.\n", filename); |
| return 0; |
| } |
| fprintf(f, "// Autogenerated snapshot file. Do not edit.\n\n"); |
| @@ -140,6 +180,23 @@ |
| } |
| +int main2(int argc, char** argv) { |
| + i::Serializer::Enable(); |
| + Persistent<Context> context = v8::Context::New(); |
| + // Make sure all builtin scripts are cached. |
| + { HandleScope scope; |
| + for (int i = 0; i < i::Natives::GetBuiltinsCount(); i++) { |
| + i::Bootstrapper::NativesSourceLookup(i); |
| + } |
| + } |
| + context.Dispose(); |
| + CppByteSink sink(argv[1]); |
| + i::Serializer2 ser(&sink); |
| + ser.Serialize(); |
| + return 0; |
| +} |
| + |
| + |
| int main(int argc, char** argv) { |
| #ifdef ENABLE_LOGGING_AND_PROFILING |
| // By default, log code create information in the snapshot. |
| @@ -154,6 +211,10 @@ |
| return !i::FLAG_help; |
| } |
| + if (i::FLAG_new_snapshot) { |
| + return main2(argc, argv); |
| + } |
| + |
| v8::V8::SetCounterFunction(counter_callback); |
| v8::HandleScope scope; |