mirror of
https://github.com/denoland/deno.git
synced 2024-11-22 15:06:54 -05:00
Allow deno_buf with null alloc_ptr to be memcpy'd
This is a temporary hack to allow for easier restructuring of the serialization code as we move Flatbuffer stuff from C++ to Rust.
This commit is contained in:
parent
b87e6d5604
commit
b79ce93010
3 changed files with 49 additions and 6 deletions
|
@ -134,3 +134,14 @@ global.ErrorHandling = () => {
|
||||||
};
|
};
|
||||||
eval("\n\n notdefined()\n//# sourceURL=helloworld.js");
|
eval("\n\n notdefined()\n//# sourceURL=helloworld.js");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
global.SendNullAllocPtr = () => {
|
||||||
|
deno.recv(msg => {
|
||||||
|
assert(msg instanceof Uint8Array);
|
||||||
|
assert(msg.byteLength === 4);
|
||||||
|
assert(msg[0] === "a".charCodeAt(0));
|
||||||
|
assert(msg[1] === "b".charCodeAt(0));
|
||||||
|
assert(msg[2] === "c".charCodeAt(0));
|
||||||
|
assert(msg[3] === "d".charCodeAt(0));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
|
@ -120,6 +120,14 @@ void Print(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static v8::Local<v8::Uint8Array> ImportBuf(v8::Isolate* isolate, deno_buf buf) {
|
static v8::Local<v8::Uint8Array> ImportBuf(v8::Isolate* isolate, deno_buf buf) {
|
||||||
|
if (buf.alloc_ptr == nullptr) {
|
||||||
|
// If alloc_ptr isn't set, we memcpy.
|
||||||
|
// This is currently used for flatbuffers created in Rust.
|
||||||
|
auto ab = v8::ArrayBuffer::New(isolate, buf.data_len);
|
||||||
|
memcpy(ab->GetContents().Data(), buf.data_ptr, buf.data_len);
|
||||||
|
auto view = v8::Uint8Array::New(ab, 0, buf.data_len);
|
||||||
|
return view;
|
||||||
|
} else {
|
||||||
auto ab = v8::ArrayBuffer::New(
|
auto ab = v8::ArrayBuffer::New(
|
||||||
isolate, reinterpret_cast<void*>(buf.alloc_ptr), buf.alloc_len,
|
isolate, reinterpret_cast<void*>(buf.alloc_ptr), buf.alloc_len,
|
||||||
v8::ArrayBufferCreationMode::kInternalized);
|
v8::ArrayBufferCreationMode::kInternalized);
|
||||||
|
@ -127,6 +135,7 @@ static v8::Local<v8::Uint8Array> ImportBuf(v8::Isolate* isolate, deno_buf buf) {
|
||||||
v8::Uint8Array::New(ab, buf.data_ptr - buf.alloc_ptr, buf.data_len);
|
v8::Uint8Array::New(ab, buf.data_ptr - buf.alloc_ptr, buf.data_len);
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static deno_buf ExportBuf(v8::Isolate* isolate,
|
static deno_buf ExportBuf(v8::Isolate* isolate,
|
||||||
v8::Local<v8::ArrayBufferView> view) {
|
v8::Local<v8::ArrayBufferView> view) {
|
||||||
|
|
|
@ -34,6 +34,17 @@ deno_buf strbuf(const char* str) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Same as strbuf but with null alloc_ptr.
|
||||||
|
deno_buf StrBufNullAllocPtr(const char* str) {
|
||||||
|
auto len = strlen(str);
|
||||||
|
deno_buf buf;
|
||||||
|
buf.alloc_ptr = nullptr;
|
||||||
|
buf.alloc_len = 0;
|
||||||
|
buf.data_ptr = reinterpret_cast<uint8_t*>(strdup(str));
|
||||||
|
buf.data_len = len;
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
TEST(MockRuntimeTest, SendSuccess) {
|
TEST(MockRuntimeTest, SendSuccess) {
|
||||||
Deno* d = deno_new(nullptr, nullptr);
|
Deno* d = deno_new(nullptr, nullptr);
|
||||||
EXPECT_TRUE(deno_execute(d, "a.js", "SendSuccess()"));
|
EXPECT_TRUE(deno_execute(d, "a.js", "SendSuccess()"));
|
||||||
|
@ -176,3 +187,15 @@ TEST(MockRuntimeTest, ErrorHandling) {
|
||||||
EXPECT_EQ(count, 1);
|
EXPECT_EQ(count, 1);
|
||||||
deno_delete(d);
|
deno_delete(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(MockRuntimeTest, SendNullAllocPtr) {
|
||||||
|
static int count = 0;
|
||||||
|
Deno* d = deno_new(nullptr, [](auto _, auto buf) { count++; });
|
||||||
|
EXPECT_TRUE(deno_execute(d, "a.js", "SendNullAllocPtr()"));
|
||||||
|
deno_buf buf = StrBufNullAllocPtr("abcd");
|
||||||
|
EXPECT_EQ(buf.alloc_ptr, nullptr);
|
||||||
|
EXPECT_EQ(buf.data_len, 4u);
|
||||||
|
EXPECT_TRUE(deno_send(d, buf));
|
||||||
|
EXPECT_EQ(count, 0);
|
||||||
|
deno_delete(d);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue