|
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