Moves InvokeContext::return_data to TransactionContext. (#22411)

This commit is contained in:
Alexander Meißner 2022-01-10 18:26:51 +01:00 committed by GitHub
parent 9bc2592da1
commit aadf4b9b63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 21 additions and 11 deletions

View File

@ -181,7 +181,6 @@ impl<'a> StackFrame<'a> {
pub struct InvokeContext<'a> { pub struct InvokeContext<'a> {
pub transaction_context: &'a mut TransactionContext, pub transaction_context: &'a mut TransactionContext,
pub return_data: (Pubkey, Vec<u8>),
invoke_stack: Vec<StackFrame<'a>>, invoke_stack: Vec<StackFrame<'a>>,
rent: Rent, rent: Rent,
pre_accounts: Vec<PreAccount>, pre_accounts: Vec<PreAccount>,
@ -218,7 +217,6 @@ impl<'a> InvokeContext<'a> {
) -> Self { ) -> Self {
Self { Self {
transaction_context, transaction_context,
return_data: (Pubkey::default(), Vec::new()),
invoke_stack: Vec::with_capacity(compute_budget.max_invoke_depth), invoke_stack: Vec::with_capacity(compute_budget.max_invoke_depth),
rent, rent,
pre_accounts: Vec::new(), pre_accounts: Vec::new(),
@ -835,7 +833,8 @@ impl<'a> InvokeContext<'a> {
.and_then(|_| { .and_then(|_| {
let mut process_executable_chain_time = let mut process_executable_chain_time =
Measure::start("process_executable_chain_time"); Measure::start("process_executable_chain_time");
self.return_data = (program_id, Vec::new()); self.transaction_context
.set_return_data(program_id, Vec::new())?;
let pre_remaining_units = self.compute_meter.borrow().get_remaining(); let pre_remaining_units = self.compute_meter.borrow().get_remaining();
let execution_result = self.process_executable_chain(instruction_data); let execution_result = self.process_executable_chain(instruction_data);
let post_remaining_units = self.compute_meter.borrow().get_remaining(); let post_remaining_units = self.compute_meter.borrow().get_remaining();

View File

@ -226,13 +226,13 @@ fn run_program(name: &str) -> u64 {
let mut instruction_count = 0; let mut instruction_count = 0;
let mut tracer = None; let mut tracer = None;
for i in 0..2 { for i in 0..2 {
invoke_context.return_data = ( invoke_context.transaction_context.set_return_data(
*invoke_context *invoke_context
.transaction_context .transaction_context
.get_program_key() .get_program_key()
.unwrap(), .unwrap(),
Vec::new(), Vec::new(),
); ).unwrap();
let mut parameter_bytes = parameter_bytes.clone(); let mut parameter_bytes = parameter_bytes.clone();
{ {
let mut vm = create_vm( let mut vm = create_vm(

View File

@ -1099,7 +1099,8 @@ impl Executor for BpfExecutor {
trace!("BPF Program Instruction Trace:\n{}", trace_string); trace!("BPF Program Instruction Trace:\n{}", trace_string);
} }
drop(vm); drop(vm);
let (_returned_from_program_id, return_data) = &invoke_context.return_data; let (_returned_from_program_id, return_data) =
invoke_context.transaction_context.get_return_data();
if !return_data.is_empty() { if !return_data.is_empty() {
stable_log::program_return(&log_collector, &program_id, return_data); stable_log::program_return(&log_collector, &program_id, return_data);
} }

View File

@ -2749,14 +2749,20 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallSetReturnData<'a, 'b> {
) )
.to_vec() .to_vec()
}; };
let program_id = question_mark!( let program_id = *question_mark!(
invoke_context invoke_context
.transaction_context .transaction_context
.get_program_key() .get_program_key()
.map_err(SyscallError::InstructionError), .map_err(SyscallError::InstructionError),
result result
); );
invoke_context.return_data = (*program_id, return_data); question_mark!(
invoke_context
.transaction_context
.set_return_data(program_id, return_data)
.map_err(SyscallError::InstructionError),
result
);
*result = Ok(0); *result = Ok(0);
} }
@ -2799,7 +2805,7 @@ impl<'a, 'b> SyscallObject<BpfError> for SyscallGetReturnData<'a, 'b> {
result result
); );
let (program_id, return_data) = &invoke_context.return_data; let (program_id, return_data) = invoke_context.transaction_context.get_return_data();
length = length.min(return_data.len() as u64); length = length.min(return_data.len() as u64);
if length != 0 { if length != 0 {
question_mark!( question_mark!(

View File

@ -180,8 +180,12 @@ impl TransactionContext {
} }
/// Set the return data of the current InstructionContext /// Set the return data of the current InstructionContext
pub fn set_return_data(&mut self, data: Vec<u8>) -> Result<(), InstructionError> { pub fn set_return_data(
self.return_data = (*self.get_program_key()?, data); &mut self,
program_id: Pubkey,
data: Vec<u8>,
) -> Result<(), InstructionError> {
self.return_data = (program_id, data);
Ok(()) Ok(())
} }
} }