Skip to content

Commit 288ba1e

Browse files
committed
improve js.obj() performance across the repository
1 parent 193b00f commit 288ba1e

File tree

4 files changed

+35
-30
lines changed

4 files changed

+35
-30
lines changed

src/workerd/api/node/process.c++

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,11 @@ namespace {
110110
} // namespace
111111

112112
jsg::JsObject ProcessModule::getVersions(jsg::Lock& js) const {
113-
auto versions = js.obj();
114113
// Node.js version - represents the most current Node.js version supported
115114
// by the platform, as defined in node-version.h
116-
versions.set(js, "node"_kj, js.str(nodeVersion));
117-
return versions;
115+
static kj::StringPtr keys[] = {"node"_kj};
116+
jsg::JsValue values[] = {js.str(nodeVersion)};
117+
return js.obj(kj::arrayPtr(keys), kj::arrayPtr(values));
118118
}
119119

120120
kj::StringPtr ProcessModule::getPlatform(jsg::Lock& js) const {

src/workerd/io/trace-stream.c++

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,9 @@ jsg::JsValue ToJs(
171171
}
172172

173173
jsg::JsValue ToJs(jsg::Lock& js, const tracing::FetchResponseInfo& info, StringCache& cache) {
174-
auto obj = js.obj();
175-
obj.set(js, TYPE_STR, cache.get(js, FETCH_STR));
176-
obj.set(js, STATUSCODE_STR, js.num(info.statusCode));
177-
return obj;
174+
static kj::StringPtr keys[] = {TYPE_STR, STATUSCODE_STR};
175+
jsg::JsValue values[] = {cache.get(js, FETCH_STR), js.num(info.statusCode)};
176+
return js.obj(kj::ArrayPtr<kj::StringPtr>(keys), kj::ArrayPtr<jsg::JsValue>(values));
178177
}
179178

180179
jsg::JsValue ToJs(jsg::Lock& js, const tracing::FetchEventInfo& info, StringCache& cache) {
@@ -201,9 +200,9 @@ jsg::JsValue ToJs(jsg::Lock& js, const tracing::FetchEventInfo& info, StringCach
201200
}
202201

203202
jsg::JsValue ToJs(jsg::Lock& js, const tracing::JsRpcEventInfo& info, StringCache& cache) {
204-
auto obj = js.obj();
205-
obj.set(js, TYPE_STR, cache.get(js, JSRPC_STR));
206-
return obj;
203+
static kj::StringPtr keys[] = {TYPE_STR};
204+
jsg::JsValue values[] = {cache.get(js, JSRPC_STR)};
205+
return js.obj(kj::ArrayPtr<kj::StringPtr>(keys), kj::ArrayPtr<jsg::JsValue>(values));
207206
}
208207

209208
jsg::JsValue ToJs(jsg::Lock& js, const tracing::ScheduledEventInfo& info, StringCache& cache) {
@@ -230,20 +229,17 @@ jsg::JsValue ToJs(jsg::Lock& js, const tracing::AlarmEventInfo& info, StringCach
230229
}
231230

232231
jsg::JsValue ToJs(jsg::Lock& js, const tracing::QueueEventInfo& info, StringCache& cache) {
233-
auto obj = js.obj();
234-
obj.set(js, TYPE_STR, cache.get(js, QUEUE_STR));
235-
obj.set(js, QUEUENAME_STR, js.str(info.queueName));
236-
obj.set(js, BATCHSIZE_STR, js.num(info.batchSize));
237-
return obj;
232+
static kj::StringPtr keys[] = {TYPE_STR, QUEUENAME_STR, BATCHSIZE_STR};
233+
jsg::JsValue values[] = {
234+
cache.get(js, QUEUE_STR), js.str(info.queueName), js.num(info.batchSize)};
235+
return js.obj(kj::ArrayPtr<kj::StringPtr>(keys), kj::ArrayPtr<jsg::JsValue>(values));
238236
}
239237

240238
jsg::JsValue ToJs(jsg::Lock& js, const tracing::EmailEventInfo& info, StringCache& cache) {
241-
auto obj = js.obj();
242-
obj.set(js, TYPE_STR, cache.get(js, EMAIL_STR));
243-
obj.set(js, MAILFROM_STR, js.str(info.mailFrom));
244-
obj.set(js, RCPTTO_STR, js.str(info.rcptTo));
245-
obj.set(js, RAWSIZE_STR, js.num(info.rawSize));
246-
return obj;
239+
static kj::StringPtr keys[] = {TYPE_STR, MAILFROM_STR, RCPTTO_STR, RAWSIZE_STR};
240+
jsg::JsValue values[] = {
241+
cache.get(js, EMAIL_STR), js.str(info.mailFrom), js.str(info.rcptTo), js.num(info.rawSize)};
242+
return js.obj(kj::ArrayPtr<kj::StringPtr>(keys), kj::ArrayPtr<jsg::JsValue>(values));
247243
}
248244

249245
jsg::JsValue ToJs(jsg::Lock& js, const tracing::TraceEventInfo& info, StringCache& cache) {

src/workerd/jsg/jsg.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2714,6 +2714,8 @@ class Lock {
27142714
JsObject obj(
27152715
kj::ArrayPtr<kj::StringPtr> keys, kj::ArrayPtr<jsg::JsValue> values) KJ_WARN_UNUSED_RESULT;
27162716
JsObject objNoProto() KJ_WARN_UNUSED_RESULT;
2717+
JsObject objNoProto(
2718+
kj::ArrayPtr<kj::StringPtr> keys, kj::ArrayPtr<jsg::JsValue> values) KJ_WARN_UNUSED_RESULT;
27172719
JsMap map() KJ_WARN_UNUSED_RESULT;
27182720
JsValue external(void*) KJ_WARN_UNUSED_RESULT;
27192721
JsValue error(kj::StringPtr message) KJ_WARN_UNUSED_RESULT;

src/workerd/jsg/jsvalue.c++

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -536,16 +536,23 @@ JsObject Lock::obj() {
536536

537537
JsObject Lock::obj(kj::ArrayPtr<kj::StringPtr> keys, kj::ArrayPtr<JsValue> values) {
538538
KJ_DASSERT(keys.size() == values.size());
539-
v8::LocalVector<v8::Name> keys_(v8Isolate);
540-
v8::LocalVector<v8::Value> values_(v8Isolate);
541-
keys_.reserve(keys.size());
542-
values_.reserve(keys.size());
543-
for (auto& k: keys) {
544-
v8::Local<v8::String> key = str(k);
545-
keys_.push_back(key);
539+
v8::LocalVector<v8::Name> keys_(v8Isolate, keys.size());
540+
v8::LocalVector<v8::Value> values_(v8Isolate, keys.size());
541+
for (size_t i = 0; i < keys.size(); i++) {
542+
keys_[i] = strIntern(keys[i]).inner;
543+
values_[i] = values[i];
546544
}
547-
for (auto& v: values) {
548-
values_.push_back(v);
545+
return JsObject(v8::Object::New(
546+
v8Isolate, v8::Object::New(v8Isolate), keys_.data(), values_.data(), keys.size()));
547+
}
548+
549+
JsObject Lock::objNoProto(kj::ArrayPtr<kj::StringPtr> keys, kj::ArrayPtr<JsValue> values) {
550+
KJ_DASSERT(keys.size() == values.size());
551+
v8::LocalVector<v8::Name> keys_(v8Isolate, keys.size());
552+
v8::LocalVector<v8::Value> values_(v8Isolate, keys.size());
553+
for (size_t i = 0; i < keys.size(); i++) {
554+
keys_[i] = strIntern(keys[i]).inner;
555+
values_[i] = values[i];
549556
}
550557
return JsObject(
551558
v8::Object::New(v8Isolate, v8::Null(v8Isolate), keys_.data(), values_.data(), keys.size()));

0 commit comments

Comments
 (0)