diff options
author | Camelid <camelidcamel@gmail.com> | 2020-07-14 20:32:37 -0700 |
---|---|---|
committer | Camelid <camelidcamel@gmail.com> | 2020-07-14 20:34:01 -0700 |
commit | 69881e8b062f55b40ee0bb587b7478e46fc18674 (patch) | |
tree | df127ea3d85f1336b89933541d7505605554e879 /components/script/dom/htmlscriptelement.rs | |
parent | 12d4c0d5eb029044b347765910a57236343641d7 (diff) | |
download | servo-69881e8b062f55b40ee0bb587b7478e46fc18674.tar.gz servo-69881e8b062f55b40ee0bb587b7478e46fc18674.zip |
Use `Rc` instead of cloning the `DOMString`
Specifically, I changed the `text` field of `ScriptOrigin` from a
`DOMString` to an `Rc<DOMString>`. Then I updated all the related code
to work with an `Rc`.
This is just a first pass to get the code to compile. There are probably
more things I can do that will improve the code and further reduce
cloning.
Diffstat (limited to 'components/script/dom/htmlscriptelement.rs')
-rw-r--r-- | components/script/dom/htmlscriptelement.rs | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index fb5bca5fb2c..ce6120b5b0e 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -49,6 +49,7 @@ use std::fs::{create_dir_all, read_to_string, File}; use std::io::{Read, Seek, Write}; use std::path::PathBuf; use std::process::Command; +use std::rc::Rc; use std::sync::{Arc, Mutex}; use style::str::{StaticStringVec, HTML_SPACE_CHARACTERS}; use uuid::Uuid; @@ -150,14 +151,15 @@ pub enum ScriptType { #[derive(JSTraceable, MallocSizeOf)] pub struct ScriptOrigin { - text: DOMString, + #[ignore_malloc_size_of = "Rc is hard"] + text: Rc<DOMString>, url: ServoUrl, external: bool, type_: ScriptType, } impl ScriptOrigin { - pub fn internal(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { + pub fn internal(text: Rc<DOMString>, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { ScriptOrigin { text: text, url: url, @@ -166,7 +168,7 @@ impl ScriptOrigin { } } - pub fn external(text: DOMString, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { + pub fn external(text: Rc<DOMString>, url: ServoUrl, type_: ScriptType) -> ScriptOrigin { ScriptOrigin { text: text, url: url, @@ -175,8 +177,8 @@ impl ScriptOrigin { } } - pub fn text(&self) -> DOMString { - self.text.clone() + pub fn text(&self) -> Rc<DOMString> { + Rc::clone(&self.text) } } @@ -257,7 +259,7 @@ impl FetchResponseListener for ClassicContext { // Step 7. let (source_text, _, _) = encoding.decode(&self.data); ScriptOrigin::external( - DOMString::from(source_text), + Rc::new(DOMString::from(source_text)), metadata.final_url, ScriptType::Classic, ) @@ -613,7 +615,7 @@ impl HTMLScriptElement { // Step 25-1. & 25-2. let result = Ok(ScriptOrigin::internal( - text.clone(), + Rc::new(text.clone()), base_url.clone(), script_type.clone(), )); @@ -647,7 +649,7 @@ impl HTMLScriptElement { fetch_inline_module_script( ModuleOwner::Window(Trusted::new(self)), - text.clone(), + Rc::new(text.clone()), base_url.clone(), self.id.clone(), credentials_mode.unwrap(), @@ -679,7 +681,7 @@ impl HTMLScriptElement { let mut script_content = String::new(); output.seek(std::io::SeekFrom::Start(0)).unwrap(); output.read_to_string(&mut script_content).unwrap(); - script.text = DOMString::from(script_content); + script.text = Rc::new(DOMString::from(script_content)); }, _ => { warn!("Failed to execute js-beautify. Will store unmodified script"); @@ -757,7 +759,7 @@ impl HTMLScriptElement { match read_to_string(path.clone()) { Ok(local_script) => { debug!("Found script stored at: {:?}", path); - script.text = DOMString::from(local_script); + script.text = Rc::new(DOMString::from(local_script)); }, Err(why) => warn!("Could not restore script from file {:?}", why), } |