LordXido commited on
Commit
2a4c759
·
verified ·
1 Parent(s): 23bea78

Update src/vm.rs

Browse files
Files changed (1) hide show
  1. src/vm.rs +22 -13
src/vm.rs CHANGED
@@ -19,18 +19,22 @@ impl BCNVM {
19
 
20
  pub fn run(&mut self) -> Result<(), String> {
21
  while self.pc < self.program.len() {
22
- let instr = &self.program[self.pc..self.pc + 8];
 
 
 
 
23
  let opcode = Opcode::from_byte(instr[0])
24
  .ok_or("Invalid opcode")?;
25
 
26
  match opcode {
27
  Opcode::INVCHK => self.invchk()?,
28
- Opcode::TADD => self.trust_add(instr)?,
29
- Opcode::TSUB => self.trust_sub(instr)?,
30
- Opcode::FADD => self.flow_add(instr)?,
31
  Opcode::FVEL => self.flow_vel()?,
32
- Opcode::CISS => self.credit_issue(instr)?,
33
- Opcode::CRET => self.credit_return(instr)?,
34
  Opcode::CCAP => self.credit_cap()?,
35
  Opcode::CDEF => self.credit_default()?,
36
  Opcode::CREW => self.work_credit()?,
@@ -38,7 +42,7 @@ impl BCNVM {
38
  Opcode::ILOCK => self.identity_lock()?,
39
  Opcode::HALT => break,
40
  Opcode::NOOP => {},
41
- _ => {}
42
  }
43
 
44
  self.pc += 8;
@@ -51,24 +55,24 @@ impl BCNVM {
51
  return Err("Trust underflow".into());
52
  }
53
  if self.state.credit_balance < 0 {
54
- return Err("Negative credit".into());
55
  }
56
  Ok(())
57
  }
58
 
59
- fn trust_add(&mut self, instr: &[u8]) -> Result<(), String> {
60
  let imm = instr[5] as i64;
61
  self.state.trust += imm;
62
  Ok(())
63
  }
64
 
65
- fn trust_sub(&mut self, instr: &[u8]) -> Result<(), String> {
66
  let imm = instr[5] as i64;
67
  self.state.trust -= imm;
68
  Ok(())
69
  }
70
 
71
- fn flow_add(&mut self, instr: &[u8]) -> Result<(), String> {
72
  let imm = instr[5] as i64;
73
  self.state.flow_total += imm;
74
  Ok(())
@@ -86,22 +90,27 @@ impl BCNVM {
86
  Ok(())
87
  }
88
 
89
- fn credit_issue(&mut self, instr: &[u8]) -> Result<(), String> {
90
  let imm = instr[5] as i64;
 
91
  if self.state.credit_balance > 0 {
92
  return Err("No rollovers allowed".into());
93
  }
 
94
  if imm > self.state.credit_cap {
95
  return Err("Exceeds credit cap".into());
96
  }
 
97
  self.state.credit_balance += imm;
98
  Ok(())
99
  }
100
 
101
- fn credit_return(&mut self, instr: &[u8]) -> Result<(), String> {
102
  let imm = instr[5] as i64;
 
103
  self.state.credit_balance -= imm;
104
  self.state.trust += imm / 10;
 
105
  Ok(())
106
  }
107
 
 
19
 
20
  pub fn run(&mut self) -> Result<(), String> {
21
  while self.pc < self.program.len() {
22
+ // FIX: Copy instruction into owned buffer
23
+ let instr: [u8; 8] = self.program[self.pc..self.pc + 8]
24
+ .try_into()
25
+ .map_err(|_| "Invalid instruction length")?;
26
+
27
  let opcode = Opcode::from_byte(instr[0])
28
  .ok_or("Invalid opcode")?;
29
 
30
  match opcode {
31
  Opcode::INVCHK => self.invchk()?,
32
+ Opcode::TADD => self.trust_add(&instr)?,
33
+ Opcode::TSUB => self.trust_sub(&instr)?,
34
+ Opcode::FADD => self.flow_add(&instr)?,
35
  Opcode::FVEL => self.flow_vel()?,
36
+ Opcode::CISS => self.credit_issue(&instr)?,
37
+ Opcode::CRET => self.credit_return(&instr)?,
38
  Opcode::CCAP => self.credit_cap()?,
39
  Opcode::CDEF => self.credit_default()?,
40
  Opcode::CREW => self.work_credit()?,
 
42
  Opcode::ILOCK => self.identity_lock()?,
43
  Opcode::HALT => break,
44
  Opcode::NOOP => {},
45
+ _ => return Err("Unimplemented opcode".into()),
46
  }
47
 
48
  self.pc += 8;
 
55
  return Err("Trust underflow".into());
56
  }
57
  if self.state.credit_balance < 0 {
58
+ return Err("Negative credit balance".into());
59
  }
60
  Ok(())
61
  }
62
 
63
+ fn trust_add(&mut self, instr: &[u8; 8]) -> Result<(), String> {
64
  let imm = instr[5] as i64;
65
  self.state.trust += imm;
66
  Ok(())
67
  }
68
 
69
+ fn trust_sub(&mut self, instr: &[u8; 8]) -> Result<(), String> {
70
  let imm = instr[5] as i64;
71
  self.state.trust -= imm;
72
  Ok(())
73
  }
74
 
75
+ fn flow_add(&mut self, instr: &[u8; 8]) -> Result<(), String> {
76
  let imm = instr[5] as i64;
77
  self.state.flow_total += imm;
78
  Ok(())
 
90
  Ok(())
91
  }
92
 
93
+ fn credit_issue(&mut self, instr: &[u8; 8]) -> Result<(), String> {
94
  let imm = instr[5] as i64;
95
+
96
  if self.state.credit_balance > 0 {
97
  return Err("No rollovers allowed".into());
98
  }
99
+
100
  if imm > self.state.credit_cap {
101
  return Err("Exceeds credit cap".into());
102
  }
103
+
104
  self.state.credit_balance += imm;
105
  Ok(())
106
  }
107
 
108
+ fn credit_return(&mut self, instr: &[u8; 8]) -> Result<(), String> {
109
  let imm = instr[5] as i64;
110
+
111
  self.state.credit_balance -= imm;
112
  self.state.trust += imm / 10;
113
+
114
  Ok(())
115
  }
116