Allow program accounts to be passed as program and parameter (#8907)

This commit is contained in:
Jack May
2020-03-17 12:06:15 -07:00
committed by GitHub
parent 46fcab14dd
commit 61514e3b0e
2 changed files with 308 additions and 428 deletions

View File

@ -158,33 +158,36 @@ pub fn process_instruction(
if is_executable(keyed_accounts)? { if is_executable(keyed_accounts)? {
let mut keyed_accounts_iter = keyed_accounts.iter(); let mut keyed_accounts_iter = keyed_accounts.iter();
let program = next_keyed_account(&mut keyed_accounts_iter)?; let program = next_keyed_account(&mut keyed_accounts_iter)?;
let program_account = program.try_account_ref_mut()?;
let (mut vm, heap_region) = match create_vm(&program_account.data) {
Ok(info) => info,
Err(e) => {
warn!("Failed to create BPF VM: {}", e);
return Err(BPFLoaderError::VirtualMachineCreationFailed.into());
}
};
let parameter_accounts = keyed_accounts_iter.as_slice(); let parameter_accounts = keyed_accounts_iter.as_slice();
let parameter_bytes = serialize_parameters( let parameter_bytes = serialize_parameters(
program.unsigned_key(), program.unsigned_key(),
parameter_accounts, parameter_accounts,
&instruction_data, &instruction_data,
)?; )?;
{
info!("Call BPF program"); let program_account = program.try_account_ref_mut()?;
match vm.execute_program(parameter_bytes.as_slice(), &[], &[heap_region]) { let (mut vm, heap_region) = match create_vm(&program_account.data) {
Ok(status) => { Ok(info) => info,
if status != SUCCESS { Err(e) => {
let error: InstructionError = status.into(); warn!("Failed to create BPF VM: {}", e);
warn!("BPF program failed: {:?}", error); return Err(BPFLoaderError::VirtualMachineCreationFailed.into());
return Err(error); }
};
info!("Call BPF program");
match vm.execute_program(parameter_bytes.as_slice(), &[], &[heap_region]) {
Ok(status) => {
if status != SUCCESS {
let error: InstructionError = status.into();
warn!("BPF program failed: {:?}", error);
return Err(error);
}
}
Err(e) => {
warn!("BPF VM failed to run program: {}", e);
return Err(BPFLoaderError::VirtualMachineFailedToRunProgram.into());
} }
}
Err(e) => {
warn!("BPF VM failed to run program: {}", e);
return Err(BPFLoaderError::VirtualMachineFailedToRunProgram.into());
} }
} }
deserialize_parameters(parameter_accounts, &parameter_bytes)?; deserialize_parameters(parameter_accounts, &parameter_bytes)?;

File diff suppressed because it is too large Load Diff