Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions meld-core/src/resolver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -870,9 +870,25 @@ fn resolve_resource_positions(
) -> Vec<ResolvedResourceOp> {
let mut resolved = Vec::new();
for pos in positions {
if let Some((module_name, field_name)) =
resource_map.get(&(pos.resource_type_id, field_prefix))
{
// Try exact match first
let entry = resource_map
.get(&(pos.resource_type_id, field_prefix))
.or_else(|| {
// Fallback: the resource type ID from the function signature may differ
// from the canonical entry's type ID (e.g., imported type 24 vs defined
// type 25). If there's exactly one resource with this prefix, use it.
let candidates: Vec<_> = resource_map
.iter()
.filter(|((_, k), _)| *k == field_prefix)
.map(|(_, v)| v)
.collect();
if candidates.len() == 1 {
Some(candidates[0])
} else {
None
}
});
if let Some((module_name, field_name)) = entry {
resolved.push(ResolvedResourceOp {
flat_idx: pos.flat_idx,
byte_offset: pos.byte_offset,
Expand Down
3 changes: 2 additions & 1 deletion meld-core/tests/wit_bindgen_runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -643,14 +643,15 @@ runtime_test!(test_runtime_wit_bindgen_resource_alias, "resource_alias");

// Resource fixtures — known failures (graceful degradation)
// resource_aggregates: own<T> handle leak (handle != 0 assertion)
// resource_floats: 3-component resource chain — wrong resource table for [resource-rep]
// resource_borrow_in_record: borrow<T> inside record not detected as flat param
// resource_with_lists: data corruption in resource+list combination
// ownership: resource ownership transfer issue
fuse_only_test!(
test_fuse_wit_bindgen_resource_aggregates,
"resource_aggregates"
);
// resource_floats: 3-component chain — adapter uses callee's [resource-rep] but handle
// is in caller's resource table (needs caller-side resource map lookup)
fuse_only_test!(test_fuse_wit_bindgen_resource_floats, "resource_floats");
fuse_only_test!(
test_fuse_wit_bindgen_resource_borrow_in_record,
Expand Down
Loading