|
50 | 50 | #include "node_buffer.h"
|
51 | 51 | #include "node_errors.h"
|
52 | 52 | #include "node_internals.h"
|
| 53 | +#include "string_bytes.h" |
53 | 54 | #include "util-inl.h"
|
54 | 55 | #include "v8.h"
|
55 | 56 |
|
@@ -502,18 +503,32 @@ void ConverterObject::Decode(const FunctionCallbackInfo<Value>& args) {
|
502 | 503 | }
|
503 | 504 | }
|
504 | 505 | ret = ToBufferEndian(env, &result);
|
505 |
| - if (omit_initial_bom && !ret.IsEmpty()) { |
506 |
| - // Perform `ret = ret.slice(2)`. |
| 506 | + |
| 507 | + if (!ret.IsEmpty()) { |
507 | 508 | 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) |
513 |
| - .FromMaybe(Local<Uint8Array>()); |
| 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 | + } |
| 519 | + |
| 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); |
| 524 | + |
| 525 | + if (!encoded.IsEmpty()) { |
| 526 | + args.GetReturnValue().Set(encoded.ToLocalChecked()); |
| 527 | + } else { |
| 528 | + args.GetReturnValue().Set(error); |
| 529 | + } |
514 | 530 | }
|
515 |
| - if (!ret.IsEmpty()) |
516 |
| - args.GetReturnValue().Set(ret.ToLocalChecked()); |
| 531 | + |
517 | 532 | return;
|
518 | 533 | }
|
519 | 534 |
|
|
0 commit comments