use super::*;
impl<N: Network, A: circuit::Aleo<Network = N>> Registers<N, A> {
#[inline]
pub fn store_literal(&mut self, stack: &Stack<N>, register: &Register<N>, literal: Literal<N>) -> Result<()> {
self.store(stack, register, Value::Plaintext(Plaintext::from(literal)))
}
#[inline]
pub fn store(&mut self, stack: &Stack<N>, register: &Register<N>, stack_value: Value<N>) -> Result<()> {
match register {
Register::Locator(locator) => {
let expected_locator = self.console_registers.len() as u64;
ensure!(expected_locator == *locator, "Out-of-order write operation at '{register}'");
ensure!(
!self.console_registers.contains_key(locator),
"Cannot write to occupied register '{register}'"
);
match self.register_types.get_type(stack, register) {
Ok(register_type) => stack.matches_register_type(&stack_value, ®ister_type)?,
Err(error) => bail!("Register '{register}' is missing a type definition: {error}"),
};
match self.console_registers.insert(*locator, stack_value) {
Some(..) => bail!("Attempted to write to register '{register}' again"),
None => Ok(()),
}
}
Register::Member(..) => bail!("Cannot store to a register member: '{register}'"),
}
}
}
impl<N: Network, A: circuit::Aleo<Network = N>> Registers<N, A> {
#[inline]
pub fn store_literal_circuit(
&mut self,
stack: &Stack<N>,
register: &Register<N>,
literal: circuit::Literal<A>,
) -> Result<()> {
self.store_circuit(stack, register, circuit::Value::Plaintext(circuit::Plaintext::from(literal)))
}
#[inline]
pub fn store_circuit(
&mut self,
stack: &Stack<N>,
register: &Register<N>,
circuit_value: circuit::Value<A>,
) -> Result<()> {
match register {
Register::Locator(locator) => {
let expected_locator = self.circuit_registers.len() as u64;
ensure!(expected_locator == *locator, "Out-of-order write operation at '{register}'");
ensure!(
!self.circuit_registers.contains_key(locator),
"Cannot write to occupied register '{register}'"
);
match self.register_types.get_type(stack, register) {
Ok(register_type) => {
stack.matches_register_type(&circuit::Eject::eject_value(&circuit_value), ®ister_type)?
}
Err(error) => bail!("Register '{register}' is missing a type definition: {error}"),
};
match self.circuit_registers.insert(*locator, circuit_value) {
Some(..) => bail!("Attempted to write to register '{register}' again"),
None => Ok(()),
}
}
Register::Member(..) => bail!("Cannot store to a register member: '{register}'"),
}
}
}