summaryrefslogtreecommitdiff
path: root/src/from_snapshot.cc
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2018-07-26 23:21:10 -0400
committerRyan Dahl <ry@tinyclouds.org>2018-08-01 12:14:10 -0400
commit6b6fac209c97d5961ea875d4b22f66fa97272876 (patch)
tree5b12f2e80cc7697712ca7a2db622974105593f48 /src/from_snapshot.cc
parentdb8dc0e9f8c739a07089ca8077d49cf9c902ddc4 (diff)
Optimize compile time by using asm.
Switches to using asm incbin to embed the V8 snapshot instead of outputing C code and then compiling it. Compile time for from_snapshot.o goes from 44s to 1s.
Diffstat (limited to 'src/from_snapshot.cc')
-rw-r--r--src/from_snapshot.cc24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/from_snapshot.cc b/src/from_snapshot.cc
index ac48e8a20..2575ec32f 100644
--- a/src/from_snapshot.cc
+++ b/src/from_snapshot.cc
@@ -10,11 +10,21 @@
#include "deno.h"
#include "internal.h"
+extern const char deno_snapshot_start asm("deno_snapshot_start");
+extern const char deno_snapshot_end asm("deno_snapshot_end");
#ifdef DENO_MOCK_RUNTIME
-#include "snapshot_mock_runtime.cc"
+asm(".data\n"
+ "deno_snapshot_start: .incbin \"gen/snapshot_mock_runtime.bin\"\n"
+ "deno_snapshot_end:\n"
+ ".globl deno_snapshot_start;\n"
+ ".globl deno_snapshot_end;");
#else
-#include "snapshot_deno.cc"
-#endif
+asm(".data\n"
+ "deno_snapshot_start: .incbin \"gen/snapshot_deno.bin\"\n"
+ "deno_snapshot_end:\n"
+ ".globl deno_snapshot_start;\n"
+ ".globl deno_snapshot_end;");
+#endif // DENO_MOCK_RUNTIME
namespace deno {
@@ -42,7 +52,13 @@ Deno* NewFromSnapshot(void* data, deno_recv_cb cb) {
params.array_buffer_allocator =
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
params.external_references = external_references;
- params.snapshot_blob = StartupBlob_snapshot();
+
+ CHECK_NE(&deno_snapshot_start, nullptr);
+ int snapshot_len =
+ static_cast<int>(&deno_snapshot_end - &deno_snapshot_start);
+ static v8::StartupData snapshot = {&deno_snapshot_start, snapshot_len};
+ params.snapshot_blob = &snapshot;
+
v8::Isolate* isolate = v8::Isolate::New(params);
AddIsolate(d, isolate);