diff --git a/deno2/deno.cc b/deno2/deno.cc index 7b84abf222..caea85ffb3 100644 --- a/deno2/deno.cc +++ b/deno2/deno.cc @@ -124,7 +124,6 @@ void Sub(const v8::FunctionCallbackInfo& args) { d->sub.Reset(isolate, func); } -// Called from JavaScript, routes message to golang. void Pub(const v8::FunctionCallbackInfo& args) { v8::Isolate* isolate = args.GetIsolate(); Deno* d = static_cast(isolate->GetData(0)); @@ -145,10 +144,12 @@ void Pub(const v8::FunctionCallbackInfo& args) { auto ab = v8::Local::Cast(ab_v); auto contents = ab->GetContents(); - void* buf = contents.Data(); - int buflen = static_cast(contents.ByteLength()); + // data is only a valid pointer until the end of this call. + const char* data = + const_cast(reinterpret_cast(contents.Data())); + deno_buf buf{data, contents.ByteLength()}; - auto retbuf = d->cb(d, channel, deno_buf{buf, buflen}); + auto retbuf = d->cb(d, channel, buf); if (retbuf.data) { // TODO(ry) Support zero-copy. auto ab = v8::ArrayBuffer::New(d->isolate, retbuf.len); @@ -292,7 +293,7 @@ bool deno_pub(Deno* d, const char* channel, deno_buf buf) { return false; } - // TODO(ry) support zero copy. + // TODO(ry) support zero-copy. auto ab = v8::ArrayBuffer::New(d->isolate, buf.len); memcpy(ab->GetContents().Data(), buf.data, buf.len); diff --git a/deno2/include/deno.h b/deno2/include/deno.h index 63f26ba8c5..b8d4e59a41 100644 --- a/deno2/include/deno.h +++ b/deno2/include/deno.h @@ -10,14 +10,16 @@ extern "C" { // Data that gets transmitted. typedef struct { - void* data; + const char* data; size_t len; } deno_buf; struct deno_s; typedef struct deno_s Deno; -// The callback from V8 when data is sent. +// A callback to receive a message from deno_pub javascript call. +// buf is valid only for the lifetime of the call. +// The returned deno_buf is returned from deno_pub in javascript. typedef deno_buf (*deno_sub_cb)(Deno* d, const char* channel, deno_buf buf); void deno_init(); diff --git a/deno2/mock_runtime_test.cc b/deno2/mock_runtime_test.cc index 297b58b227..9297936453 100644 --- a/deno2/mock_runtime_test.cc +++ b/deno2/mock_runtime_test.cc @@ -23,10 +23,7 @@ TEST(MockRuntimeTest, ErrorsCorrectly) { deno_dispose(d); } -deno_buf strbuf(const char* str) { - void* d = reinterpret_cast(const_cast(str)); - return deno_buf{d, strlen(str)}; -} +deno_buf strbuf(const char* str) { return deno_buf{str, strlen(str)}; } TEST(MockRuntimeTest, PubSuccess) { Deno* d = deno_new(NULL, NULL); @@ -56,11 +53,9 @@ TEST(MockRuntimeTest, SubReturnEmpty) { count++; EXPECT_STREQ(channel, "SubReturnEmpty"); EXPECT_EQ(static_cast(3), buf.len); - // TODO(ry) buf.data should just be a char*. - char* data = reinterpret_cast(buf.data); - EXPECT_EQ(data[0], 'a'); - EXPECT_EQ(data[1], 'b'); - EXPECT_EQ(data[2], 'c'); + EXPECT_EQ(buf.data[0], 'a'); + EXPECT_EQ(buf.data[1], 'b'); + EXPECT_EQ(buf.data[2], 'c'); return deno_buf{nullptr, 0}; }); EXPECT_TRUE(deno_execute(d, "a.js", "SubReturnEmpty()")); @@ -74,11 +69,9 @@ TEST(MockRuntimeTest, SubReturnBar) { count++; EXPECT_STREQ(channel, "SubReturnBar"); EXPECT_EQ(static_cast(3), buf.len); - // TODO(ry) buf.data should just be a char*. - char* data = reinterpret_cast(buf.data); - EXPECT_EQ(data[0], 'a'); - EXPECT_EQ(data[1], 'b'); - EXPECT_EQ(data[2], 'c'); + EXPECT_EQ(buf.data[0], 'a'); + EXPECT_EQ(buf.data[1], 'b'); + EXPECT_EQ(buf.data[2], 'c'); return strbuf("bar"); }); EXPECT_TRUE(deno_execute(d, "a.js", "SubReturnBar()"));