Skip to content

Commit 8cb775f

Browse files
authored
Remove ValueView path in NativeString (#1281)
1 parent baef293 commit 8cb775f

4 files changed

Lines changed: 32 additions & 44 deletions

File tree

src/HttpRequestWrapper.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ struct HttpRequestWrapper {
7171
int index = args[0]->Uint32Value(isolate->GetCurrentContext()).ToChecked();
7272
parameter = req->getParameter(index);
7373
} else {
74-
NativeString<true> data(args.GetIsolate(), args[0]);
74+
NativeString data(args.GetIsolate(), args[0]);
7575
if (data.isInvalid(args)) {
7676
return;
7777
}
@@ -100,7 +100,7 @@ struct HttpRequestWrapper {
100100
Isolate *isolate = args.GetIsolate();
101101
auto *req = getHttpRequest<QUIC>(args);
102102
if (req) {
103-
NativeString<true> data(args.GetIsolate(), args[0]);
103+
NativeString data(args.GetIsolate(), args[0]);
104104
if (data.isInvalid(args)) {
105105
return;
106106
}
@@ -158,7 +158,7 @@ struct HttpRequestWrapper {
158158

159159
/* Do we have a key argument? */
160160
if (args.Length() == 1) {
161-
NativeString<true> keyString(isolate, args[0]);
161+
NativeString keyString(isolate, args[0]);
162162
if (keyString.isInvalid(args)) {
163163
return;
164164
}

src/HttpResponseWrapper.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ struct HttpResponseWrapper {
369369
static void res_writeStatus(const FunctionCallbackInfo<Value> &args) {
370370
auto *res = getHttpResponse<SSL>(args);
371371
if (res) {
372-
NativeString<true> data(args.GetIsolate(), args[0]);
372+
NativeString data(args.GetIsolate(), args[0]);
373373
if (data.isInvalid(args)) {
374374
return;
375375
}
@@ -409,7 +409,7 @@ struct HttpResponseWrapper {
409409
static void res_end(const FunctionCallbackInfo<Value> &args) {
410410
auto *res = getHttpResponse<PROTOCOL>(args);
411411
if (res) {
412-
NativeString<true> data(args.GetIsolate(), args[0]);
412+
NativeString data(args.GetIsolate(), args[0]);
413413
if (data.isInvalid(args)) {
414414
return;
415415
}
@@ -434,7 +434,7 @@ struct HttpResponseWrapper {
434434
Isolate *isolate = args.GetIsolate();
435435
auto *res = getHttpResponse<PROTOCOL>(args);
436436
if (res) {
437-
NativeString<true> data(args.GetIsolate(), args[0]);
437+
NativeString data(args.GetIsolate(), args[0]);
438438
if (data.isInvalid(args)) {
439439
return;
440440
}
@@ -467,7 +467,7 @@ struct HttpResponseWrapper {
467467
Isolate *isolate = args.GetIsolate();
468468
auto *res = getHttpResponse<PROTOCOL>(args);
469469
if (res) {
470-
NativeString<true> data(args.GetIsolate(), args[0]);
470+
NativeString data(args.GetIsolate(), args[0]);
471471
if (data.isInvalid(args)) {
472472
return;
473473
}
@@ -486,11 +486,11 @@ struct HttpResponseWrapper {
486486
if (res) {
487487
// Optimization: writeHeader never calls JS or allocated on the GC
488488
// use zero copy string view in best case
489-
NativeString<true> header(args.GetIsolate(), args[0]);
489+
NativeString header(args.GetIsolate(), args[0]);
490490
if (header.isInvalid(args)) {
491491
return;
492492
}
493-
NativeString<true> value(args.GetIsolate(), args[1]);
493+
NativeString value(args.GetIsolate(), args[1]);
494494
if (value.isInvalid(args)) {
495495
return;
496496
}

src/Utilities.h

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ struct Callback {
118118
}
119119
};
120120

121-
template <bool AllowStringView = false>
122121
class NativeString {
123122
char *data;
124123
size_t length;
@@ -138,53 +137,43 @@ class NativeString {
138137
if (pool_offset + size > pool.size()) {
139138
// Mark for external cleanup if using instance-based logic
140139
// (Note: In a pure static alloc, you'd need a way to track this)
141-
return (char*)std::malloc(size);
140+
return (char*) std::malloc(size);
142141
}
143142

144143
char* ptr = pool.data() + pool_offset;
145144
pool_offset += size;
145+
ref_count++;
146146
return ptr;
147147
}
148148

149149
// Provided for completeness, though the "pool" doesn't actually free individual slices
150150
static void free(char* ptr) {
151151
if (ptr < pool.data() || ptr >= pool.data() + pool.size()) {
152152
::free(ptr);
153+
} else if (--ref_count == 0) {
154+
// Reset the "stack" once no more reference
155+
pool_offset = 0;
153156
}
154157
}
155158

156159
public:
157160
NativeString(Isolate *isolate, const Local<Value> &value) {
158-
if (ref_count == 0) {
159-
pool_offset = 0; // Reset the "stack" when entering the first scope
160-
}
161-
ref_count++;
162-
163161
if (value->IsUndefined()) {
164162
data = nullptr;
165163
length = 0;
166164
} else if (value->IsString()) {
167165
Local<String> string = Local<String>::Cast(value);
168-
169-
#if NODE_MODULE_VERSION >= 137
170-
if constexpr (AllowStringView) {
171-
172-
String::ValueView strView(isolate, string);
173-
if (strView.is_one_byte()) {
174-
length = strView.length();
175-
data = (char *) strView.data8();
176-
177-
return;
178-
}
179-
}
166+
#if NODE_MODULE_VERSION >= 137 // node >= 24
167+
length = string->Utf8LengthV2(isolate);
168+
data = alloc(length);
169+
allocated = true;
170+
string->WriteUtf8V2(isolate, data, length);
171+
#else
172+
length = string->Utf8Length(isolate);
173+
data = alloc(length);
174+
allocated = true;
175+
string->WriteUtf8(isolate, data, length, nullptr, String::WriteOptions::NO_NULL_TERMINATION);
180176
#endif
181-
182-
// Fallback
183-
length = string->Utf8Length(isolate);
184-
data = alloc(length);
185-
allocated = true;
186-
string->WriteUtf8(isolate, data, length, nullptr, String::WriteOptions::NO_NULL_TERMINATION);
187-
188177
} else if (value->IsTypedArray()) {
189178
Local<ArrayBufferView> arrayBufferView = Local<ArrayBufferView>::Cast(value);
190179
auto contents = arrayBufferView->Buffer()->GetBackingStore();
@@ -217,7 +206,6 @@ class NativeString {
217206
}
218207

219208
~NativeString() {
220-
ref_count--;
221209
if (allocated) {
222210
free(data);
223211
}

src/WebSocketWrapper.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ struct WebSocketWrapper {
5252
Isolate *isolate = args.GetIsolate();
5353
auto *ws = getWebSocket<SSL>(args);
5454
if (ws) {
55-
NativeString<true> topic(isolate, args[0]);
55+
NativeString topic(isolate, args[0]);
5656
if (topic.isInvalid(args)) {
5757
return;
5858
}
@@ -67,7 +67,7 @@ struct WebSocketWrapper {
6767
Isolate *isolate = args.GetIsolate();
6868
auto *ws = getWebSocket<SSL>(args);
6969
if (ws) {
70-
NativeString<true> topic(isolate, args[0]);
70+
NativeString topic(isolate, args[0]);
7171
if (topic.isInvalid(args)) {
7272
return;
7373
}
@@ -89,11 +89,11 @@ struct WebSocketWrapper {
8989
bool isBinary = args[2]->BooleanValue(isolate);
9090
bool compress = args[3]->BooleanValue(isolate);
9191

92-
NativeString<true> topic(isolate, args[0]);
92+
NativeString topic(isolate, args[0]);
9393
if (topic.isInvalid(args)) {
9494
return;
9595
}
96-
NativeString<true> message(isolate, args[1]);
96+
NativeString message(isolate, args[1]);
9797
if (message.isInvalid(args)) {
9898
return;
9999
}
@@ -127,7 +127,7 @@ struct WebSocketWrapper {
127127
code = args[0]->Uint32Value(isolate->GetCurrentContext()).ToChecked();
128128
}
129129

130-
NativeString<true> message(args.GetIsolate(), args[1]);
130+
NativeString message(args.GetIsolate(), args[1]);
131131
if (message.isInvalid(args)) {
132132
return;
133133
}
@@ -244,7 +244,7 @@ struct WebSocketWrapper {
244244
bool isBinary = args[1]->BooleanValue(isolate);
245245
bool compress = args[2]->BooleanValue(isolate);
246246

247-
NativeString<true> message(args.GetIsolate(), args[0]);
247+
NativeString message(args.GetIsolate(), args[0]);
248248
if (message.isInvalid(args)) {
249249
return;
250250
}
@@ -261,7 +261,7 @@ struct WebSocketWrapper {
261261
Isolate *isolate = args.GetIsolate();
262262
auto *ws = getWebSocket<SSL>(args);
263263
if (ws) {
264-
NativeString<true> topic(args.GetIsolate(), args[0]);
264+
NativeString topic(args.GetIsolate(), args[0]);
265265
if (topic.isInvalid(args)) {
266266
return;
267267
}
@@ -278,7 +278,7 @@ struct WebSocketWrapper {
278278
Isolate *isolate = args.GetIsolate();
279279
auto *ws = getWebSocket<SSL>(args);
280280
if (ws) {
281-
NativeString<true> message(args.GetIsolate(), args[0]);
281+
NativeString message(args.GetIsolate(), args[0]);
282282
if (message.isInvalid(args)) {
283283
return;
284284
}

0 commit comments

Comments
 (0)