From 814f576b1dd3135a3a0e0284f629c93ba936cc0b Mon Sep 17 00:00:00 2001 From: Ingvar Stepanyan Date: Fri, 26 Apr 2019 17:42:23 +0100 Subject: [PATCH] Add bindings for `new Function(args, body)` We don't support variadic args in front, but, luckily for us, `new Function` accepts comma-separated args as a single string as well (see updated JSON test for an example). --- crates/js-sys/src/lib.rs | 11 +++++++++++ crates/js-sys/tests/wasm/JSON.rs | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/js-sys/src/lib.rs b/crates/js-sys/src/lib.rs index 952da3edc02..447f98fcc14 100644 --- a/crates/js-sys/src/lib.rs +++ b/crates/js-sys/src/lib.rs @@ -987,6 +987,17 @@ extern "C" { #[derive(Clone, Debug, PartialEq, Eq)] pub type Function; + /// The `Function` constructor creates a new `Function` object. Calling the + /// constructor directly can create functions dynamically, but suffers from + /// security and similar (but far less significant) performance issues + /// similar to `eval`. However, unlike `eval`, the `Function` constructor + /// allows executing code in the global scope, prompting better programming + /// habits and allowing for more efficient code minification. + /// + /// [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function) + #[wasm_bindgen(constructor)] + pub fn new_with_args(args: &str, body: &str) -> Function; + /// The `Function` constructor creates a new `Function` object. Calling the /// constructor directly can create functions dynamically, but suffers from /// security and similar (but far less significant) performance issues diff --git a/crates/js-sys/tests/wasm/JSON.rs b/crates/js-sys/tests/wasm/JSON.rs index aa9236db4de..9c9017b725d 100644 --- a/crates/js-sys/tests/wasm/JSON.rs +++ b/crates/js-sys/tests/wasm/JSON.rs @@ -101,7 +101,7 @@ fn stringify_with_replacer() { assert_eq!(output1, "{\"hello\":\"world\"}"); let replacer_func = - Function::new_no_args("return arguments[0] === 'hello' ? undefined : arguments[1]"); + Function::new_with_args("key, value", "return key === 'hello' ? undefined : value"); let output2: String = JSON::stringify_with_replacer(&JsValue::from(obj), &JsValue::from(replacer_func)) .unwrap() @@ -164,7 +164,7 @@ fn stringify_with_replacer_and_space() { assert_eq!(output2, "{\n \"hello\": \"world\"\n}"); let replacer_func = - Function::new_no_args("return arguments[0] === 'hello' ? undefined : arguments[1]"); + Function::new_with_args("key, value", "return key === 'hello' ? undefined : value"); let output3: String = JSON::stringify_with_replacer_and_space( &JsValue::from(obj), &JsValue::from(replacer_func),