|
50 | 50 | #include "node_buffer.h" |
51 | 51 | #include "node_errors.h" |
52 | 52 | #include "node_internals.h" |
| 53 | +#include "string_bytes.h" |
| 54 | +#include "string_decoder.h" |
53 | 55 | #include "util-inl.h" |
54 | 56 | #include "v8.h" |
55 | 57 |
|
@@ -502,18 +504,35 @@ void ConverterObject::Decode(const FunctionCallbackInfo<Value>& args) { |
502 | 504 | } |
503 | 505 | } |
504 | 506 | ret = ToBufferEndian(env, &result); |
505 | | - if (omit_initial_bom && !ret.IsEmpty()) { |
506 | | - // Perform `ret = ret.slice(2)`. |
| 507 | + |
| 508 | + if (!ret.IsEmpty()) { |
507 | 509 | CHECK(ret.ToLocalChecked()->IsUint8Array()); |
508 | | - Local<Uint8Array> orig_ret = ret.ToLocalChecked().As<Uint8Array>(); |
509 | | - ret = Buffer::New(env, |
510 | | - orig_ret->Buffer(), |
511 | | - orig_ret->ByteOffset() + 2, |
512 | | - orig_ret->ByteLength() - 2) |
| 510 | + |
| 511 | + if (omit_initial_bom) { |
| 512 | + // Perform `ret = ret.slice(2)`. |
| 513 | + Local<Uint8Array> orig_ret = ret.ToLocalChecked().As<Uint8Array>(); |
| 514 | + ret = Buffer::New(env, |
| 515 | + orig_ret->Buffer(), |
| 516 | + orig_ret->ByteOffset() + 2, |
| 517 | + orig_ret->ByteLength() - 2) |
513 | 518 | .FromMaybe(Local<Uint8Array>()); |
| 519 | + } |
| 520 | + |
| 521 | + Local<Value> error; |
| 522 | + ArrayBufferViewContents<char> buf(ret.ToLocalChecked()); |
| 523 | + MaybeLocal<Value> encoded = StringBytes::Encode(env->isolate(), |
| 524 | + buf.data(), |
| 525 | + buf.length(), |
| 526 | + encoding::UCS2, |
| 527 | + &error); |
| 528 | + |
| 529 | + if (!encoded.IsEmpty()) { |
| 530 | + args.GetReturnValue().Set(encoded.ToLocalChecked()); |
| 531 | + } else { |
| 532 | + args.GetReturnValue().Set(error); |
| 533 | + } |
514 | 534 | } |
515 | | - if (!ret.IsEmpty()) |
516 | | - args.GetReturnValue().Set(ret.ToLocalChecked()); |
| 535 | + |
517 | 536 | return; |
518 | 537 | } |
519 | 538 |
|
|
0 commit comments