diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2023-05-21 22:23:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-21 20:23:28 +0000 |
commit | 9ec49897766d9c22f6c7bafabdd3e3f3a4b68ab1 (patch) | |
tree | e618fc4b47a720ce2392794a73735c7e28c3ca4c | |
parent | addfb0c546f3cd911514591a91a9eef2ce5e3cec (diff) |
refactor(core): set function names for ops in JavaScript (#19208)
This commit ensures that JavaScript functions generated for registered
ops have proper names set up - the function name matches the name
of the op.
A test was added in `core/runtime.rs` that verifies this.
Closes https://github.com/denoland/deno/issues/19206
-rw-r--r-- | core/01_core.js | 6 | ||||
-rw-r--r-- | core/bindings.js | 4 | ||||
-rw-r--r-- | core/bindings.rs | 10 | ||||
-rw-r--r-- | core/runtime.rs | 35 |
4 files changed, 52 insertions, 3 deletions
diff --git a/core/01_core.js b/core/01_core.js index 403a04297..c3033fcf9 100644 --- a/core/01_core.js +++ b/core/01_core.js @@ -14,6 +14,7 @@ MapPrototypeHas, MapPrototypeSet, ObjectAssign, + ObjectDefineProperty, ObjectFreeze, ObjectFromEntries, ObjectKeys, @@ -561,6 +562,11 @@ for (let i = 0; i < 10; i++) { })`, ); } + ObjectDefineProperty(fn, "name", { + value: opName, + configurable: false, + writable: false, + }); return (ops[opName] = fn); } diff --git a/core/bindings.js b/core/bindings.js index c7d7af30c..21d27a2c3 100644 --- a/core/bindings.js +++ b/core/bindings.js @@ -20,7 +20,7 @@ Deno.__op__registerOp = function (isAsync, op, opName) { return; } core.asyncOps[opName] = op; - core.ops[opName] = function (...args) { + const fn = function (...args) { if (this !== core.ops) { // deno-lint-ignore prefer-primordials throw new Error( @@ -29,6 +29,8 @@ Deno.__op__registerOp = function (isAsync, op, opName) { } return core.asyncStub(opName, args); }; + fn.name = opName; + core.ops[opName] = fn; } else { core.ops[opName] = op; } diff --git a/core/bindings.rs b/core/bindings.rs index 8ad3948a5..46b6c622c 100644 --- a/core/bindings.rs +++ b/core/bindings.rs @@ -206,12 +206,15 @@ fn op_ctx_function<'s>( ) -> v8::Local<'s, v8::Function> { let op_ctx_ptr = op_ctx as *const OpCtx as *const c_void; let external = v8::External::new(scope, op_ctx_ptr as *mut c_void); + let v8name = + v8::String::new_external_onebyte_static(scope, op_ctx.decl.name.as_bytes()) + .unwrap(); let builder: v8::FunctionBuilder<v8::FunctionTemplate> = v8::FunctionTemplate::builder_raw(op_ctx.decl.v8_fn_ptr) .data(external.into()) .length(op_ctx.decl.arg_count as i32); - let templ = if let Some(fast_function) = &op_ctx.decl.fast_fn { + let template = if let Some(fast_function) = &op_ctx.decl.fast_fn { builder.build_fast( scope, fast_function, @@ -222,7 +225,10 @@ fn op_ctx_function<'s>( } else { builder.build(scope) }; - templ.get_function(scope).unwrap() + + let v8fn = template.get_function(scope).unwrap(); + v8fn.set_name(v8name); + v8fn } pub extern "C" fn wasm_async_resolve_promise_callback( diff --git a/core/runtime.rs b/core/runtime.rs index b56ef5d65..fd95bb0b3 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -4871,4 +4871,39 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { ..Default::default() }); } + + #[test] + fn ops_in_js_have_proper_names() { + #[op] + fn op_test_sync() -> Result<String, Error> { + Ok(String::from("Test")) + } + + #[op] + async fn op_test_async() -> Result<String, Error> { + Ok(String::from("Test")) + } + + deno_core::extension!(test_ext, ops = [op_test_sync, op_test_async]); + let mut runtime = JsRuntime::new(RuntimeOptions { + extensions: vec![test_ext::init_ops()], + ..Default::default() + }); + + let src = r#" + if (Deno.core.ops.op_test_sync.name !== "op_test_sync") { + throw new Error(); + } + + if (Deno.core.ops.op_test_async.name !== "op_test_async") { + throw new Error(); + } + + const { op_test_async } = Deno.core.generateAsyncOpHandler("op_test_async"); + if (op_test_async.name !== "op_test_async") { + throw new Error(); + } + "#; + runtime.execute_script_static("test", src).unwrap(); + } } |