diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2024-08-06 00:40:17 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-06 07:40:17 +0000 |
commit | 696d528641ed6e03cf64daaee48bcc7c3fc8b89f (patch) | |
tree | a4d41276bdbeca39027588a9ec8e2719487c28b5 /ext/web | |
parent | ba40347a35d10cffeae83ee95f69f7bc281096dd (diff) |
fix(ext/web): make TextDecoderResource use cppgc (#24888)
Fixes https://github.com/denoland/deno/issues/24878
Diffstat (limited to 'ext/web')
-rw-r--r-- | ext/web/08_text_encoding.js | 17 | ||||
-rw-r--r-- | ext/web/lib.rs | 27 |
2 files changed, 15 insertions, 29 deletions
diff --git a/ext/web/08_text_encoding.js b/ext/web/08_text_encoding.js index 9920a81f8..3163c9628 100644 --- a/ext/web/08_text_encoding.js +++ b/ext/web/08_text_encoding.js @@ -56,8 +56,8 @@ class TextDecoder { /** @type {boolean} */ #utf8SinglePass; - /** @type {number | null} */ - #rid = null; + /** @type {object | null} */ + #handle = null; /** * @param {string} label @@ -159,7 +159,7 @@ class TextDecoder { } // Fast path for single pass encoding. - if (!stream && this.#rid === null) { + if (!stream && this.#handle === null) { // Fast path for utf8 single pass encoding. if (this.#utf8SinglePass) { return op_encoding_decode_utf8(input, this.#ignoreBOM); @@ -173,18 +173,17 @@ class TextDecoder { ); } - if (this.#rid === null) { - this.#rid = op_encoding_new_decoder( + if (this.#handle === null) { + this.#handle = op_encoding_new_decoder( this.#encoding, this.#fatal, this.#ignoreBOM, ); } - return op_encoding_decode(input, this.#rid, stream); + return op_encoding_decode(input, this.#handle, stream); } finally { - if (!stream && this.#rid !== null) { - core.close(this.#rid); - this.#rid = null; + if (!stream && this.#handle !== null) { + this.#handle = null; } } } diff --git a/ext/web/lib.rs b/ext/web/lib.rs index 89f1197e7..3977379a5 100644 --- a/ext/web/lib.rs +++ b/ext/web/lib.rs @@ -13,9 +13,6 @@ use deno_core::op2; use deno_core::url::Url; use deno_core::v8; use deno_core::ByteString; -use deno_core::OpState; -use deno_core::Resource; -use deno_core::ResourceId; use deno_core::ToJsBuffer; use deno_core::U16String; @@ -277,14 +274,13 @@ fn op_encoding_decode_single( } } -#[op2(fast)] -#[smi] +#[op2] +#[cppgc] fn op_encoding_new_decoder( - state: &mut OpState, #[string] label: &str, fatal: bool, ignore_bom: bool, -) -> Result<ResourceId, AnyError> { +) -> Result<TextDecoderResource, AnyError> { let encoding = Encoding::for_label(label.as_bytes()).ok_or_else(|| { range_error(format!( "The encoding label provided ('{label}') is invalid." @@ -297,24 +293,19 @@ fn op_encoding_new_decoder( encoding.new_decoder_with_bom_removal() }; - let rid = state.resource_table.add(TextDecoderResource { + Ok(TextDecoderResource { decoder: RefCell::new(decoder), fatal, - }); - - Ok(rid) + }) } #[op2] #[serde] fn op_encoding_decode( - state: &mut OpState, #[anybuffer] data: &[u8], - #[smi] rid: ResourceId, + #[cppgc] resource: &TextDecoderResource, stream: bool, ) -> Result<U16String, AnyError> { - let resource = state.resource_table.get::<TextDecoderResource>(rid)?; - let mut decoder = resource.decoder.borrow_mut(); let fatal = resource.fatal; @@ -357,11 +348,7 @@ struct TextDecoderResource { fatal: bool, } -impl Resource for TextDecoderResource { - fn name(&self) -> Cow<str> { - "textDecoder".into() - } -} +impl deno_core::GarbageCollected for TextDecoderResource {} #[op2(fast(op_encoding_encode_into_fast))] fn op_encoding_encode_into( |