Adding in unintern function (#1828)

* Adding in unintern function

* Adding in some basic unit tests for interning and uninterning
This commit is contained in:
Pauan 2019-10-23 00:23:30 +02:00 committed by Alex Crichton
parent 777a12dc70
commit c1b4f67444
3 changed files with 26 additions and 2 deletions

21
src/cache/intern.rs vendored
View File

@ -40,6 +40,14 @@ cfg_if! {
} }
}) })
} }
fn unintern_str(key: &str) {
CACHE.with(|cache| {
let mut cache = cache.entries.borrow_mut();
cache.remove(key);
})
}
} }
} }
@ -80,3 +88,16 @@ pub fn intern(s: &str) -> &str {
s s
} }
/// Removes a Rust string from the intern cache.
///
/// This does the opposite of the [`intern`](fn.intern.html) function.
///
/// If the [`intern`](fn.intern.html) function is called again then it will re-intern the string.
#[allow(unused_variables)]
#[inline]
pub fn unintern(s: &str) {
#[cfg(feature = "enable-interning")]
unintern_str(s);
}

View File

@ -70,7 +70,7 @@ if_std! {
mod anyref; mod anyref;
mod cache; mod cache;
pub use cache::intern::intern; pub use cache::intern::{intern, unintern};
} }
/// Representation of an object owned by JS. /// Representation of an object owned by JS.

View File

@ -1,5 +1,5 @@
use wasm_bindgen::prelude::*; use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast; use wasm_bindgen::{JsCast, intern, unintern};
use wasm_bindgen_test::*; use wasm_bindgen_test::*;
#[wasm_bindgen(module = "tests/wasm/simple.js")] #[wasm_bindgen(module = "tests/wasm/simple.js")]
@ -157,6 +157,9 @@ fn binding_to_unimplemented_apis_doesnt_break_everything() {
fn optional_slices() { fn optional_slices() {
optional_str_none(None); optional_str_none(None);
optional_str_some(Some("x")); optional_str_some(Some("x"));
optional_str_some(Some(intern("x")));
unintern("x");
optional_str_some(Some("x"));
optional_slice_none(None); optional_slice_none(None);
optional_slice_some(Some(&[1, 2, 3])); optional_slice_some(Some(&[1, 2, 3]));
optional_string_none(None); optional_string_none(None);