Simplifies return_data accessors in InvokeContext. (#20290)
This commit is contained in:
committed by
GitHub
parent
57c8abf499
commit
4de5fff3ca
@ -945,9 +945,9 @@ impl Executor for BpfExecutor {
|
||||
trace!("BPF Program Instruction Trace:\n{}", trace_string);
|
||||
}
|
||||
drop(vm);
|
||||
let return_data = invoke_context.get_return_data();
|
||||
if let Some((program_id, return_data)) = return_data {
|
||||
stable_log::program_return(&logger, program_id, return_data);
|
||||
let (program_id, return_data) = invoke_context.get_return_data();
|
||||
if !return_data.is_empty() {
|
||||
stable_log::program_return(&logger, &program_id, return_data);
|
||||
}
|
||||
match result {
|
||||
Ok(status) => {
|
||||
@ -960,7 +960,7 @@ impl Executor for BpfExecutor {
|
||||
} else {
|
||||
status.into()
|
||||
};
|
||||
stable_log::program_failure(&logger, program_id, &error);
|
||||
stable_log::program_failure(&logger, &program_id, &error);
|
||||
return Err(error);
|
||||
}
|
||||
}
|
||||
@ -974,7 +974,7 @@ impl Executor for BpfExecutor {
|
||||
InstructionError::ProgramFailedToComplete
|
||||
}
|
||||
};
|
||||
stable_log::program_failure(&logger, program_id, &error);
|
||||
stable_log::program_failure(&logger, &program_id, &error);
|
||||
return Err(error);
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +44,6 @@ use solana_sdk::{
|
||||
use std::{
|
||||
alloc::Layout,
|
||||
cell::{Ref, RefCell, RefMut},
|
||||
cmp::min,
|
||||
mem::{align_of, size_of},
|
||||
rc::Rc,
|
||||
slice::from_raw_parts_mut,
|
||||
@ -2324,23 +2323,21 @@ impl<'a> SyscallObject<BpfError> for SyscallSetReturnData<'a> {
|
||||
return;
|
||||
}
|
||||
|
||||
if len == 0 {
|
||||
invoke_context.set_return_data(None);
|
||||
let return_data = if len == 0 {
|
||||
Vec::new()
|
||||
} else {
|
||||
let return_data = question_mark!(
|
||||
question_mark!(
|
||||
translate_slice::<u8>(memory_mapping, addr, len, self.loader_id),
|
||||
result
|
||||
);
|
||||
|
||||
let program_id = *question_mark!(
|
||||
invoke_context
|
||||
.get_caller()
|
||||
.map_err(SyscallError::InstructionError),
|
||||
result
|
||||
);
|
||||
|
||||
invoke_context.set_return_data(Some((program_id, return_data.to_vec())));
|
||||
}
|
||||
)
|
||||
.to_vec()
|
||||
};
|
||||
question_mark!(
|
||||
invoke_context
|
||||
.set_return_data(return_data)
|
||||
.map_err(SyscallError::InstructionError),
|
||||
result
|
||||
);
|
||||
|
||||
*result = Ok(0);
|
||||
}
|
||||
@ -2354,7 +2351,7 @@ impl<'a> SyscallObject<BpfError> for SyscallGetReturnData<'a> {
|
||||
fn call(
|
||||
&mut self,
|
||||
return_data_addr: u64,
|
||||
len: u64,
|
||||
mut length: u64,
|
||||
program_id_addr: u64,
|
||||
_arg4: u64,
|
||||
_arg5: u64,
|
||||
@ -2377,47 +2374,33 @@ impl<'a> SyscallObject<BpfError> for SyscallGetReturnData<'a> {
|
||||
result
|
||||
);
|
||||
|
||||
if let Some((program_id, return_data)) = invoke_context.get_return_data() {
|
||||
if len != 0 {
|
||||
let length = min(return_data.len() as u64, len);
|
||||
let (program_id, return_data) = invoke_context.get_return_data();
|
||||
length = length.min(return_data.len() as u64);
|
||||
if length != 0 {
|
||||
question_mark!(
|
||||
invoke_context
|
||||
.get_compute_meter()
|
||||
.consume((length + size_of::<Pubkey>() as u64) / budget.cpi_bytes_per_unit),
|
||||
result
|
||||
);
|
||||
|
||||
question_mark!(
|
||||
invoke_context
|
||||
.get_compute_meter()
|
||||
.consume((length + size_of::<Pubkey>() as u64) / budget.cpi_bytes_per_unit),
|
||||
result
|
||||
);
|
||||
let return_data_result = question_mark!(
|
||||
translate_slice_mut::<u8>(memory_mapping, return_data_addr, length, self.loader_id,),
|
||||
result
|
||||
);
|
||||
|
||||
let return_data_result = question_mark!(
|
||||
translate_slice_mut::<u8>(
|
||||
memory_mapping,
|
||||
return_data_addr,
|
||||
length,
|
||||
self.loader_id,
|
||||
),
|
||||
result
|
||||
);
|
||||
return_data_result.copy_from_slice(&return_data[..length as usize]);
|
||||
|
||||
return_data_result.copy_from_slice(&return_data[..length as usize]);
|
||||
let program_id_result = question_mark!(
|
||||
translate_slice_mut::<Pubkey>(memory_mapping, program_id_addr, 1, self.loader_id,),
|
||||
result
|
||||
);
|
||||
|
||||
let program_id_result = question_mark!(
|
||||
translate_slice_mut::<Pubkey>(
|
||||
memory_mapping,
|
||||
program_id_addr,
|
||||
1,
|
||||
self.loader_id,
|
||||
),
|
||||
result
|
||||
);
|
||||
|
||||
program_id_result[0] = *program_id;
|
||||
}
|
||||
|
||||
// Return the actual length, rather the length returned
|
||||
*result = Ok(return_data.len() as u64);
|
||||
} else {
|
||||
*result = Ok(0);
|
||||
program_id_result[0] = program_id;
|
||||
}
|
||||
|
||||
// Return the actual length, rather the length returned
|
||||
*result = Ok(return_data.len() as u64);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user