Remove clones in native programs

This commit is contained in:
Greg Fitzgerald 2019-01-04 11:17:29 -07:00
parent 33f2d83506
commit 30b662df39
3 changed files with 14 additions and 17 deletions

View File

@ -148,18 +148,18 @@ fn entrypoint(
solana_logger::setup(); solana_logger::setup();
if keyed_accounts[0].account.executable { if keyed_accounts[0].account.executable {
let prog = keyed_accounts[0].account.userdata.clone(); let (progs, params) = keyed_accounts.split_at_mut(1);
let prog = &progs[0].account.userdata;
info!("Call BPF program"); info!("Call BPF program");
//dump_program(keyed_accounts[0].key, &prog); //dump_program(keyed_accounts[0].key, prog);
let mut vm = match create_vm(&prog) { let mut vm = match create_vm(prog) {
Ok(vm) => vm, Ok(vm) => vm,
Err(e) => { Err(e) => {
warn!("create_vm failed: {}", e); warn!("create_vm failed: {}", e);
return Err(ProgramError::GenericError); return Err(ProgramError::GenericError);
} }
}; };
let mut v = let mut v = serialize_parameters(program_id, params, &tx_data, tick_height);
serialize_parameters(program_id, &mut keyed_accounts[1..], &tx_data, tick_height);
match vm.execute_program(v.as_mut_slice()) { match vm.execute_program(v.as_mut_slice()) {
Ok(status) => { Ok(status) => {
if 0 == status { if 0 == status {
@ -171,7 +171,7 @@ fn entrypoint(
return Err(ProgramError::GenericError); return Err(ProgramError::GenericError);
} }
} }
deserialize_parameters(&mut keyed_accounts[1..], &v); deserialize_parameters(params, &v);
info!( info!(
"BPF program executed {} instructions", "BPF program executed {} instructions",
vm.get_last_instruction_count() vm.get_last_instruction_count()

View File

@ -63,9 +63,10 @@ fn entrypoint(
solana_logger::setup(); solana_logger::setup();
if keyed_accounts[0].account.executable { if keyed_accounts[0].account.executable {
let code = keyed_accounts[0].account.userdata.clone(); let (codes, params) = keyed_accounts.split_at_mut(1);
let code = str::from_utf8(&code).unwrap(); let code = &codes[0].account.userdata;
match run_lua(&mut keyed_accounts[1..], &code, tx_data) { let code = str::from_utf8(code).unwrap();
match run_lua(params, &code, tx_data) {
Ok(()) => { Ok(()) => {
trace!("Lua success"); trace!("Lua success");
} }

View File

@ -60,8 +60,9 @@ pub fn entrypoint(
) -> Result<(), ProgramError> { ) -> Result<(), ProgramError> {
if keyed_accounts[0].account.executable { if keyed_accounts[0].account.executable {
// dispatch it // dispatch it
let name = keyed_accounts[0].account.userdata.clone(); let (names, params) = keyed_accounts.split_at_mut(1);
let name = match str::from_utf8(&name) { let name = &names[0].account.userdata;
let name = match str::from_utf8(name) {
Ok(v) => v, Ok(v) => v,
Err(e) => { Err(e) => {
warn!("Invalid UTF-8 sequence: {}", e); warn!("Invalid UTF-8 sequence: {}", e);
@ -85,12 +86,7 @@ pub fn entrypoint(
return Err(ProgramError::GenericError); return Err(ProgramError::GenericError);
} }
}; };
return entrypoint( return entrypoint(program_id, params, ix_userdata, tick_height);
program_id,
&mut keyed_accounts[1..],
ix_userdata,
tick_height,
);
}, },
Err(e) => { Err(e) => {
warn!("Unable to load: {:?}", e); warn!("Unable to load: {:?}", e);