Skip to content

Commit

Permalink
Merge pull request #17 from lambdaclass/improve-run-context
Browse files Browse the repository at this point in the history
  • Loading branch information
unbalancedparentheses committed May 10, 2022
2 parents 420e2fe + 0bee15a commit 0b1561d
Showing 1 changed file with 21 additions and 45 deletions.
66 changes: 21 additions & 45 deletions src/vm/run_context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,63 +35,39 @@ impl RunContext {
};
}

pub fn compute_dst_addr(
&self,
instruction: &Instruction,
) -> Result<MaybeRelocatable, VirtualMachineError> {
pub fn compute_dst_addr(&self, instruction: &Instruction) -> MaybeRelocatable {
let base_addr = match instruction.dst_register {
Register::AP => Some(&self.ap),
Register::FP => Some(&self.fp),
};
match base_addr {
Some(addr) => {
return Ok(addr.add_num_addr(instruction.off0.clone(), Some(self.prime.clone())))
}
_ => return Err(VirtualMachineError::InvalidDstRegError),
Register::AP => &self.ap,
Register::FP => &self.fp,
};
return base_addr.add_num_addr(instruction.off0.clone(), Some(self.prime.clone()));
}

pub fn compute_op0_addr(
&self,
instruction: &Instruction,
) -> Result<MaybeRelocatable, VirtualMachineError> {
pub fn compute_op0_addr(&self, instruction: &Instruction) -> MaybeRelocatable {
let base_addr = match instruction.op0_register {
Register::AP => Some(&self.ap),
Register::FP => Some(&self.fp),
Register::AP => &self.ap,
Register::FP => &self.fp,
};
if let Some(addr) = base_addr {
return Ok(addr.add_num_addr(instruction.off1.clone(), Some(self.prime.clone())));
} else {
return Err(VirtualMachineError::InvalidOp0RegError);
}
return base_addr.add_num_addr(instruction.off1.clone(), Some(self.prime.clone()));
}

pub fn compute_op1_addr(
&self,
instruction: &Instruction,
op0: Option<MaybeRelocatable>,
) -> Result<MaybeRelocatable, VirtualMachineError> {
let base_addr: Option<&MaybeRelocatable>;
match instruction.op1_addr {
Op1Addr::FP => base_addr = Some(&self.fp),
Op1Addr::AP => base_addr = Some(&self.ap),
Op1Addr::IMM => {
if instruction.off2 == BigInt::from_i32(1).unwrap() {
base_addr = Some(&self.pc);
}
return Err(VirtualMachineError::ImmShouldBe1Error);
}
Op1Addr::OP0 => {
match op0 {
Some(addr) => return Ok((addr + instruction.off1.clone()) % self.prime.clone()),
None => return Err(VirtualMachineError::UnknownOp0Error),
};
}
}
if let Some(addr) = base_addr {
return Ok(addr.add_num_addr(instruction.off1.clone(), Some(self.prime.clone())));
} else {
return Err(VirtualMachineError::InvalidOp1RegError);
}
let base_addr = match instruction.op1_addr {
Op1Addr::FP => &self.fp,
Op1Addr::AP => &self.ap,
Op1Addr::IMM => match instruction.off2 == BigInt::from_i32(1).unwrap() {
true => &self.pc,
false => return Err(VirtualMachineError::ImmShouldBe1Error),
},
Op1Addr::OP0 => match op0 {
Some(addr) => return Ok(addr + instruction.off1.clone() % self.prime.clone()),
None => return Err(VirtualMachineError::UnknownOp0Error),
},
};
return Ok(base_addr.add_num_addr(instruction.off1.clone(), Some(self.prime.clone())));
}
}

0 comments on commit 0b1561d

Please sign in to comment.