@@ -419,11 +419,14 @@ bool Blob::text(JSContext *cx, HandleObject self, MutableHandleValue rval) {
419419 auto encoding = const_cast <jsencoding::Encoding *>(jsencoding::encoding_for_label_no_replacement (
420420 reinterpret_cast <uint8_t *>(const_cast <char *>(" UTF-8" )), 5 ));
421421
422- auto decoder = jsencoding::encoding_new_decoder_with_bom_removal (encoding);
422+ auto deleter = [&](jsencoding::Decoder *dec) { jsencoding::decoder_free (dec); };
423+ std::unique_ptr<jsencoding::Decoder, decltype (deleter)> decoder (
424+ jsencoding::encoding_new_decoder_with_bom_removal (encoding), deleter);
425+
423426 MOZ_ASSERT (decoder);
424427
425428 auto src_len = src->length ();
426- auto dst_len = jsencoding::decoder_max_utf16_buffer_length (decoder, src_len);
429+ auto dst_len = jsencoding::decoder_max_utf16_buffer_length (decoder. get () , src_len);
427430
428431 JS::UniqueTwoByteChars dst (new char16_t [dst_len + 1 ]);
429432 if (!dst) {
@@ -434,8 +437,8 @@ bool Blob::text(JSContext *cx, HandleObject self, MutableHandleValue rval) {
434437 bool had_replacements;
435438 auto dst_data = reinterpret_cast <uint16_t *>(dst.get ());
436439
437- jsencoding::decoder_decode_to_utf16 (decoder, src->begin (), &src_len, dst_data, &dst_len, true ,
438- &had_replacements);
440+ jsencoding::decoder_decode_to_utf16 (decoder. get () , src->begin (), &src_len, dst_data, &dst_len,
441+ true , &had_replacements);
439442
440443 JS::RootedString str (cx, JS_NewUCString (cx, std::move (dst), dst_len));
441444 if (!str) {
0 commit comments