summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/01_core.js5
-rw-r--r--core/ops_builtin.rs17
2 files changed, 21 insertions, 1 deletions
diff --git a/core/01_core.js b/core/01_core.js
index b1497c934..296d9bbcf 100644
--- a/core/01_core.js
+++ b/core/01_core.js
@@ -148,6 +148,10 @@
opSync("op_close", rid);
}
+ function tryClose(rid) {
+ opSync("op_try_close", rid);
+ }
+
function print(str, isErr = false) {
opSync("op_print", str, isErr);
}
@@ -175,6 +179,7 @@
opSync,
ops,
close,
+ tryClose,
print,
resources,
registerErrorBuilder,
diff --git a/core/ops_builtin.rs b/core/ops_builtin.rs
index 459b2a967..06de59054 100644
--- a/core/ops_builtin.rs
+++ b/core/ops_builtin.rs
@@ -17,6 +17,7 @@ pub(crate) fn init_builtins() -> Extension {
))
.ops(vec![
("op_close", op_sync(op_close)),
+ ("op_try_close", op_sync(op_try_close)),
("op_print", op_sync(op_print)),
("op_resources", op_sync(op_resources)),
])
@@ -44,10 +45,24 @@ pub fn op_close(
rid: Option<ResourceId>,
_: (),
) -> Result<(), AnyError> {
- // TODO(@AaronO): drop Option after improving type-strictness balance in serde_v8
+ // TODO(@AaronO): drop Option after improving type-strictness balance in
+ // serde_v8
let rid = rid.ok_or_else(|| type_error("missing or invalid `rid`"))?;
state.resource_table.close(rid)?;
+ Ok(())
+}
+/// Try to remove a resource from the resource table. If there is no resource
+/// with the specified `rid`, this is a no-op.
+pub fn op_try_close(
+ state: &mut OpState,
+ rid: Option<ResourceId>,
+ _: (),
+) -> Result<(), AnyError> {
+ // TODO(@AaronO): drop Option after improving type-strictness balance in
+ // serde_v8.
+ let rid = rid.ok_or_else(|| type_error("missing or invalid `rid`"))?;
+ let _ = state.resource_table.close(rid);
Ok(())
}