measuring
							parent
							
								
									11fd5b6cbc
								
							
						
					
					
						commit
						52df317326
					
				|  | @ -261,7 +261,8 @@ impl State { | |||
| 	/// Short form to get access to a register within our window
 | ||||
| 	
 | ||||
| 	pub fn reg (&self, i: u8) -> &Value { | ||||
| 		&self.registers [self.stack_top.register_offset + i as usize] | ||||
| 		let idx = self.stack_top.register_offset + i as usize; | ||||
| 		&self.registers [idx] | ||||
| 	} | ||||
| 	
 | ||||
| 	pub fn reg_mut (&mut self, i: u8) -> &mut Value { | ||||
|  | @ -487,18 +488,28 @@ impl State { | |||
| 		true | ||||
| 	} | ||||
| 	
 | ||||
| 	pub fn step (&mut self) -> Result <Option <StepOutput>, StepError> 
 | ||||
| 	{ | ||||
| 	fn constants (&self) -> &[Value] { | ||||
| 		&self.chunk.blocks.get (self.stack_top.block_idx).unwrap ().constants | ||||
| 	} | ||||
| 	
 | ||||
| 	fn decode (&self) -> Instruction { | ||||
| 		let block = self.chunk.blocks.get (self.stack_top.block_idx).unwrap (); | ||||
| 		let instruction = match block.instructions.get (self.stack_top.program_counter) { | ||||
| 		match block.instructions.get (self.stack_top.program_counter) { | ||||
| 			Some (x) => *x, | ||||
| 			None => { | ||||
| 				dbg! (&self.stack, &self.stack_top); | ||||
| 				panic! ("program_counter went out of bounds"); | ||||
| 			} | ||||
| 		}; | ||||
| 		
 | ||||
| 		let k = &block.constants; | ||||
| 		} | ||||
| 	} | ||||
| 	
 | ||||
| 	fn incr_pc (&mut self) { | ||||
| 		self.stack_top.program_counter += 1; | ||||
| 	} | ||||
| 	
 | ||||
| 	pub fn step (&mut self) -> Result <Option <StepOutput>, StepError> 
 | ||||
| 	{ | ||||
| 		let instruction = self.decode (); | ||||
| 		
 | ||||
| 		let make_step_error = |msg| { | ||||
| 			self.make_step_error (msg, &instruction) | ||||
|  | @ -567,10 +578,10 @@ impl State { | |||
| 					self.stack_top.program_counter += 1; | ||||
| 				} | ||||
| 			}, | ||||
| 			Instruction::EqK (a, b, k_flag) => { | ||||
| 			Instruction::EqK (a, b, k) => { | ||||
| 				let b = usize::from (b); | ||||
| 				
 | ||||
| 				if (*self.reg (a) == k [b]) != k_flag { | ||||
| 				if (*self.reg (a) == self.constants ()[b]) != k { | ||||
| 					self.stack_top.program_counter += 1; | ||||
| 				} | ||||
| 			}, | ||||
|  | @ -630,7 +641,7 @@ impl State { | |||
| 				
 | ||||
| 				let table = value.as_table ().expect ("GetTabUp only works on tables").borrow (); | ||||
| 				
 | ||||
| 				let key = match k.get (c).unwrap () { | ||||
| 				let key = match self.constants ().get (c).unwrap () { | ||||
| 					Value::String (s) => *s, | ||||
| 					_ => panic! ("GetTabUp only supports string keys"), | ||||
| 				}; | ||||
|  | @ -692,7 +703,7 @@ impl State { | |||
| 			Instruction::LoadK (a, bx) => { | ||||
| 				let bx = usize::try_from (bx).unwrap (); | ||||
| 				
 | ||||
| 				*self.reg_mut (a) = k [bx].clone (); | ||||
| 				*self.reg_mut (a) = self.constants ()[bx].clone (); | ||||
| 			}, | ||||
| 			Instruction::LoadNil (a) => { | ||||
| 				*self.reg_mut (a) = Value::Nil; | ||||
|  | @ -711,7 +722,7 @@ impl State { | |||
| 			}, | ||||
| 			Instruction::ModK (a, b, c) => { | ||||
| 				let b = self.reg (b).as_int().unwrap (); | ||||
| 				let c = k [usize::from (c)].as_int ().unwrap (); | ||||
| 				let c = self.constants ()[usize::from (c)].as_int ().unwrap (); | ||||
| 				
 | ||||
| 				*self.reg_mut (a) = (b % c).into (); | ||||
| 			}, | ||||
|  | @ -731,7 +742,7 @@ impl State { | |||
| 			}, | ||||
| 			Instruction::MulK (a, b, c) => { | ||||
| 				let v_b = self.reg (b); | ||||
| 				let v_c = &k [usize::from (c)]; | ||||
| 				let v_c = &self.constants ()[usize::from (c)]; | ||||
| 				
 | ||||
| 				let x = if let (Some (v_b), Some (v_c)) = (v_b.as_int (), v_c.as_int ()) 
 | ||||
| 				{ | ||||
|  | @ -832,7 +843,7 @@ impl State { | |||
| 			}, | ||||
| 			Instruction::SetI (a, b, c, k_flag) => { | ||||
| 				let value = if k_flag { | ||||
| 					&k [usize::from (c)] | ||||
| 					&self.constants ()[usize::from (c)] | ||||
| 				} | ||||
| 				else { | ||||
| 					self.reg (c) | ||||
|  | @ -863,15 +874,15 @@ impl State { | |||
| 				let b = usize::try_from (b).unwrap (); | ||||
| 				
 | ||||
| 				let value = if k_flag { | ||||
| 					&k [usize::from (c)] | ||||
| 					&self.constants ()[usize::from (c)] | ||||
| 				} | ||||
| 				else { | ||||
| 					self.reg (c) | ||||
| 				} | ||||
| 				.clone (); | ||||
| 				
 | ||||
| 				let key = self.constants ().get (b).unwrap ().as_str ().expect ("SetTabUp K[B] must be a string"); | ||||
| 				let table = self.upvalues.get_mut (a).unwrap ().as_table ().unwrap (); | ||||
| 				let key = k.get (b).unwrap ().as_str ().expect ("SetTabUp K[B] must be a string"); | ||||
| 				table.borrow_mut ().insert_str (key, value); | ||||
| 			}, | ||||
| 			Instruction::Sub (a, b, c) => { | ||||
|  | @ -983,7 +994,7 @@ impl State { | |||
| 			Instruction::VarArgPrep (_) => (), | ||||
| 		} | ||||
| 		
 | ||||
| 		self.stack_top.program_counter += 1; | ||||
| 		self.incr_pc (); | ||||
| 		
 | ||||
| 		Ok (None) | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 _
						_