diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/01_core.js | 1 | ||||
-rw-r--r-- | core/ops_builtin.rs | 13 |
2 files changed, 14 insertions, 0 deletions
diff --git a/core/01_core.js b/core/01_core.js index e5e2c9fd5..ddd3ac82d 100644 --- a/core/01_core.js +++ b/core/01_core.js @@ -323,6 +323,7 @@ opNames: () => ops.op_op_names(), eventLoopHasMoreWork: () => ops.op_event_loop_has_more_work(), setPromiseRejectCallback: (fn) => ops.op_set_promise_reject_callback(fn), + byteLength: (str) => ops.op_str_byte_length(str), }); ObjectAssign(globalThis.__bootstrap, { core }); diff --git a/core/ops_builtin.rs b/core/ops_builtin.rs index bd19b74f6..26ab4bed5 100644 --- a/core/ops_builtin.rs +++ b/core/ops_builtin.rs @@ -39,6 +39,7 @@ pub(crate) fn init_builtins() -> Extension { op_metrics::decl(), op_format_file_name::decl(), op_is_proxy::decl(), + op_str_byte_length::decl(), ]) .ops(crate::ops_builtin_v8::init_builtins_v8()) .build() @@ -195,3 +196,15 @@ fn op_format_file_name(file_name: String) -> String { fn op_is_proxy(value: serde_v8::Value) -> bool { value.v8_value.is_proxy() } + +#[op(v8)] +fn op_str_byte_length( + scope: &mut v8::HandleScope, + value: serde_v8::Value, +) -> u32 { + if let Ok(string) = v8::Local::<v8::String>::try_from(value.v8_value) { + string.utf8_length(scope) as u32 + } else { + 0 + } +} |