Skip to content

Commit

Permalink
feat: improve call callable point
Browse files Browse the repository at this point in the history
  • Loading branch information
loloicci committed Apr 7, 2023
1 parent c92e9e5 commit 6324adc
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 8 deletions.
6 changes: 5 additions & 1 deletion api/lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -653,7 +653,11 @@ func CallCallablePoint(
// Depending on the nature of the error, `gasUsed` will either have a meaningful value, or just 0.
return nil, nil, nil, uint64(gasUsed), errorWithMessage(err, errmsg)
}
return copyAndDestroyUnmanagedVector(res), copyAndDestroyUnmanagedVector(events), copyAndDestroyUnmanagedVector(attributes), uint64(gasUsed), nil
if isReadonly {
return copyAndDestroyUnmanagedVector(res), nil, nil, uint64(gasUsed), nil
} else {
return copyAndDestroyUnmanagedVector(res), copyAndDestroyUnmanagedVector(events), copyAndDestroyUnmanagedVector(attributes), uint64(gasUsed), nil
}
}

/**** To error module ***/
Expand Down
4 changes: 4 additions & 0 deletions lib.go
Original file line number Diff line number Diff line change
Expand Up @@ -783,6 +783,10 @@ func (vm *VM) CallCallablePoint(
return nil, nil, nil, gasUsed, err
}

if isReadonly {
return data, nil, nil, gasUsed, nil
}

gasForDeserializingEvents := deserCost.Mul(uint64(len(eventsData))).Floor()
if gasLimit < gasForDeserializingEvents+gasUsed {
return nil, nil, nil, gasUsed, fmt.Errorf("Insufficient gas left to deserialize events (%d bytes)", len(eventsData))
Expand Down
35 changes: 28 additions & 7 deletions libwasmvm/src/dynamic_link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,21 @@ fn do_call_callable_point(
events: Option<&mut UnmanagedVector>,
attributes: Option<&mut UnmanagedVector>,
gas_used: Option<&mut u64>,
) -> Result<Option<Vec<u8>>, Error> {
let name: String = from_slice(name.read().ok_or_else(|| Error::unset_arg("name"))?)?;
let args: Vec<Binary> = from_slice(args.read().ok_or_else(|| Error::unset_arg("args"))?)?;
) -> Result<Option<Binary>, Error> {
let name: String =
from_slice(name.read().ok_or_else(|| Error::unset_arg("name"))?).map_err(|e| {
Error::serde_err(format!(
"Error during deserializing callable point's `name` to call: {}",
e
))
})?;
let args: Vec<Binary> = from_slice(args.read().ok_or_else(|| Error::unset_arg("args"))?)
.map_err(|e| {
Error::serde_err(format!(
"Error during deserializing `args` for the callable point: {}",
e
))
})?;
let gas_used = gas_used.ok_or_else(|| Error::empty_arg(GAS_USED_ARG))?;
let checksum: Checksum = checksum
.read()
Expand All @@ -117,7 +129,13 @@ fn do_call_callable_point(
callstack
.read()
.ok_or_else(|| Error::unset_arg("callstack"))?,
)?;
)
.map_err(|e| {
Error::serde_err(format!(
"Error during deserializing `callstack` of calling callable points: {}",
e
))
})?;

let backend = into_backend(db, api, querier);
let options = InstanceOptions {
Expand All @@ -138,7 +156,7 @@ fn do_call_callable_point(
let mut arg_ptrs = Vec::<WasmerVal>::with_capacity(args.len() + 1);
let env_ptr = write_value_to_env(&instance.env, env_u8)?;
arg_ptrs.push(env_ptr);
for arg in args {
for arg in &args {
let ptr = write_value_to_env(&instance.env, arg.as_slice())?;
arg_ptrs.push(ptr);
}
Expand All @@ -153,13 +171,16 @@ fn do_call_callable_point(
)?;
match result_datas.len() {
0 => Ok(None),
1 => Ok(Some(result_datas[0].clone())),
1 => Ok(Some(Binary(result_datas[0].clone()))),
_ => Err(Error::dynamic_link_err(
"unexpected more than 1 returning values",
)),
}
}
Err(e) => Err(Error::dynamic_link_err(e.to_string())),
Err(e) => Err(Error::dynamic_link_err(format!(
r#"Error during calling callable point "{}": {}"#,
name, e
))),
}?;

// events
Expand Down

0 comments on commit 6324adc

Please sign in to comment.