@@ -5288,6 +5288,8 @@ fn link_contract_call_fn(linker: &mut Linker<ClarityWasmContext>) -> Result<(),
5288
5288
"clarity" ,
5289
5289
"contract_call" ,
5290
5290
|mut caller : Caller < ' _ , ClarityWasmContext > ,
5291
+ trait_name_offset : i32 ,
5292
+ trait_name_length : i32 ,
5291
5293
contract_offset : i32 ,
5292
5294
contract_length : i32 ,
5293
5295
function_offset : i32 ,
@@ -5403,10 +5405,26 @@ fn link_contract_call_fn(linker: &mut Linker<ClarityWasmContext>) -> Result<(),
5403
5405
} ?;
5404
5406
5405
5407
// Write the result to the return buffer
5406
- let return_ty = function
5407
- . get_return_type ( )
5408
- . as_ref ( )
5409
- . ok_or ( CheckErrors :: DefineFunctionBadSignature ) ?;
5408
+ let return_ty = if trait_name_length == 0 {
5409
+ // This is a direct call
5410
+ function. get_return_type ( ) . as_ref ( )
5411
+ } else {
5412
+ // This is a dynamic call
5413
+ let trait_name = read_identifier_from_wasm (
5414
+ memory,
5415
+ & mut caller,
5416
+ trait_name_offset,
5417
+ trait_name_length,
5418
+ ) ?;
5419
+ contract
5420
+ . contract_context
5421
+ . defined_traits
5422
+ . get ( trait_name. as_str ( ) )
5423
+ . and_then ( |trait_functions| trait_functions. get ( function_name. as_str ( ) ) )
5424
+ . map ( |f_ty| & f_ty. returns )
5425
+ }
5426
+ . ok_or ( CheckErrors :: DefineFunctionBadSignature ) ?;
5427
+
5410
5428
let memory = caller
5411
5429
. get_export ( "memory" )
5412
5430
. and_then ( |export| export. into_memory ( ) )
@@ -5419,7 +5437,7 @@ fn link_contract_call_fn(linker: &mut Linker<ClarityWasmContext>) -> Result<(),
5419
5437
return_offset,
5420
5438
return_offset + get_type_size ( return_ty) ,
5421
5439
& result,
5422
- true ,
5440
+ false ,
5423
5441
) ?;
5424
5442
5425
5443
Ok ( ( ) )
0 commit comments