summaryrefslogtreecommitdiff
path: root/libdeno/binding.cc
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2018-10-24 01:12:13 -0400
committerRyan Dahl <ry@tinyclouds.org>2018-10-24 14:52:38 -0700
commit61cda728816b5916180f22d977ba741e2fadc8d9 (patch)
tree99e77029d5f3ffafff7c8ca0136169abcdaf8f7f /libdeno/binding.cc
parent6afe94b3c855a8c486ce2a593cf2f8cac3b4d711 (diff)
libdeno: Expose snapshot creation.
Diffstat (limited to 'libdeno/binding.cc')
-rw-r--r--libdeno/binding.cc25
1 files changed, 20 insertions, 5 deletions
diff --git a/libdeno/binding.cc b/libdeno/binding.cc
index 9fca3814c..686defffa 100644
--- a/libdeno/binding.cc
+++ b/libdeno/binding.cc
@@ -30,6 +30,19 @@ void DeserializeInternalFields(v8::Local<v8::Object> holder, int index,
deserialized_data.push_back(embedder_field);
}
+v8::StartupData SerializeInternalFields(v8::Local<v8::Object> holder, int index,
+ void* data) {
+ DCHECK_EQ(data, nullptr);
+ InternalFieldData* embedder_field = static_cast<InternalFieldData*>(
+ holder->GetAlignedPointerFromInternalField(index));
+ if (embedder_field == nullptr) return {nullptr, 0};
+ int size = sizeof(*embedder_field);
+ char* payload = new char[size];
+ // We simply use memcpy to serialize the content.
+ memcpy(payload, embedder_field, size);
+ return {payload, size};
+}
+
DenoIsolate* FromIsolate(v8::Isolate* isolate) {
return static_cast<DenoIsolate*>(isolate->GetData(0));
}
@@ -433,8 +446,10 @@ bool Execute(v8::Local<v8::Context> context, const char* js_filename,
}
void InitializeContext(v8::Isolate* isolate, v8::Local<v8::Context> context,
- const char* js_filename, const std::string& js_source,
- const std::string* source_map) {
+ const char* js_filename, const char* js_source,
+ const char* source_map) {
+ CHECK_NE(js_source, nullptr);
+ CHECK_NE(js_filename, nullptr);
v8::HandleScope handle_scope(isolate);
v8::Context::Scope context_scope(context);
@@ -483,7 +498,7 @@ void InitializeContext(v8::Isolate* isolate, v8::Local<v8::Context> context,
.FromJust());
{
- auto source = deno::v8_str(js_source.c_str());
+ auto source = deno::v8_str(js_source);
CHECK(
deno_val->Set(context, deno::v8_str("mainSource"), source).FromJust());
@@ -491,10 +506,10 @@ void InitializeContext(v8::Isolate* isolate, v8::Local<v8::Context> context,
CHECK(r);
if (source_map != nullptr) {
- CHECK_GT(source_map->length(), 1u);
v8::TryCatch try_catch(isolate);
v8::ScriptOrigin origin(v8_str("set_source_map.js"));
- std::string source_map_parens = "(" + *source_map + ")";
+ std::string source_map_parens =
+ std::string("(") + std::string(source_map) + std::string(")");
auto source_map_v8_str = deno::v8_str(source_map_parens.c_str());
auto script = v8::Script::Compile(context, source_map_v8_str, &origin);
if (script.IsEmpty()) {