Skip to content

Commit 37b4a82

Browse files
addaleaxjuanarbol
authored andcommitted
src: use Utf8Value and TwoByteValue instead of V8 helpers
Our own helper classes have the advantage of using stack storage a lot of the time, so they should always be preferred. PR-URL: #60244 Reviewed-By: Chengzhong Wu <[email protected]> Reviewed-By: Rafael Gonzaga <[email protected]> Reviewed-By: Edy Silva <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Ilyas Shabi <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Vladimir Morozov <[email protected]>
1 parent 767a574 commit 37b4a82

12 files changed

Lines changed: 73 additions & 61 deletions

src/api/async_resource.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ AsyncResource::AsyncResource(Isolate* isolate,
1616
Local<Object> resource,
1717
const char* name,
1818
async_id trigger_async_id)
19+
: AsyncResource(
20+
isolate, resource, std::string_view(name), trigger_async_id) {}
21+
22+
AsyncResource::AsyncResource(Isolate* isolate,
23+
Local<Object> resource,
24+
std::string_view name,
25+
async_id trigger_async_id)
1926
: env_(Environment::GetCurrent(isolate)),
2027
resource_(isolate, resource) {
2128
CHECK_NOT_NULL(env_);

src/api/hooks.cc

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,18 @@ async_context EmitAsyncInit(Isolate* isolate,
213213
Local<Object> resource,
214214
const char* name,
215215
async_id trigger_async_id) {
216+
return EmitAsyncInit(
217+
isolate, resource, std::string_view(name), trigger_async_id);
218+
}
219+
220+
async_context EmitAsyncInit(Isolate* isolate,
221+
Local<Object> resource,
222+
std::string_view name,
223+
async_id trigger_async_id) {
216224
HandleScope handle_scope(isolate);
217225
Local<String> type =
218-
String::NewFromUtf8(isolate, name, NewStringType::kInternalized)
226+
String::NewFromUtf8(
227+
isolate, name.data(), NewStringType::kInternalized, name.size())
219228
.ToLocalChecked();
220229
return EmitAsyncInit(isolate, resource, type, trigger_async_id);
221230
}

src/inspector_js_api.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,8 @@ static void AsyncTaskScheduledWrapper(const FunctionCallbackInfo<Value>& args) {
240240

241241
CHECK(args[0]->IsString());
242242
Local<String> task_name = args[0].As<String>();
243-
String::Value task_name_value(args.GetIsolate(), task_name);
244-
StringView task_name_view(*task_name_value, task_name_value.length());
243+
TwoByteValue task_name_value(args.GetIsolate(), task_name);
244+
StringView task_name_view(task_name_value.out(), task_name_value.length());
245245

246246
CHECK(args[1]->IsNumber());
247247
int64_t task_id;

src/node.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,6 +1422,10 @@ NODE_EXTERN async_context EmitAsyncInit(v8::Isolate* isolate,
14221422
v8::Local<v8::Object> resource,
14231423
const char* name,
14241424
async_id trigger_async_id = -1);
1425+
NODE_EXTERN async_context EmitAsyncInit(v8::Isolate* isolate,
1426+
v8::Local<v8::Object> resource,
1427+
std::string_view name,
1428+
async_id trigger_async_id = -1);
14251429

14261430
NODE_EXTERN async_context EmitAsyncInit(v8::Isolate* isolate,
14271431
v8::Local<v8::Object> resource,
@@ -1517,6 +1521,10 @@ class NODE_EXTERN AsyncResource {
15171521
v8::Local<v8::Object> resource,
15181522
const char* name,
15191523
async_id trigger_async_id = -1);
1524+
AsyncResource(v8::Isolate* isolate,
1525+
v8::Local<v8::Object> resource,
1526+
std::string_view name,
1527+
async_id trigger_async_id = -1);
15201528

15211529
virtual ~AsyncResource();
15221530

src/node_api.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ class ThreadSafeFunction : public node::AsyncResource {
214214
napi_threadsafe_function_call_js call_js_cb_)
215215
: AsyncResource(env_->isolate,
216216
resource,
217-
*v8::String::Utf8Value(env_->isolate, name)),
217+
node::Utf8Value(env_->isolate, name).ToStringView()),
218218
thread_count(thread_count_),
219219
is_closing(false),
220220
dispatch_state(kDispatchIdle),
@@ -1178,7 +1178,7 @@ class Work : public node::AsyncResource, public node::ThreadPoolWork {
11781178
: AsyncResource(
11791179
env->isolate,
11801180
async_resource,
1181-
*v8::String::Utf8Value(env->isolate, async_resource_name)),
1181+
node::Utf8Value(env->isolate, async_resource_name).ToStringView()),
11821182
ThreadPoolWork(env->node_env(), "node_api"),
11831183
_env(env),
11841184
_data(data),

src/node_buffer.cc

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -971,10 +971,7 @@ void IndexOfString(const FunctionCallbackInfo<Value>& args) {
971971
size_t result = haystack_length;
972972

973973
if (enc == UCS2) {
974-
String::Value needle_value(isolate, needle);
975-
if (*needle_value == nullptr)
976-
return args.GetReturnValue().Set(-1);
977-
974+
TwoByteValue needle_value(isolate, needle);
978975
if (haystack_length < 2 || needle_value.length() < 1) {
979976
return args.GetReturnValue().Set(-1);
980977
}
@@ -995,27 +992,27 @@ void IndexOfString(const FunctionCallbackInfo<Value>& args) {
995992
offset / 2,
996993
is_forward);
997994
} else {
998-
result =
999-
nbytes::SearchString(reinterpret_cast<const uint16_t*>(haystack),
1000-
haystack_length / 2,
1001-
reinterpret_cast<const uint16_t*>(*needle_value),
1002-
needle_value.length(),
1003-
offset / 2,
1004-
is_forward);
995+
result = nbytes::SearchString(reinterpret_cast<const uint16_t*>(haystack),
996+
haystack_length / 2,
997+
needle_value.out(),
998+
needle_value.length(),
999+
offset / 2,
1000+
is_forward);
10051001
}
10061002
result *= 2;
10071003
} else if (enc == UTF8) {
1008-
String::Utf8Value needle_value(isolate, needle);
1004+
Utf8Value needle_value(isolate, needle);
10091005
if (*needle_value == nullptr)
10101006
return args.GetReturnValue().Set(-1);
1011-
1012-
result =
1013-
nbytes::SearchString(reinterpret_cast<const uint8_t*>(haystack),
1014-
haystack_length,
1015-
reinterpret_cast<const uint8_t*>(*needle_value),
1016-
needle_length,
1017-
offset,
1018-
is_forward);
1007+
CHECK_GE(needle_length, needle_value.length());
1008+
1009+
result = nbytes::SearchString(
1010+
reinterpret_cast<const uint8_t*>(haystack),
1011+
haystack_length,
1012+
reinterpret_cast<const uint8_t*>(needle_value.out()),
1013+
needle_length,
1014+
offset,
1015+
is_forward);
10191016
} else if (enc == LATIN1) {
10201017
uint8_t* needle_data = node::UncheckedMalloc<uint8_t>(needle_length);
10211018
if (needle_data == nullptr) {
@@ -1261,10 +1258,10 @@ static void Btoa(const FunctionCallbackInfo<Value>& args) {
12611258
input->Length(),
12621259
buffer.out());
12631260
} else {
1264-
String::Value value(env->isolate(), input);
1261+
TwoByteValue value(env->isolate(), input);
12651262
MaybeStackBuffer<char> stack_buf(value.length());
12661263
size_t out_len = simdutf::convert_utf16_to_latin1(
1267-
reinterpret_cast<const char16_t*>(*value),
1264+
reinterpret_cast<const char16_t*>(value.out()),
12681265
value.length(),
12691266
stack_buf.out());
12701267
if (out_len == 0) { // error
@@ -1318,8 +1315,8 @@ static void Atob(const FunctionCallbackInfo<Value>& args) {
13181315
buffer.SetLength(expected_length);
13191316
result = simdutf::base64_to_binary(data, input->Length(), buffer.out());
13201317
} else { // 16-bit case
1321-
String::Value value(env->isolate(), input);
1322-
auto data = reinterpret_cast<const char16_t*>(*value);
1318+
TwoByteValue value(env->isolate(), input);
1319+
auto data = reinterpret_cast<const char16_t*>(value.out());
13231320
size_t expected_length =
13241321
simdutf::maximal_binary_length_from_base64(data, value.length());
13251322
buffer.AllocateSufficientStorage(expected_length);

src/node_errors.cc

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,15 +1061,14 @@ void PerIsolateMessageListener(Local<Message> message, Local<Value> error) {
10611061
break;
10621062
}
10631063
Utf8Value filename(isolate, message->GetScriptOrigin().ResourceName());
1064+
Utf8Value msg(isolate, message->Get());
10641065
// (filename):(line) (message)
1065-
std::stringstream warning;
1066-
warning << *filename;
1067-
warning << ":";
1068-
warning << message->GetLineNumber(env->context()).FromMaybe(-1);
1069-
warning << " ";
1070-
v8::String::Utf8Value msg(isolate, message->Get());
1071-
warning << *msg;
1072-
USE(ProcessEmitWarningGeneric(env, warning.str().c_str(), "V8"));
1066+
std::string warning =
1067+
SPrintF("%s:%s %s",
1068+
filename,
1069+
message->GetLineNumber(env->context()).FromMaybe(-1),
1070+
msg);
1071+
USE(ProcessEmitWarningGeneric(env, warning, "V8"));
10731072
break;
10741073
}
10751074
case Isolate::MessageErrorLevel::kMessageError:

src/node_report.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -450,8 +450,7 @@ static Maybe<std::string> ErrorToString(Isolate* isolate,
450450
if (!maybe_str.ToLocal(&js_str)) {
451451
return Nothing<std::string>();
452452
}
453-
String::Utf8Value sv(isolate, js_str);
454-
return Just<>(std::string(*sv, sv.length()));
453+
return Just(Utf8Value(isolate, js_str).ToString());
455454
}
456455

457456
static void PrintEmptyJavaScriptStack(JSONWriter* writer) {

src/node_sqlite.cc

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,8 +1458,7 @@ void DatabaseSync::CreateSession(const FunctionCallbackInfo<Value>& args) {
14581458
}
14591459

14601460
if (table_value->IsString()) {
1461-
String::Utf8Value str(env->isolate(), table_value);
1462-
table = *str;
1461+
table = Utf8Value(env->isolate(), table_value).ToString();
14631462
} else {
14641463
THROW_ERR_INVALID_ARG_TYPE(
14651464
env->isolate(), "The \"options.table\" argument must be a string.");
@@ -1479,8 +1478,7 @@ void DatabaseSync::CreateSession(const FunctionCallbackInfo<Value>& args) {
14791478
return;
14801479
}
14811480
if (db_value->IsString()) {
1482-
String::Utf8Value str(env->isolate(), db_value);
1483-
db_name = std::string(*str);
1481+
db_name = Utf8Value(env->isolate(), db_value).ToString();
14841482
} else {
14851483
THROW_ERR_INVALID_ARG_TYPE(
14861484
env->isolate(), "The \"options.db\" argument must be a string.");

src/node_v8.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,8 @@ void UpdateHeapCodeStatisticsBuffer(const FunctionCallbackInfo<Value>& args) {
236236

237237
void SetFlagsFromString(const FunctionCallbackInfo<Value>& args) {
238238
CHECK(args[0]->IsString());
239-
String::Utf8Value flags(args.GetIsolate(), args[0]);
240-
V8::SetFlagsFromString(*flags, static_cast<size_t>(flags.length()));
239+
Utf8Value flags(args.GetIsolate(), args[0]);
240+
V8::SetFlagsFromString(flags.out(), flags.length());
241241
}
242242

243243
static void IsStringOneByteRepresentation(

0 commit comments

Comments
 (0)