start changing machine to use rc instead of box (does compile)
This commit is contained in:
		
							parent
							
								
									c050a5647f
								
							
						
					
					
						commit
						fb81955f51
					
				|  | @ -1,3 +1,5 @@ | ||||||
|  | use std::rc::Rc; | ||||||
|  | 
 | ||||||
| use crate::{ | use crate::{ | ||||||
|     ast::{Constant, NamedDeBruijn, Term, Type}, |     ast::{Constant, NamedDeBruijn, Term, Type}, | ||||||
|     builtins::DefaultFunction, |     builtins::DefaultFunction, | ||||||
|  | @ -13,8 +15,8 @@ pub use error::Error; | ||||||
| use self::{cost_model::CostModel, runtime::BuiltinRuntime}; | use self::{cost_model::CostModel, runtime::BuiltinRuntime}; | ||||||
| 
 | 
 | ||||||
| enum MachineStep { | enum MachineStep { | ||||||
|     Return(Context, Value), |     Return(Rc<Context>, Value), | ||||||
|     Compute(Context, Vec<Value>, Term<NamedDeBruijn>), |     Compute(Rc<Context>, Vec<Value>, Term<NamedDeBruijn>), | ||||||
|     Done(Term<NamedDeBruijn>), |     Done(Term<NamedDeBruijn>), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -58,7 +60,7 @@ impl Machine { | ||||||
|         self.spend_budget(startup_budget)?; |         self.spend_budget(startup_budget)?; | ||||||
| 
 | 
 | ||||||
|         self.stack |         self.stack | ||||||
|             .push(Compute(Context::NoFrame, vec![], term.clone())); |             .push(Compute(Rc::new(Context::NoFrame), vec![], term.clone())); | ||||||
| 
 | 
 | ||||||
|         while let Some(step) = self.stack.pop() { |         while let Some(step) = self.stack.pop() { | ||||||
|             match step { |             match step { | ||||||
|  | @ -81,7 +83,7 @@ impl Machine { | ||||||
| 
 | 
 | ||||||
|     fn compute( |     fn compute( | ||||||
|         &mut self, |         &mut self, | ||||||
|         context: Context, |         context: Rc<Context>, | ||||||
|         env: Vec<Value>, |         env: Vec<Value>, | ||||||
|         term: Term<NamedDeBruijn>, |         term: Term<NamedDeBruijn>, | ||||||
|     ) -> Result<(), Error> { |     ) -> Result<(), Error> { | ||||||
|  | @ -118,7 +120,7 @@ impl Machine { | ||||||
|                 self.step_and_maybe_spend(StepKind::Apply)?; |                 self.step_and_maybe_spend(StepKind::Apply)?; | ||||||
| 
 | 
 | ||||||
|                 self.stack.push(MachineStep::Compute( |                 self.stack.push(MachineStep::Compute( | ||||||
|                     Context::FrameApplyArg(env.clone(), *argument, Box::new(context)), |                     Rc::new(Context::FrameApplyArg(env.clone(), *argument, context)), | ||||||
|                     env, |                     env, | ||||||
|                     *function, |                     *function, | ||||||
|                 )); |                 )); | ||||||
|  | @ -132,7 +134,7 @@ impl Machine { | ||||||
|                 self.step_and_maybe_spend(StepKind::Force)?; |                 self.step_and_maybe_spend(StepKind::Force)?; | ||||||
| 
 | 
 | ||||||
|                 self.stack.push(MachineStep::Compute( |                 self.stack.push(MachineStep::Compute( | ||||||
|                     Context::FrameForce(Box::new(context)), |                     Rc::new(Context::FrameForce(context)), | ||||||
|                     env, |                     env, | ||||||
|                     *body, |                     *body, | ||||||
|                 )); |                 )); | ||||||
|  | @ -145,11 +147,7 @@ impl Machine { | ||||||
| 
 | 
 | ||||||
|                 self.stack.push(MachineStep::Return( |                 self.stack.push(MachineStep::Return( | ||||||
|                     context, |                     context, | ||||||
|                     Value::Builtin { |                     Value::Builtin { fun, term, runtime }, | ||||||
|                         fun, |  | ||||||
|                         term: term.clone(), |  | ||||||
|                         runtime, |  | ||||||
|                     }, |  | ||||||
|                 )); |                 )); | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
|  | @ -157,17 +155,19 @@ impl Machine { | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn return_compute(&mut self, context: Context, value: Value) -> Result<(), Error> { |     fn return_compute(&mut self, context: Rc<Context>, value: Value) -> Result<(), Error> { | ||||||
|         match context { |         match context.as_ref() { | ||||||
|             Context::FrameApplyFun(function, ctx) => self.apply_evaluate(*ctx, function, value)?, |             Context::FrameApplyFun(function, ctx) => { | ||||||
|  |                 self.apply_evaluate(ctx.to_owned(), function.to_owned(), value)? | ||||||
|  |             } | ||||||
|             Context::FrameApplyArg(arg_var_env, arg, ctx) => { |             Context::FrameApplyArg(arg_var_env, arg, ctx) => { | ||||||
|                 self.stack.push(MachineStep::Compute( |                 self.stack.push(MachineStep::Compute( | ||||||
|                     Context::FrameApplyFun(value, ctx), |                     Rc::new(Context::FrameApplyFun(value, ctx.to_owned())), | ||||||
|                     arg_var_env, |                     arg_var_env.to_owned(), | ||||||
|                     arg, |                     arg.to_owned(), | ||||||
|                 )); |                 )); | ||||||
|             } |             } | ||||||
|             Context::FrameForce(ctx) => self.force_evaluate(*ctx, value)?, |             Context::FrameForce(ctx) => self.force_evaluate(ctx.to_owned(), value)?, | ||||||
|             Context::NoFrame => { |             Context::NoFrame => { | ||||||
|                 if self.unbudgeted_steps[7] > 0 { |                 if self.unbudgeted_steps[7] > 0 { | ||||||
|                     self.spend_unbudgeted_steps()?; |                     self.spend_unbudgeted_steps()?; | ||||||
|  | @ -246,7 +246,7 @@ impl Machine { | ||||||
|         rec(0, term, self, &env) |         rec(0, term, self, &env) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn force_evaluate(&mut self, context: Context, value: Value) -> Result<(), Error> { |     fn force_evaluate(&mut self, context: Rc<Context>, value: Value) -> Result<(), Error> { | ||||||
|         match value { |         match value { | ||||||
|             Value::Delay(body, env) => { |             Value::Delay(body, env) => { | ||||||
|                 self.stack.push(MachineStep::Compute(context, env, body)); |                 self.stack.push(MachineStep::Compute(context, env, body)); | ||||||
|  | @ -278,7 +278,7 @@ impl Machine { | ||||||
| 
 | 
 | ||||||
|     fn apply_evaluate( |     fn apply_evaluate( | ||||||
|         &mut self, |         &mut self, | ||||||
|         context: Context, |         context: Rc<Context>, | ||||||
|         function: Value, |         function: Value, | ||||||
|         argument: Value, |         argument: Value, | ||||||
|     ) -> Result<(), Error> { |     ) -> Result<(), Error> { | ||||||
|  | @ -386,9 +386,9 @@ impl Machine { | ||||||
| 
 | 
 | ||||||
| #[derive(Clone)] | #[derive(Clone)] | ||||||
| enum Context { | enum Context { | ||||||
|     FrameApplyFun(Value, Box<Context>), |     FrameApplyFun(Value, Rc<Context>), | ||||||
|     FrameApplyArg(Vec<Value>, Term<NamedDeBruijn>, Box<Context>), |     FrameApplyArg(Vec<Value>, Term<NamedDeBruijn>, Rc<Context>), | ||||||
|     FrameForce(Box<Context>), |     FrameForce(Rc<Context>), | ||||||
|     NoFrame, |     NoFrame, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Kasey White
						Kasey White