summaryrefslogtreecommitdiff
path: root/core/bindings.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/bindings.rs')
-rw-r--r--core/bindings.rs48
1 files changed, 32 insertions, 16 deletions
diff --git a/core/bindings.rs b/core/bindings.rs
index c4555459c..5e37232a1 100644
--- a/core/bindings.rs
+++ b/core/bindings.rs
@@ -1,16 +1,15 @@
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
use crate::error::is_instance_of_error;
-use crate::extensions::OpDecl;
use crate::modules::get_module_type_from_assertions;
use crate::modules::parse_import_assertions;
use crate::modules::validate_import_assertions;
use crate::modules::ImportAssertionsKind;
use crate::modules::ModuleMap;
+use crate::ops::OpCtx;
use crate::ops_builtin::WasmStreamingResource;
use crate::resolve_url_or_path;
use crate::JsRuntime;
-use crate::OpState;
use crate::PromiseId;
use crate::ResourceId;
use crate::ZeroCopyBuf;
@@ -23,7 +22,6 @@ use serde_v8::to_v8;
use std::cell::RefCell;
use std::option::Option;
use std::os::raw::c_void;
-use std::rc::Rc;
use url::Url;
use v8::HandleScope;
use v8::Local;
@@ -147,9 +145,8 @@ pub fn module_origin<'a>(
pub fn initialize_context<'s>(
scope: &mut v8::HandleScope<'s, ()>,
- ops: &[OpDecl],
+ op_ctxs: &[OpCtx],
snapshot_loaded: bool,
- op_state: Rc<RefCell<OpState>>,
) -> v8::Local<'s, v8::Context> {
let scope = &mut v8::EscapableHandleScope::new(scope);
@@ -165,14 +162,13 @@ pub fn initialize_context<'s>(
// a really weird usecase. Remove this once all
// tsc ops are static at snapshot time.
if snapshot_loaded {
- // Grab Deno.core.ops object
+ // Grab the Deno.core & Deno.core.ops objects
+ let core_obj = JsRuntime::grab_global::<v8::Object>(scope, "Deno.core")
+ .expect("Deno.core to exist");
let ops_obj = JsRuntime::grab_global::<v8::Object>(scope, "Deno.core.ops")
.expect("Deno.core.ops to exist");
-
- let raw_op_state = Rc::as_ptr(&op_state) as *const c_void;
- for op in ops {
- set_func_raw(scope, ops_obj, op.name, op.v8_fn_ptr, raw_op_state);
- }
+ initialize_ops(scope, ops_obj, op_ctxs);
+ initialize_op_names(scope, core_obj, op_ctxs);
return scope.escape(context);
}
@@ -236,14 +232,34 @@ pub fn initialize_context<'s>(
set_func(scope, global, "queueMicrotask", queue_microtask);
// Bind functions to Deno.core.ops.*
- let ops_val = JsRuntime::ensure_objs(scope, global, "Deno.core.ops").unwrap();
- let raw_op_state = Rc::as_ptr(&op_state) as *const c_void;
- for op in ops {
- set_func_raw(scope, ops_val, op.name, op.v8_fn_ptr, raw_op_state);
- }
+ let ops_obj = JsRuntime::ensure_objs(scope, global, "Deno.core.ops").unwrap();
+ initialize_ops(scope, ops_obj, op_ctxs);
+ initialize_op_names(scope, core_val, op_ctxs);
scope.escape(context)
}
+fn initialize_ops(
+ scope: &mut v8::HandleScope,
+ ops_obj: v8::Local<v8::Object>,
+ op_ctxs: &[OpCtx],
+) {
+ for ctx in op_ctxs {
+ let ctx_ptr = ctx as *const OpCtx as *const c_void;
+ set_func_raw(scope, ops_obj, ctx.decl.name, ctx.decl.v8_fn_ptr, ctx_ptr);
+ }
+}
+
+fn initialize_op_names(
+ scope: &mut v8::HandleScope,
+ core_obj: v8::Local<v8::Object>,
+ op_ctxs: &[OpCtx],
+) {
+ let names: Vec<&str> = op_ctxs.iter().map(|o| o.decl.name).collect();
+ let k = v8::String::new(scope, "op_names").unwrap().into();
+ let v = serde_v8::to_v8(scope, names).unwrap();
+ core_obj.set(scope, k, v);
+}
+
pub fn set_func(
scope: &mut v8::HandleScope<'_>,
obj: v8::Local<v8::Object>,