@@ -97,7 +97,6 @@ using v8::NewStringType;
97
97
using v8::Object;
98
98
using v8::ObjectTemplate;
99
99
using v8::String;
100
- using v8::Uint8Array;
101
100
using v8::Value;
102
101
103
102
namespace i18n {
@@ -446,7 +445,6 @@ void ConverterObject::Decode(const FunctionCallbackInfo<Value>& args) {
446
445
447
446
UErrorCode status = U_ZERO_ERROR;
448
447
MaybeStackBuffer<UChar> result;
449
- MaybeLocal<Object> ret;
450
448
451
449
UBool flush = (flags & CONVERTER_FLAGS_FLUSH) == CONVERTER_FLAGS_FLUSH;
452
450
@@ -502,31 +500,28 @@ void ConverterObject::Decode(const FunctionCallbackInfo<Value>& args) {
502
500
converter->set_bom_seen (true );
503
501
}
504
502
}
505
- ret = ToBufferEndian (env, &result);
506
503
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 ;
519
508
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]);
524
510
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);
530
525
}
531
526
532
527
return ;
0 commit comments