migrate memberes from deprecated structs (#24263)

This commit is contained in:
Jack May 2022-04-12 09:49:42 -07:00 committed by GitHub
parent 2d4d639635
commit b035991c35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 89 additions and 27 deletions

View File

@ -177,8 +177,6 @@ pub struct StackFrame<'a> {
pub number_of_program_accounts: usize,
pub keyed_accounts: Vec<KeyedAccount<'a>>,
pub keyed_accounts_range: std::ops::Range<usize>,
pub orig_account_lengths: Option<Vec<usize>>,
pub allocator: Option<Rc<RefCell<dyn Alloc>>>,
}
impl<'a> StackFrame<'a> {
@ -191,8 +189,6 @@ impl<'a> StackFrame<'a> {
number_of_program_accounts,
keyed_accounts,
keyed_accounts_range,
orig_account_lengths: None,
allocator: None,
}
}
@ -220,8 +216,10 @@ pub struct InvokeContext<'a> {
pub timings: ExecuteDetailsTimings,
pub blockhash: Hash,
pub lamports_per_signature: u64,
pub check_aligned: bool,
pub check_size: bool,
check_aligned: bool,
check_size: bool,
orig_account_lengths: Vec<Option<Vec<usize>>>,
allocators: Vec<Option<Rc<RefCell<dyn Alloc>>>>,
}
impl<'a> InvokeContext<'a> {
@ -258,6 +256,8 @@ impl<'a> InvokeContext<'a> {
lamports_per_signature,
check_aligned: true,
check_size: true,
orig_account_lengths: Vec::new(),
allocators: Vec::new(),
}
}
@ -443,6 +443,8 @@ impl<'a> InvokeContext<'a> {
std::mem::transmute(keyed_accounts.as_slice())
}),
));
self.orig_account_lengths.push(None);
self.allocators.push(None);
self.transaction_context.push(
program_indices,
instruction_accounts,
@ -454,6 +456,8 @@ impl<'a> InvokeContext<'a> {
/// Pop a stack frame from the invocation stack
pub fn pop(&mut self) -> Result<(), InstructionError> {
self.orig_account_lengths.pop();
self.allocators.pop();
self.invoke_stack.pop();
self.transaction_context.pop()
}
@ -1085,57 +1089,61 @@ impl<'a> InvokeContext<'a> {
&mut self,
orig_account_lengths: Vec<usize>,
) -> Result<(), InstructionError> {
let stack_frame = &mut self
.invoke_stack
*self
.orig_account_lengths
.last_mut()
.ok_or(InstructionError::CallDepth)?;
stack_frame.orig_account_lengths = Some(orig_account_lengths);
.ok_or(InstructionError::CallDepth)? = Some(orig_account_lengths);
Ok(())
}
/// Get the original account lengths
pub fn get_orig_account_lengths(&self) -> Result<&[usize], InstructionError> {
self.invoke_stack
self.orig_account_lengths
.last()
.and_then(|frame| frame.orig_account_lengths.as_ref())
.ok_or(InstructionError::CallDepth)
.and_then(|orig_account_lengths| orig_account_lengths.as_ref())
.map(|orig_account_lengths| orig_account_lengths.as_slice())
.ok_or(InstructionError::CallDepth)
}
// Set should alignment be enforced during user pointer translation
pub fn set_check_aligned(&mut self, check_aligned: bool) {
self.check_aligned = check_aligned;
}
// Sshould alignment be enforced during user pointer translation
pub fn get_check_aligned(&self) -> bool {
self.check_aligned
}
// Set should type size be checked during user pointer translation
pub fn set_check_size(&mut self, check_size: bool) {
self.check_size = check_size;
}
// Set should type size be checked during user pointer translation
pub fn get_check_size(&self) -> bool {
self.check_size
}
// Get this instruction's memory allocator
pub fn get_allocator(&self) -> Result<Rc<RefCell<dyn Alloc>>, InstructionError> {
self.allocators
.last()
.and_then(|allocator| allocator.clone())
.ok_or(InstructionError::CallDepth)
}
// Set this instruction's memory allocator
pub fn set_allocator(
&mut self,
allocator: Rc<RefCell<dyn Alloc>>,
) -> Result<(), InstructionError> {
let stack_frame = &mut self
.invoke_stack
*self
.allocators
.last_mut()
.ok_or(InstructionError::CallDepth)?;
stack_frame.allocator = Some(allocator);
.ok_or(InstructionError::CallDepth)? = Some(allocator);
Ok(())
}
pub fn get_allocator(&self) -> Result<Rc<RefCell<dyn Alloc>>, InstructionError> {
self.invoke_stack
.last()
.and_then(|frame| frame.allocator.clone())
.ok_or(InstructionError::CallDepth)
}
}
pub struct MockInvokeContextPreparation {

View File

@ -112,11 +112,10 @@ impl TransactionContext {
self.account_keys.iter().rposition(|key| key == pubkey)
}
/// Gets an InstructionContext by its nesting level in the stack
pub fn get_instruction_context_at(
pub fn get_instruction_context_indicies(
&self,
level: usize,
) -> Result<&InstructionContext, InstructionError> {
) -> Result<(usize, usize), InstructionError> {
let top_level_index = *self
.instruction_stack
.get(0)
@ -129,6 +128,15 @@ impl TransactionContext {
.get(level)
.ok_or(InstructionError::CallDepth)?
};
Ok((top_level_index, cpi_index))
}
/// Gets an InstructionContext by its nesting level in the stack
pub fn get_instruction_context_at(
&self,
level: usize,
) -> Result<&InstructionContext, InstructionError> {
let (top_level_index, cpi_index) = self.get_instruction_context_indicies(level)?;
let instruction_context = self
.instruction_trace
.get(top_level_index)
@ -138,6 +146,21 @@ impl TransactionContext {
Ok(instruction_context)
}
/// Gets an InstructionContext by its nesting level in the stack
pub fn get_instruction_context_mut_at(
&mut self,
level: usize,
) -> Result<&mut InstructionContext, InstructionError> {
let (top_level_index, cpi_index) = self.get_instruction_context_indicies(level)?;
let instruction_context = self
.instruction_trace
.get_mut(top_level_index)
.and_then(|instruction_trace| instruction_trace.get_mut(cpi_index))
.ok_or(InstructionError::CallDepth)?;
debug_assert_eq!(instruction_context.nesting_level, level);
Ok(instruction_context)
}
/// Gets the max height of the InstructionContext stack
pub fn get_instruction_context_capacity(&self) -> usize {
self.instruction_context_capacity
@ -158,6 +181,17 @@ impl TransactionContext {
self.get_instruction_context_at(level)
}
/// Returns the current InstructionContext
pub fn get_current_instruction_context_mut(
&mut self,
) -> Result<&mut InstructionContext, InstructionError> {
let level = self
.get_instruction_context_stack_height()
.checked_sub(1)
.ok_or(InstructionError::CallDepth)?;
self.get_instruction_context_mut_at(level)
}
/// Pushes a new InstructionContext
pub fn push(
&mut self,
@ -237,6 +271,26 @@ impl TransactionContext {
pub fn get_instruction_trace(&self) -> &InstructionTrace {
&self.instruction_trace
}
// /// Set the original account lengths
// pub fn set_orig_account_lengths(
// &mut self,
// orig_account_lengths: Vec<usize>,
// ) -> Result<(), InstructionError> {
// let level = self
// .get_instruction_context_stack_height()
// .checked_sub(1)
// .ok_or(InstructionError::CallDepth)?;
// let (top_level_index, cpi_index) = self.get_instruction_context_indicies(level)?;
// let instruction_context = self
// .instruction_trace
// .get_mut(top_level_index)
// .and_then(|instruction_trace| instruction_trace.get_mut(cpi_index))
// .ok_or(InstructionError::CallDepth)?;
// debug_assert_eq!(instruction_context.nesting_level, level);
// instruction_context.orig_account_lengths = Some(orig_account_lengths);
// Ok(())
// }
}
/// Return data at the end of a transaction