Skip to content

Commit 28cb7fd

Browse files
committed
feat: support RuntimeImportIndex lookups by string paths
Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>
1 parent ab6d971 commit 28cb7fd

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

crates/wasmtime/src/component/instance.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -558,15 +558,24 @@ impl<T> InstancePre<T> {
558558
}
559559
}
560560

561-
pub(crate) fn resource_import_index(
562-
&self,
563-
path: ResourceImportIndex,
564-
) -> Option<RuntimeImportIndex> {
561+
/// Returns [`RuntimeImportIndex`] associated with this [`ResourceImportIndex`]
562+
pub fn resource_import_index(&self, path: ResourceImportIndex) -> Option<RuntimeImportIndex> {
565563
*self.resource_imports.get(*path)?
566564
}
567565

568-
pub(crate) fn resource_import(&self, path: ResourceImportIndex) -> Option<&RuntimeImport> {
569-
let idx = self.resource_import_index(path)?;
566+
/// Returns [`RuntimeImportIndex`] associated with this `path` within a `root`.
567+
pub fn path_import_index(&self, root: &str, path: &[&str]) -> Option<RuntimeImportIndex> {
568+
let env_component = self.component().env_component();
569+
env_component
570+
.imports
571+
.iter()
572+
.find_map(|(idx, (import, import_path))| {
573+
let (root_name, _) = env_component.import_types.get(*import)?;
574+
(root_name == root && import_path == path).then_some(idx)
575+
})
576+
}
577+
578+
pub(crate) fn runtime_import(&self, idx: RuntimeImportIndex) -> Option<&RuntimeImport> {
570579
self.imports.get(idx)
571580
}
572581

crates/wasmtime/src/component/resources.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use crate::component::func::{bad_type_info, desc, LiftContext, LowerContext};
22
use crate::component::instance::RuntimeImport;
3-
use crate::component::linker::ResourceImportIndex;
43
use crate::component::matching::InstanceType;
54
use crate::component::{ComponentType, InstancePre, Lift, Lower};
65
use crate::store::{StoreId, StoreOpaque};
@@ -11,7 +10,9 @@ use std::fmt;
1110
use std::marker;
1211
use std::mem::MaybeUninit;
1312
use std::sync::atomic::{AtomicU32, Ordering::Relaxed};
14-
use wasmtime_environ::component::{CanonicalAbiInfo, DefinedResourceIndex, InterfaceType};
13+
use wasmtime_environ::component::{
14+
CanonicalAbiInfo, DefinedResourceIndex, InterfaceType, RuntimeImportIndex,
15+
};
1516
use wasmtime_runtime::component::{ComponentInstance, InstanceFlags, ResourceTables};
1617
use wasmtime_runtime::{SendSyncPtr, VMFuncRef, ValRaw};
1718

@@ -402,7 +403,7 @@ where
402403
self,
403404
store: impl AsContextMut,
404405
instance: &InstancePre<U>,
405-
idx: ResourceImportIndex,
406+
idx: RuntimeImportIndex,
406407
) -> Result<ResourceAny> {
407408
ResourceAny::try_from_resource(self, store, instance, idx)
408409
}
@@ -516,16 +517,16 @@ struct OwnState {
516517

517518
impl ResourceAny {
518519
/// Attempts to convert an imported [`Resource`] into [`ResourceAny`].
519-
/// `idx` is the [`ResourceImportIndex`] returned by [`Linker::resource`].
520+
/// `idx` is the [`RuntimeImportIndex`] associated with this resource.
520521
pub fn try_from_resource<T: 'static, U>(
521522
Resource { rep, state, .. }: Resource<T>,
522523
mut store: impl AsContextMut,
523524
instance_pre: &InstancePre<U>,
524-
idx: ResourceImportIndex,
525+
idx: RuntimeImportIndex,
525526
) -> Result<Self> {
526527
let store = store.as_context_mut();
527528
let import = instance_pre
528-
.resource_import(idx)
529+
.runtime_import(idx)
529530
.context("import not found")?;
530531
let RuntimeImport::Resource {
531532
ty, dtor_funcref, ..

0 commit comments

Comments
 (0)