Pre-construct cpi instruction recorders before message processing (#12467)

This commit is contained in:
Justin Starry 2020-09-25 20:42:28 +08:00 committed by GitHub
parent b7d3ddbfe3
commit 1c970bb39f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 9 deletions

View File

@ -2009,11 +2009,15 @@ impl Bank {
let (account_refcells, loader_refcells) =
Self::accounts_to_refcells(accounts, loaders);
let mut instruction_recorders = if enable_cpi_recording {
Some(Vec::new())
let instruction_recorders = if enable_cpi_recording {
Some(vec![
InstructionRecorder::default();
tx.message.instructions.len()
])
} else {
None
};
let process_result = self.message_processor.process_message(
tx.message(),
&loader_refcells,
@ -2021,7 +2025,7 @@ impl Bank {
&self.rent_collector,
log_collector.clone(),
executors.clone(),
instruction_recorders.as_mut(),
instruction_recorders.as_deref(),
self.cluster_type(),
self.epoch(),
);

View File

@ -734,16 +734,14 @@ impl MessageProcessor {
rent_collector: &RentCollector,
log_collector: Option<Rc<LogCollector>>,
executors: Rc<RefCell<Executors>>,
mut instruction_recorders: Option<&mut Vec<InstructionRecorder>>,
instruction_recorders: Option<&[InstructionRecorder]>,
cluster_type: ClusterType,
epoch: Epoch,
) -> Result<(), TransactionError> {
for (instruction_index, instruction) in message.instructions.iter().enumerate() {
let instruction_recorder = instruction_recorders.as_mut().map(|recorders| {
let instruction_recorder = InstructionRecorder::default();
recorders.push(instruction_recorder.clone());
instruction_recorder
});
let instruction_recorder = instruction_recorders
.as_ref()
.map(|recorders| recorders[instruction_index].clone());
self.execute_instruction(
message,
instruction,