summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@gmail.com>2021-10-01 20:25:33 +0200
committerGitHub <noreply@github.com>2021-10-01 20:25:33 +0200
commit26de5165589ea10567d59ce7f630ec521cce6083 (patch)
tree66961c42cfa5a1659efc5bcd8e0d3aa88a6f6720
parent1dfa35b2ba1dadf0158a00b72e98d83cd3e69ee5 (diff)
feat(core): implement Deno.core.isProxy() (#12288)
-rw-r--r--core/bindings.rs12
-rw-r--r--core/runtime.rs21
2 files changed, 33 insertions, 0 deletions
diff --git a/core/bindings.rs b/core/bindings.rs
index 3bff22e50..aff632161 100644
--- a/core/bindings.rs
+++ b/core/bindings.rs
@@ -64,6 +64,9 @@ lazy_static::lazy_static! {
function: get_proxy_details.map_fn_to()
},
v8::ExternalReference {
+ function: is_proxy.map_fn_to()
+ },
+ v8::ExternalReference {
function: memory_usage.map_fn_to(),
},
v8::ExternalReference {
@@ -146,6 +149,7 @@ pub fn initialize_context<'s>(
set_func(scope, core_val, "deserialize", deserialize);
set_func(scope, core_val, "getPromiseDetails", get_promise_details);
set_func(scope, core_val, "getProxyDetails", get_proxy_details);
+ set_func(scope, core_val, "isProxy", is_proxy);
set_func(scope, core_val, "memoryUsage", memory_usage);
set_func(scope, core_val, "callConsole", call_console);
set_func(scope, core_val, "createHostObject", create_host_object);
@@ -1119,6 +1123,14 @@ fn get_proxy_details(
rv.set(to_v8(scope, p).unwrap());
}
+fn is_proxy(
+ scope: &mut v8::HandleScope,
+ args: v8::FunctionCallbackArguments,
+ mut rv: v8::ReturnValue,
+) {
+ rv.set(v8::Boolean::new(scope, args.get(0).is_proxy()).into())
+}
+
fn throw_type_error(scope: &mut v8::HandleScope, message: impl AsRef<str>) {
let message = v8::String::new(scope, message.as_ref()).unwrap();
let exception = v8::Exception::type_error(scope, message);
diff --git a/core/runtime.rs b/core/runtime.rs
index ffd8e49c5..3943415f8 100644
--- a/core/runtime.rs
+++ b/core/runtime.rs
@@ -2273,4 +2273,25 @@ assertEquals(1, notify_return_value);
let mut runtime = JsRuntime::new(options);
runtime.execute_script("<none>", "").unwrap();
}
+
+ #[test]
+ fn test_is_proxy() {
+ let mut runtime = JsRuntime::new(RuntimeOptions::default());
+ let all_true: v8::Global<v8::Value> = runtime
+ .execute_script(
+ "is_proxy.js",
+ r#"
+ (function () {
+ const { isProxy } = Deno.core;
+ const o = { a: 1, b: 2};
+ const p = new Proxy(o, {});
+ return isProxy(p) && !isProxy(o) && !isProxy(42);
+ })()
+ "#,
+ )
+ .unwrap();
+ let mut scope = runtime.handle_scope();
+ let all_true = v8::Local::<v8::Value>::new(&mut scope, &all_true);
+ assert!(all_true.is_true());
+ }
}