Skip to content

Commit f9b7714

Browse files
committed
src: don't call v8::Object::SetHiddenValue()
Don't use v8::Object::SetHiddenValue() to keep a reference alive to the buffer, we can just as easily do that from JS land and it's a lot faster to boot. Because the buffer is now a visible property of the write request object, it's essential that we do *not* log it - we'd be effectively serializing the whole buffer to a pretty-printed string.
1 parent f548433 commit f9b7714

File tree

4 files changed

+9
-10
lines changed

4 files changed

+9
-10
lines changed

lib/dgram.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ Socket.prototype.send = function(buffer,
301301
self.emit('error', ex);
302302
}
303303
else if (self._handle) {
304-
var req = {};
304+
var req = { buffer: buffer }; // Keep reference alive.
305305
if (callback) {
306306
req.callback = callback;
307307
req.oncomplete = afterSend;

lib/net.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,13 @@ Socket.prototype._writeGeneric = function(writev, data, encoding, cb) {
640640
// Retain chunks
641641
if (err === 0) req._chunks = chunks;
642642
} else {
643-
var enc = util.isBuffer(data) ? 'buffer' : encoding;
643+
var enc;
644+
if (util.isBuffer(data)) {
645+
req.buffer = data; // Keep reference alive.
646+
enc = 'buffer';
647+
} else {
648+
enc = encoding;
649+
}
644650
err = createWriteReq(req, this._handle, data, enc);
645651
}
646652

@@ -743,7 +749,7 @@ function afterWrite(status, handle, req) {
743749
var self = handle.owner;
744750
var state = self._writableState;
745751
if (self !== process.stderr && self !== process.stdout)
746-
debug('afterWrite', status, req);
752+
debug('afterWrite', status);
747753

748754
// callback may come after call to destroy.
749755
if (self.destroyed) {

src/stream_wrap.cc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ using v8::Undefined;
4949
using v8::Value;
5050

5151

52-
static Cached<String> buffer_sym;
5352
static Cached<String> bytes_sym;
5453
static Cached<String> write_queue_size_sym;
5554
static Cached<String> onread_sym;
@@ -63,7 +62,6 @@ void StreamWrap::Initialize(Handle<Object> target) {
6362
initialized = true;
6463

6564
HandleScope scope(node_isolate);
66-
buffer_sym = FIXED_ONE_BYTE_STRING(node_isolate, "buffer");
6765
bytes_sym = FIXED_ONE_BYTE_STRING(node_isolate, "bytes");
6866
write_queue_size_sym = FIXED_ONE_BYTE_STRING(node_isolate, "writeQueueSize");
6967
onread_sym = FIXED_ONE_BYTE_STRING(node_isolate, "onread");
@@ -215,8 +213,6 @@ void StreamWrap::WriteBuffer(const FunctionCallbackInfo<Value>& args) {
215213
char* storage = new char[sizeof(WriteWrap)];
216214
WriteWrap* req_wrap = new(storage) WriteWrap(req_wrap_obj, wrap);
217215

218-
req_wrap_obj->SetHiddenValue(buffer_sym, buf_obj);
219-
220216
uv_buf_t buf;
221217
WriteBuffer(buf_obj, &buf);
222218

src/udp_wrap.cc

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class SendWrap : public ReqWrap<uv_udp_send_t> {
5757

5858

5959
static Persistent<Function> constructor;
60-
static Cached<String> buffer_sym;
6160
static Cached<String> oncomplete_sym;
6261
static Cached<String> onmessage_sym;
6362

@@ -87,7 +86,6 @@ UDPWrap::~UDPWrap() {
8786
void UDPWrap::Initialize(Handle<Object> target) {
8887
HandleScope scope(node_isolate);
8988

90-
buffer_sym = FIXED_ONE_BYTE_STRING(node_isolate, "buffer");
9189
oncomplete_sym = FIXED_ONE_BYTE_STRING(node_isolate, "oncomplete");
9290
onmessage_sym = FIXED_ONE_BYTE_STRING(node_isolate, "onmessage");
9391

@@ -261,7 +259,6 @@ void UDPWrap::DoSend(const FunctionCallbackInfo<Value>& args, int family) {
261259
assert(length <= Buffer::Length(buffer_obj) - offset);
262260

263261
SendWrap* req_wrap = new SendWrap(req_wrap_obj, have_callback);
264-
req_wrap->object()->SetHiddenValue(buffer_sym, buffer_obj);
265262

266263
uv_buf_t buf = uv_buf_init(Buffer::Data(buffer_obj) + offset,
267264
length);

0 commit comments

Comments
 (0)