Skip to content

Commit 8f6b416

Browse files
committed
src: add v8::Local specialization for MaybeStackBuffer
Long-term itch. Per v8 rules, we're not supposed to be heap allocating v8::Local's; instead we're supposed to be using v8::LocalVector. Create a specialization of MaybeStackBuffer that uses either a stack array of v8::Locals or v8::LocalVector with some additional utility improvements. Signed-off-by: James M Snell <jasnell@gmail.com>
1 parent cbe18d8 commit 8f6b416

14 files changed

Lines changed: 164 additions & 46 deletions

src/api/callback.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ MaybeLocal<Value> InternalMakeCallback(Environment* env,
245245

246246
Local<Context> context = env->context();
247247
if (use_async_hooks_trampoline) {
248-
MaybeStackBuffer<Local<Value>, 16> args(3 + argc);
248+
MaybeStackBuffer<Value, 16> args(env->isolate(), 3 + argc);
249249
args[0] = Number::New(env->isolate(), asyncContext.async_id);
250250
args[1] = resource;
251251
args[2] = callback;

src/cares_wrap.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,12 +187,12 @@ Local<Array> AddrTTLToArray(
187187
Environment* env,
188188
const T* addrttls,
189189
size_t naddrttls) {
190-
MaybeStackBuffer<Local<Value>, 8> ttls(naddrttls);
190+
MaybeStackBuffer<Value, 8> ttls(env->isolate(), naddrttls);
191191
for (size_t i = 0; i < naddrttls; i++) {
192192
ttls[i] = Integer::NewFromUnsigned(env->isolate(), addrttls[i].ttl);
193193
}
194194

195-
return Array::New(env->isolate(), ttls.out(), naddrttls);
195+
return ttls.ToArray();
196196
}
197197

198198
// Parse the CSV produced by ares_get_servers_csv() back into (ip, port)

src/crypto/crypto_tls.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1958,7 +1958,7 @@ void TLSWrap::GetSharedSigalgs(const FunctionCallbackInfo<Value>& args) {
19581958
SSL* ssl = w->ssl_.get();
19591959
int nsig = SSL_get_shared_sigalgs(ssl, 0, nullptr, nullptr, nullptr, nullptr,
19601960
nullptr);
1961-
MaybeStackBuffer<Local<Value>, 16> ret_arr(nsig);
1961+
MaybeStackBuffer<Value, 16> ret_arr(env->isolate(), nsig);
19621962

19631963
for (int i = 0; i < nsig; i++) {
19641964
int hash_nid;
@@ -2025,8 +2025,7 @@ void TLSWrap::GetSharedSigalgs(const FunctionCallbackInfo<Value>& args) {
20252025
ret_arr[i] = OneByteString(env->isolate(), sig_with_md);
20262026
}
20272027

2028-
args.GetReturnValue().Set(
2029-
Array::New(env->isolate(), ret_arr.out(), ret_arr.length()));
2028+
args.GetReturnValue().Set(ret_arr.ToArray());
20302029
}
20312030

20322031
void TLSWrap::ExportKeyingMaterial(const FunctionCallbackInfo<Value>& args) {

src/js_stream.cc

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,17 +119,14 @@ int JSStream::DoWrite(WriteWrap* w,
119119

120120
int value_int = UV_EPROTO;
121121

122-
MaybeStackBuffer<Local<Value>, 16> bufs_arr(count);
122+
MaybeStackBuffer<Value, 16> bufs_arr(env()->isolate(), count);
123123
for (size_t i = 0; i < count; i++) {
124124
if (!Buffer::Copy(env(), bufs[i].base, bufs[i].len).ToLocal(&bufs_arr[i])) {
125125
return value_int;
126126
}
127127
}
128128

129-
Local<Value> argv[] = {
130-
w->object(),
131-
Array::New(env()->isolate(), bufs_arr.out(), count)
132-
};
129+
Local<Value> argv[] = {w->object(), bufs_arr.ToArray()};
133130

134131
TryCatchScope try_catch(env());
135132
Local<Value> value;

src/js_udp_wrap.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ ssize_t JSUDPWrap::Send(uv_buf_t* bufs,
9898
int64_t value_int = JS_EXCEPTION_PENDING;
9999
size_t total_len = 0;
100100

101-
MaybeStackBuffer<Local<Value>, 16> buffers(nbufs);
101+
MaybeStackBuffer<Value, 16> buffers(env()->isolate(), nbufs);
102102
for (size_t i = 0; i < nbufs; i++) {
103103
if (!Buffer::Copy(env(), bufs[i].base, bufs[i].len).ToLocal(&buffers[i])) {
104104
return value_int;
@@ -110,9 +110,9 @@ ssize_t JSUDPWrap::Send(uv_buf_t* bufs,
110110
if (!AddressToJS(env(), addr).ToLocal(&address)) return value_int;
111111

112112
Local<Value> args[] = {
113-
listener()->CreateSendWrap(total_len)->object(),
114-
Array::New(env()->isolate(), buffers.out(), nbufs),
115-
address,
113+
listener()->CreateSendWrap(total_len)->object(),
114+
buffers.ToArray(),
115+
address,
116116
};
117117

118118
if (!MakeCallback(env()->onwrite_string(), arraysize(args), args)

src/node_dir.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ static MaybeLocal<Array> DirentListToArray(Environment* env,
206206
uv_dirent_t* ents,
207207
int num,
208208
enum encoding encoding) {
209-
MaybeStackBuffer<Local<Value>, 64> entries(num * 2);
209+
MaybeStackBuffer<Value, 64> entries(env->isolate(), num * 2);
210210

211211
// Return an array of all read filenames.
212212
int j = 0;
@@ -222,7 +222,7 @@ static MaybeLocal<Array> DirentListToArray(Environment* env,
222222
entries[j++] = Integer::New(env->isolate(), ents[i].type);
223223
}
224224

225-
return Array::New(env->isolate(), entries.out(), j);
225+
return entries.ToArray();
226226
}
227227

228228
static void AfterDirRead(uv_fs_t* req) {

src/node_env_var.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ MaybeLocal<Array> RealEnvStore::Enumerate(Isolate* isolate) const {
201201
auto cleanup = OnScopeLeave([&]() { uv_os_free_environ(items, count); });
202202
CHECK_EQ(uv_os_environ(&items, &count), 0);
203203

204-
MaybeStackBuffer<Local<Value>, 256> env_v(count);
204+
MaybeStackBuffer<Value, 256> env_v(isolate, count);
205205
int env_v_index = 0;
206206
for (int i = 0; i < count; i++) {
207207
#ifdef _WIN32
@@ -216,7 +216,7 @@ MaybeLocal<Array> RealEnvStore::Enumerate(Isolate* isolate) const {
216216
env_v[env_v_index++] = str;
217217
}
218218

219-
return Array::New(isolate, env_v.out(), env_v_index);
219+
return env_v.ToArray();
220220
}
221221

222222
std::shared_ptr<KVStore> KVStore::Clone(Isolate* isolate) const {

src/node_http2.cc

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,8 +1609,8 @@ void Http2Session::HandleHeadersFrame(const nghttp2_frame* frame) {
16091609
// this way for performance reasons (it's faster to generate and pass an
16101610
// array than it is to generate and pass the object).
16111611

1612-
MaybeStackBuffer<Local<Value>, 64> headers_v(stream->headers_count() * 2);
1613-
MaybeStackBuffer<Local<Value>, 32> sensitive_v(stream->headers_count());
1612+
MaybeStackBuffer<Value, 64> headers_v(isolate, stream->headers_count() * 2);
1613+
MaybeStackBuffer<Value, 32> sensitive_v(isolate, stream->headers_count());
16141614
size_t sensitive_count = 0;
16151615

16161616
stream->TransferHeaders([&](const Http2Header& header, size_t i) {
@@ -1627,13 +1627,14 @@ void Http2Session::HandleHeadersFrame(const nghttp2_frame* frame) {
16271627
stream->retained_headers_length_ += stream->current_headers_length_;
16281628
stream->current_headers_length_ = 0;
16291629

1630+
sensitive_v.SetLength(sensitive_count);
16301631
Local<Value> args[] = {
1631-
stream->object(),
1632-
Integer::New(isolate, id),
1633-
Integer::New(isolate, stream->headers_category()),
1634-
Integer::New(isolate, frame->hd.flags),
1635-
Array::New(isolate, headers_v.out(), headers_v.length()),
1636-
Array::New(isolate, sensitive_v.out(), sensitive_count),
1632+
stream->object(),
1633+
Integer::New(isolate, id),
1634+
Integer::New(isolate, stream->headers_category()),
1635+
Integer::New(isolate, frame->hd.flags),
1636+
headers_v.ToArray(),
1637+
sensitive_v.ToArray(),
16371638
};
16381639
MakeCallback(env()->http2session_on_headers_function(),
16391640
arraysize(args), args);

src/node_messaging.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,7 +1093,7 @@ void MessagePort::PostMessage(const FunctionCallbackInfo<Value>& args) {
10931093
"MessagePort.postMessage");
10941094
}
10951095

1096-
TransferList transfer_list;
1096+
TransferList transfer_list(env->isolate());
10971097
if (!GetTransferList(env, context, args[1], &transfer_list)) {
10981098
return;
10991099
}
@@ -1607,7 +1607,7 @@ static void StructuredClone(const FunctionCallbackInfo<Value>& args) {
16071607

16081608
Local<Value> value = args[0];
16091609

1610-
TransferList transfer_list;
1610+
TransferList transfer_list(isolate);
16111611
Local<Object> options = args[1].As<Object>();
16121612
Local<Value> transfer_list_v;
16131613
if (!options->Get(context, env->transfer_string())

src/node_messaging.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace worker {
1717
class MessagePortData;
1818
class MessagePort;
1919

20-
typedef MaybeStackBuffer<v8::Local<v8::Value>, 8> TransferList;
20+
typedef MaybeStackBuffer<v8::Value, 8> TransferList;
2121

2222
// Used to represent the in-flight structure of an object that is being
2323
// transferred or cloned using postMessage().

0 commit comments

Comments
 (0)