revert arithmetic code

This commit is contained in:
Mark Thom
2019-12-08 00:17:55 -07:00
parent f16c2a6e99
commit 2be7070e1a
6 changed files with 429 additions and 73 deletions

View File

@@ -360,10 +360,8 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
self.mark_non_callable(name.clone(), 2, term_loc, vr, code);
}
self.marker.reset_arg(2);
let (mut lcode, at_1) = self.call_arith_eval(terms[0].as_ref(), 1, term_loc, 1)?;
let (mut rcode, at_2) = self.call_arith_eval(terms[1].as_ref(), 2, term_loc, 2)?;
let (mut lcode, at_1) = self.call_arith_eval(terms[0].as_ref(), 1)?;
let (mut rcode, at_2) = self.call_arith_eval(terms[1].as_ref(), 2)?;
code.append(&mut lcode);
code.append(&mut rcode);
@@ -498,14 +496,12 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
}
fn call_arith_eval(
&mut self,
&self,
term: &'a Term,
target_int: usize,
term_loc: GenContext,
arg_c: usize
) -> Result<ArithCont, ArithmeticError> {
let mut evaluator = ArithmeticEvaluator::new(target_int, arg_c);
evaluator.eval(&mut self.marker, term, term_loc)
let mut evaluator = ArithmeticEvaluator::new(self.marker.bindings(), target_int);
evaluator.eval(term)
}
fn compile_is_call(
@@ -515,17 +511,20 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
term_loc: GenContext,
use_default_call_policy: bool,
) -> Result<(), ParserError> {
self.marker.reset_arg(2);
let (mut acode, at) = self.call_arith_eval(terms[1].as_ref(), 1)?;
code.append(&mut acode);
Ok(match terms[0].as_ref() {
&Term::Var(ref vr, ref name) => {
let mut target = vec![];
self.marker.mark_var(name.clone(), Level::Shallow, vr, term_loc, &mut target);
code.extend(target.into_iter().map(Line::Query));
self.marker.reset_arg(2);
self.marker
.mark_var(name.clone(), Level::Shallow, vr, term_loc, &mut target);
let (acode, at) = self.call_arith_eval(terms[1].as_ref(), 1, term_loc, 2)?;
code.extend(acode.into_iter());
if !target.is_empty() {
code.extend(target.into_iter().map(Line::Query));
}
if use_default_call_policy {
code.push(is_call_by_default!(temp_v!(1), at.unwrap_or(interm!(1))))
@@ -534,9 +533,6 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
}
}
&Term::Constant(_, ref c @ Constant::Integer(_)) => {
let (acode, at) = self.call_arith_eval(terms[1].as_ref(), 1, term_loc, 2)?;
code.extend(acode.into_iter());
code.push(Line::Query(put_constant!(
Level::Shallow,
c.clone(),
@@ -550,9 +546,6 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
}
}
&Term::Constant(_, ref c @ Constant::Float(_)) => {
let (acode, at) = self.call_arith_eval(terms[1].as_ref(), 1, term_loc, 2)?;
code.extend(acode.into_iter());
code.push(Line::Query(put_constant!(
Level::Shallow,
c.clone(),
@@ -566,9 +559,6 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
}
}
&Term::Constant(_, ref c @ Constant::Rational(_)) => {
let (acode, at) = self.call_arith_eval(terms[1].as_ref(), 1, term_loc, 2)?;
code.extend(acode.into_iter());
code.push(Line::Query(put_constant!(
Level::Shallow,
c.clone(),
@@ -584,7 +574,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
_ => code.push(fail!()),
})
}
#[inline]
fn compile_unblocked_cut(&mut self, code: &mut Code, cell: &'a Cell<VarReg>) {
let r = self.marker.get(Rc::new(String::from("!")));