fix bugs in call_with_inference_limit

This commit is contained in:
Mark Thom
2018-02-21 19:46:15 -07:00
parent 7313472a70
commit 5de03444eb
13 changed files with 248 additions and 201 deletions

View File

@@ -548,74 +548,89 @@ fn get_builtins(atom_tbl: TabledData<Atom>) -> Code {
compare_term_execute!(term_cmp_lt!()), // (@<)/2, 390.
compare_term_execute!(term_cmp_eq!()), // (=@=)/2, 391.
compare_term_execute!(term_cmp_ne!()), // (\=@=)/2, 392.
allocate!(4), // call_with_inference_limit/3, 393.
fact![get_var_in_fact!(perm_v!(3), 1),
get_var_in_fact!(perm_v!(2), 2),
get_var_in_fact!(perm_v!(1), 3)],
query![put_var!(perm_v!(4), 1)],
allocate!(5), // call_with_inference_limit/3, 393.
fact![get_var_in_fact!(perm_v!(4), 1),
get_var_in_fact!(perm_v!(3), 2),
get_var_in_fact!(perm_v!(2), 3)],
query![put_var!(perm_v!(5), 1)],
get_current_block!(),
query![put_value!(perm_v!(3), 1),
put_value!(perm_v!(2), 2),
put_value!(perm_v!(1), 3),
put_value!(perm_v!(4), 4)],
get_cp!(perm_v!(1)),
query![put_value!(perm_v!(4), 1),
put_value!(perm_v!(3), 2),
put_value!(perm_v!(2), 3),
put_value!(perm_v!(5), 4),
put_value!(perm_v!(1), 5)],
goto_call!(404, 5), // goto call_with_inference_limit/4, 404.
query![put_value!(perm_v!(1), 1)],
deallocate!(),
goto_execute!(400, 4), // goto call_with_inference_limit/4, 400.
try_me_else!(16), // call_with_inference_limit/4, 400.
allocate!(7),
fact![get_var_in_fact!(perm_v!(6), 1),
get_var_in_fact!(perm_v!(7), 2),
get_var_in_fact!(perm_v!(4), 3),
get_var_in_fact!(perm_v!(3), 4)],
remove_call_policy_check!(),
proceed!(),
try_me_else!(18), // call_with_inference_limit/5, 404.
allocate!(9),
fact![get_var_in_fact!(perm_v!(9), 1),
get_var_in_fact!(perm_v!(6), 2),
get_var_in_fact!(perm_v!(5), 3),
get_var_in_fact!(perm_v!(3), 4),
get_var_in_fact!(perm_v!(4), 5)],
query![put_var!(perm_v!(1), 1)],
install_new_block!(),
install_inference_counter!(perm_v!(7)),
get_cp!(perm_v!(5)),
query![put_value!(perm_v!(6), 1)],
install_inference_counter!(perm_v!(4), perm_v!(6), perm_v!(8)),
query![put_value!(perm_v!(9), 1)],
call_n!(1),
query![put_var!(perm_v!(2), 3)],
remove_inference_counter!(perm_v!(2)),
query![put_value!(perm_v!(4), 1),
put_value!(perm_v!(5), 2)],
remove_inference_counter!(perm_v!(4), perm_v!(7)),
sub!(ArithmeticTerm::Reg(perm_v!(7)),
ArithmeticTerm::Reg(perm_v!(8)),
1),
sub!(ArithmeticTerm::Reg(perm_v!(6)),
ArithmeticTerm::Interm(1),
1),
query![put_value!(perm_v!(2), 1)],
is_call!(temp_v!(1), ArithmeticTerm::Interm(1)),
query![put_value!(perm_v!(5), 1),
put_value!(perm_v!(4), 2)],
inference_level!(),
query![put_value!(perm_v!(3), 1),
put_value!(perm_v!(1), 2),
put_value!(perm_v!(2), 3)],
query![put_value!(perm_v!(4), 1),
put_value!(perm_v!(3), 2),
put_value!(perm_v!(1), 3),
put_value!(perm_v!(2), 4)],
deallocate!(),
goto_execute!(436, 3), // goto end_block/3, 436.
default_trust_me!(), // 416.
allocate!(2),
fact![get_var_in_fact!(perm_v!(1), 3)],
goto_execute!(442, 4), // goto end_block/4, 442.
default_trust_me!(), // 422.
allocate!(3),
fact![get_var_in_fact!(perm_v!(1), 3),
get_var_in_fact!(perm_v!(3), 5)],
query![put_value!(temp_v!(4), 1)],
reset_block!(),
query![put_var!(temp_v!(2), 1)],
remove_inference_counter!(temp_v!(1)),
query![put_var!(temp_v!(3), 2)],
remove_inference_counter!(perm_v!(3), temp_v!(2)),
query![put_var!(perm_v!(2), 1)],
get_ball!(),
erase_ball!(),
query![put_unsafe_value!(2, 1),
put_value!(perm_v!(1), 2)],
query![put_value!(perm_v!(3), 1),
put_unsafe_value!(2, 2),
put_value!(perm_v!(1), 3)],
deallocate!(),
goto_execute!(429, 2), // goto handle_ile/2, 429.
try_me_else!(5), // handle_ile/2, 429.
switch_on_term!(1, 1, 0, 0),
fact![get_constant!(atom!("inference_limit_exceeded", atom_tbl), temp_v!(1)),
get_constant!(atom!("inference_limit_exceeded", atom_tbl), temp_v!(2))],
goto_execute!(435, 3), // goto handle_ile/3, 435.
try_me_else!(4), // handle_ile/3, 435.
fact![get_structure!(atom_tbl, "inference_limit_exceeded", 1, temp_v!(2), None),
unify_value!(temp_v!(1)),
get_constant!(atom!("inference_limit_exceeded", atom_tbl), temp_v!(3))],
neck_cut!(),
proceed!(),
default_trust_me!(),
goto_execute!(59, 1), // goto throw/1, 59.
try_me_else!(9), // end_block/3, 436.
allocate!(1),
fact![get_var_in_fact!(perm_v!(1), 1)],
query![put_value!(temp_v!(2), 1)],
goto_execute!(59, 1), // goto throw/1, 59.
try_me_else!(6), // end_block/4, 442.
query![put_value!(temp_v!(3), 1)],
clean_up_block!(),
query![put_value!(perm_v!(1), 1)],
deallocate!(),
query![put_value!(temp_v!(2), 1)],
reset_block!(),
proceed!(),
default_trust_me!(),
install_inference_counter!(temp_v!(3)),
query![put_value!(temp_v!(2), 1)],
query![put_value!(temp_v!(4), 2),
put_var!(temp_v!(4), 4)],
install_inference_counter!(temp_v!(1), temp_v!(2), temp_v!(4)),
query![put_value!(temp_v!(3), 1)],
reset_block!(),
fail!()
]