From 110ddab670cbf477488cceeea2842c980942d7b8 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Sun, 10 Jun 2018 00:32:04 +0200 Subject: Add deno2 prototype from external repo. --- deno2/snapshot_creator.cc | 145 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 deno2/snapshot_creator.cc (limited to 'deno2/snapshot_creator.cc') diff --git a/deno2/snapshot_creator.cc b/deno2/snapshot_creator.cc new file mode 100644 index 000000000..4001abe6e --- /dev/null +++ b/deno2/snapshot_creator.cc @@ -0,0 +1,145 @@ +// Copyright 2018 Ryan Dahl +// All rights reserved. MIT License. +#include +#include +#include +#include +#include +#include + +#include "v8/include/v8.h" + +#include "./deno.h" + +class StartupDataCppWriter { + public: + StartupDataCppWriter(const char* name, const char* filename, + v8::StartupData sd) + : name_(name), + filename_(filename), + sd_(sd), + file_(filename_, std::ios::binary) {} + + void Write() { + WritePrefix(); + WriteData(); + WriteSuffix(); + + file_.close(); + if (file_.bad()) { + printf("Unable to open file \"%s\" for writing.\n", filename_); + exit(1); + } + printf("Wrote %s %d %s \n", name_, sd_.raw_size, filename_); + } + + private: + void WritePrefix() { + file_ << "// Autogenerated snapshot file. Do not edit.\n\n"; + file_ << "#include \"v8/include/v8.h\"\n\n"; + } + + void WriteSuffix() { + char buffer[500]; + snprintf(buffer, sizeof(buffer), + "const v8::StartupData* StartupBlob_%s() {\n", name_); + file_ << buffer; + snprintf(buffer, sizeof(buffer), " return &%s_blob;\n", name_); + file_ << buffer; + file_ << "}\n\n"; + } + + void WriteBinaryContentsAsCArray() { + char buffer[5]; + for (int i = 0; i < sd_.raw_size; i++) { + if ((i & 0x1F) == 0x1F) file_ << "\n"; + if (i > 0) file_ << ","; + snprintf(buffer, sizeof(buffer), "%u", + static_cast(sd_.data[i])); + file_ << buffer; + } + file_ << "\n"; + } + + void WriteData() { + char buffer[500]; + snprintf(buffer, sizeof(buffer), "static const char %s_blob_data[] = {\n", + name_); + file_ << buffer; + WriteBinaryContentsAsCArray(); + file_ << "};\n"; + snprintf(buffer, sizeof(buffer), "static const int %s_blob_size = %d;\n", + name_, sd_.raw_size); + file_ << buffer; + snprintf(buffer, sizeof(buffer), "static const v8::StartupData %s_blob =\n", + name_); + file_ << buffer; + snprintf(buffer, sizeof(buffer), + "{ (const char*) %s_blob_data, %s_blob_size };\n", name_, name_); + file_ << buffer; + } + + const char* name_; + const char* filename_; + v8::StartupData sd_; + std::ofstream file_; +}; + +// Caller must free returned value. +static v8::StartupData ReadFile(const char* fn) { + std::ifstream input(fn, std::ios::binary); + if (input.bad()) { + printf("Error reading %s\n", fn); + exit(1); + } + // Note the allocated buffer is intentionally not freed in this program. + // It may show up as a memory leak some day, but other than that it's + // harmless. + auto* buffer = new std::vector((std::istreambuf_iterator(input)), + (std::istreambuf_iterator())); + v8::StartupData sd; + sd.data = buffer->data(); + sd.raw_size = static_cast(buffer->size()); + if (input.bad()) { + printf("Error reading %s\n", fn); + exit(1); + } + return sd; +} + +void WriteFile(const char* fn, v8::StartupData startup_data) { + std::ofstream output(fn, std::ios::binary); + output.write(startup_data.data, startup_data.raw_size); + output.close(); + if (output.bad()) { + printf("Error writing %s\n", fn); + exit(1); + } +} + +int main(int argc, char** argv) { + // The only documentation for this programs arguments is right here. + const char* js_fn = argv[1]; + const char* natives_in_bin = argv[2]; + const char* snapshot_in_bin = argv[3]; + const char* natives_out_cc = argv[4]; + const char* snapshot_out_cc = argv[5]; + + v8_init(); + + auto js_data = ReadFile(js_fn); + auto natives_blob = ReadFile(natives_in_bin); + auto snapshot_in_blob = ReadFile(snapshot_in_bin); + + v8::V8::SetNativesDataBlob(&natives_blob); + v8::V8::SetSnapshotDataBlob(&snapshot_in_blob); + + auto snapshot_blob = deno_make_snapshot(js_fn, js_data.data); + + StartupDataCppWriter nativesWriter("natives", natives_out_cc, natives_blob); + nativesWriter.Write(); + + StartupDataCppWriter snapshotWriter("snapshot", snapshot_out_cc, + snapshot_blob); + snapshotWriter.Write(); +} -- cgit v1.2.3 From 092ec213818c1c3f94e4750f80bf1186703944d9 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Sun, 10 Jun 2018 02:24:34 +0200 Subject: Wrap deno library in a namespace. --- deno2/snapshot_creator.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'deno2/snapshot_creator.cc') diff --git a/deno2/snapshot_creator.cc b/deno2/snapshot_creator.cc index 4001abe6e..1aaa958d0 100644 --- a/deno2/snapshot_creator.cc +++ b/deno2/snapshot_creator.cc @@ -125,7 +125,7 @@ int main(int argc, char** argv) { const char* natives_out_cc = argv[4]; const char* snapshot_out_cc = argv[5]; - v8_init(); + deno::v8_init(); auto js_data = ReadFile(js_fn); auto natives_blob = ReadFile(natives_in_bin); @@ -134,7 +134,7 @@ int main(int argc, char** argv) { v8::V8::SetNativesDataBlob(&natives_blob); v8::V8::SetSnapshotDataBlob(&snapshot_in_blob); - auto snapshot_blob = deno_make_snapshot(js_fn, js_data.data); + auto snapshot_blob = deno::deno_make_snapshot(js_fn, js_data.data); StartupDataCppWriter nativesWriter("natives", natives_out_cc, natives_blob); nativesWriter.Write(); -- cgit v1.2.3 From aa857984b04511e62296b6d3ad9a451f81d71f71 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Sun, 10 Jun 2018 04:11:02 +0200 Subject: Simplify c api --- deno2/snapshot_creator.cc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'deno2/snapshot_creator.cc') diff --git a/deno2/snapshot_creator.cc b/deno2/snapshot_creator.cc index 1aaa958d0..9ecfff11c 100644 --- a/deno2/snapshot_creator.cc +++ b/deno2/snapshot_creator.cc @@ -125,16 +125,13 @@ int main(int argc, char** argv) { const char* natives_out_cc = argv[4]; const char* snapshot_out_cc = argv[5]; - deno::v8_init(); - auto js_data = ReadFile(js_fn); auto natives_blob = ReadFile(natives_in_bin); auto snapshot_in_blob = ReadFile(snapshot_in_bin); - v8::V8::SetNativesDataBlob(&natives_blob); - v8::V8::SetSnapshotDataBlob(&snapshot_in_blob); - - auto snapshot_blob = deno::deno_make_snapshot(js_fn, js_data.data); + deno::v8_init(); + auto snapshot_blob = deno::make_snapshot(&natives_blob, &snapshot_in_blob, + js_fn, js_data.data); StartupDataCppWriter nativesWriter("natives", natives_out_cc, natives_blob); nativesWriter.Write(); -- cgit v1.2.3 From 3062039ffe5563cab1f80b2d7da2d9c7e468c462 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Sun, 10 Jun 2018 04:55:31 +0200 Subject: First pass at libdeno. --- deno2/snapshot_creator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'deno2/snapshot_creator.cc') diff --git a/deno2/snapshot_creator.cc b/deno2/snapshot_creator.cc index 9ecfff11c..f1bbfb0ed 100644 --- a/deno2/snapshot_creator.cc +++ b/deno2/snapshot_creator.cc @@ -9,7 +9,7 @@ #include "v8/include/v8.h" -#include "./deno.h" +#include "include/deno.h" class StartupDataCppWriter { public: -- cgit v1.2.3 From a6880dad6534ee9e1637c5098698cf32a4f1527e Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Sun, 10 Jun 2018 13:17:04 +0200 Subject: make_snapshot should be private Now deno.h doesn't export v8.h and is self contained. --- deno2/snapshot_creator.cc | 1 + 1 file changed, 1 insertion(+) (limited to 'deno2/snapshot_creator.cc') diff --git a/deno2/snapshot_creator.cc b/deno2/snapshot_creator.cc index f1bbfb0ed..f904e6679 100644 --- a/deno2/snapshot_creator.cc +++ b/deno2/snapshot_creator.cc @@ -10,6 +10,7 @@ #include "v8/include/v8.h" #include "include/deno.h" +#include "./deno_internal.h" class StartupDataCppWriter { public: -- cgit v1.2.3 From 9296b21b87eec3f01bee465fcb2b64c4ea14514b Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Sun, 10 Jun 2018 14:18:15 +0200 Subject: Use C linkage in deno.h --- deno2/snapshot_creator.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'deno2/snapshot_creator.cc') diff --git a/deno2/snapshot_creator.cc b/deno2/snapshot_creator.cc index f904e6679..fc43783e2 100644 --- a/deno2/snapshot_creator.cc +++ b/deno2/snapshot_creator.cc @@ -9,8 +9,8 @@ #include "v8/include/v8.h" -#include "include/deno.h" #include "./deno_internal.h" +#include "include/deno.h" class StartupDataCppWriter { public: @@ -130,9 +130,9 @@ int main(int argc, char** argv) { auto natives_blob = ReadFile(natives_in_bin); auto snapshot_in_blob = ReadFile(snapshot_in_bin); - deno::v8_init(); - auto snapshot_blob = deno::make_snapshot(&natives_blob, &snapshot_in_blob, - js_fn, js_data.data); + deno_init(); + auto snapshot_blob = + deno::MakeSnapshot(&natives_blob, &snapshot_in_blob, js_fn, js_data.data); StartupDataCppWriter nativesWriter("natives", natives_out_cc, natives_blob); nativesWriter.Write(); -- cgit v1.2.3 From 041e503838d1f030faca08d93de4aaadf0bc4b98 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Sun, 10 Jun 2018 14:34:59 +0200 Subject: Minor libdeno clean ups. --- deno2/snapshot_creator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'deno2/snapshot_creator.cc') diff --git a/deno2/snapshot_creator.cc b/deno2/snapshot_creator.cc index fc43783e2..bf377535a 100644 --- a/deno2/snapshot_creator.cc +++ b/deno2/snapshot_creator.cc @@ -31,7 +31,7 @@ class StartupDataCppWriter { printf("Unable to open file \"%s\" for writing.\n", filename_); exit(1); } - printf("Wrote %s %d %s \n", name_, sd_.raw_size, filename_); + // printf("Wrote %s %d %s \n", name_, sd_.raw_size, filename_); } private: -- cgit v1.2.3 From 7784cc2c1537a23b8b8ffa634b1a9b1ddf88886a Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Tue, 12 Jun 2018 06:36:01 +0200 Subject: Fix protobufjs snapshotting. --- deno2/snapshot_creator.cc | 3 +++ 1 file changed, 3 insertions(+) (limited to 'deno2/snapshot_creator.cc') diff --git a/deno2/snapshot_creator.cc b/deno2/snapshot_creator.cc index bf377535a..8441e766f 100644 --- a/deno2/snapshot_creator.cc +++ b/deno2/snapshot_creator.cc @@ -1,5 +1,6 @@ // Copyright 2018 Ryan Dahl // All rights reserved. MIT License. +// Hint: --trace_serializer is a useful debugging flag. #include #include #include @@ -126,6 +127,8 @@ int main(int argc, char** argv) { const char* natives_out_cc = argv[4]; const char* snapshot_out_cc = argv[5]; + v8::V8::SetFlagsFromCommandLine(&argc, argv, true); + auto js_data = ReadFile(js_fn); auto natives_blob = ReadFile(natives_in_bin); auto snapshot_in_blob = ReadFile(snapshot_in_bin); -- cgit v1.2.3 From 1676822888ef6c75bb2afff3b7a93d030d63f2ea Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Tue, 12 Jun 2018 22:05:49 +0200 Subject: deno2: build on Windows --- deno2/snapshot_creator.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'deno2/snapshot_creator.cc') diff --git a/deno2/snapshot_creator.cc b/deno2/snapshot_creator.cc index 8441e766f..1cd39cce5 100644 --- a/deno2/snapshot_creator.cc +++ b/deno2/snapshot_creator.cc @@ -130,12 +130,14 @@ int main(int argc, char** argv) { v8::V8::SetFlagsFromCommandLine(&argc, argv, true); auto js_data = ReadFile(js_fn); + // Ensure js_source is null-terminated. + std::string js_source(js_data.data, js_data.raw_size); auto natives_blob = ReadFile(natives_in_bin); auto snapshot_in_blob = ReadFile(snapshot_in_bin); deno_init(); auto snapshot_blob = - deno::MakeSnapshot(&natives_blob, &snapshot_in_blob, js_fn, js_data.data); + deno::MakeSnapshot(&natives_blob, &snapshot_in_blob, js_fn, js_source.c_str()); StartupDataCppWriter nativesWriter("natives", natives_out_cc, natives_blob); nativesWriter.Write(); -- cgit v1.2.3