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
}
/// 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 cache;
pub use cache::intern::intern;
pub use cache::intern::{intern, unintern};
}
/// Representation of an object owned by JS.

View File

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