Skip to content

Commit 257fece

Browse files
authored
Deallocate jsencoding::Decoder instances (#195)
Call jsencoding::decoder_free() for jsencoding::decoder instances
1 parent 008912b commit 257fece

File tree

3 files changed

+18
-5
lines changed

3 files changed

+18
-5
lines changed

builtins/web/blob.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

builtins/web/text-codec/text-decoder.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,15 @@ bool TextDecoder::init_class(JSContext *cx, JS::HandleObject global) {
247247
return init_class_impl(cx, global);
248248
}
249249

250+
void TextDecoder::finalize(JS::GCContext *gcx, JSObject *self) {
251+
auto decoder = reinterpret_cast<jsencoding::Decoder *>(
252+
JS::GetReservedSlot(self, static_cast<uint32_t>(TextDecoder::Slots::Decoder)).toPrivate());
253+
254+
if (decoder) {
255+
jsencoding::decoder_free(decoder);
256+
}
257+
}
258+
250259
} // namespace text_codec
251260
} // namespace web
252261
} // namespace builtins

builtins/web/text-codec/text-decoder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace builtins {
77
namespace web {
88
namespace text_codec {
99

10-
class TextDecoder final : public BuiltinImpl<TextDecoder> {
10+
class TextDecoder final : public FinalizableBuiltinImpl<TextDecoder> {
1111
static bool decode(JSContext *cx, unsigned argc, JS::Value *vp);
1212
static bool encoding_get(JSContext *cx, unsigned argc, JS::Value *vp);
1313
static bool fatal_get(JSContext *cx, unsigned argc, JS::Value *vp);
@@ -33,6 +33,7 @@ class TextDecoder final : public BuiltinImpl<TextDecoder> {
3333

3434
static bool init_class(JSContext *cx, JS::HandleObject global);
3535
static bool constructor(JSContext *cx, unsigned argc, JS::Value *vp);
36+
static void finalize(JS::GCContext *gcx, JSObject *self);
3637
};
3738

3839
} // namespace text_codec

0 commit comments

Comments
 (0)