Skip to content

Commit 9214ab3

Browse files
committed
util: change implementation to not use buffers
1 parent 472ec5a commit 9214ab3

File tree

1 file changed

+19
-24
lines changed

1 file changed

+19
-24
lines changed

src/node_i18n.cc

+19-24
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ using v8::NewStringType;
9797
using v8::Object;
9898
using v8::ObjectTemplate;
9999
using v8::String;
100-
using v8::Uint8Array;
101100
using v8::Value;
102101

103102
namespace i18n {
@@ -446,7 +445,6 @@ void ConverterObject::Decode(const FunctionCallbackInfo<Value>& args) {
446445

447446
UErrorCode status = U_ZERO_ERROR;
448447
MaybeStackBuffer<UChar> result;
449-
MaybeLocal<Object> ret;
450448

451449
UBool flush = (flags & CONVERTER_FLAGS_FLUSH) == CONVERTER_FLAGS_FLUSH;
452450

@@ -502,31 +500,28 @@ void ConverterObject::Decode(const FunctionCallbackInfo<Value>& args) {
502500
converter->set_bom_seen(true);
503501
}
504502
}
505-
ret = ToBufferEndian(env, &result);
506503

507-
if (!ret.IsEmpty()) {
508-
CHECK(ret.ToLocalChecked()->IsUint8Array());
509-
510-
if (omit_initial_bom) {
511-
// Perform `ret = ret.slice(2)`.
512-
Local<Uint8Array> orig_ret = ret.ToLocalChecked().As<Uint8Array>();
513-
ret = Buffer::New(env,
514-
orig_ret->Buffer(),
515-
orig_ret->ByteOffset() + 2,
516-
orig_ret->ByteLength() - 2)
517-
.FromMaybe(Local<Uint8Array>());
518-
}
504+
Local<Value> error;
505+
char16_t* output = result.out();
506+
size_t beginning = 0;
507+
size_t length = 0;
519508

520-
Local<Value> error;
521-
ArrayBufferViewContents<char> buf(ret.ToLocalChecked());
522-
MaybeLocal<Value> encoded = StringBytes::Encode(
523-
env->isolate(), buf.data(), buf.length(), encoding::UCS2, &error);
509+
for (size_t i = 0; i < result.length(); i++) length += sizeof(output[i]);
524510

525-
if (!encoded.IsEmpty()) {
526-
args.GetReturnValue().Set(encoded.ToLocalChecked());
527-
} else {
528-
args.GetReturnValue().Set(error);
529-
}
511+
if (omit_initial_bom) {
512+
// Perform `ret = ret.slice(2)`.
513+
beginning += 2;
514+
length -= 2;
515+
}
516+
517+
const char* value = reinterpret_cast<const char*>(output) + beginning;
518+
MaybeLocal<Value> encoded =
519+
StringBytes::Encode(env->isolate(), value, length, UCS2, &error);
520+
521+
if (!encoded.IsEmpty()) {
522+
args.GetReturnValue().Set(encoded.ToLocalChecked());
523+
} else {
524+
args.GetReturnValue().Set(error);
530525
}
531526

532527
return;

0 commit comments

Comments
 (0)