adjust for nested throws.

This commit is contained in:
Mark Thom
2017-08-14 22:49:41 -06:00
parent aa3bee5db9
commit 1d2c02e9af
9 changed files with 362 additions and 174 deletions

View File

@@ -19,87 +19,84 @@ fn get_builtins() -> Code {
is_var!(), // var/1, 3.
proceed!(),
allocate!(4), // catch/3, 5.
query![get_var_in_query!(perm_v!(2), 1),
get_var_in_query!(perm_v!(3), 2),
get_var_in_query!(perm_v!(1), 3),
put_var!(perm_v!(4), 1)],
fact![get_var_in_fact!(perm_v!(2), 1),
get_var_in_fact!(perm_v!(3), 2),
get_var_in_fact!(perm_v!(1), 3)],
query![put_var!(perm_v!(4), 1)],
get_current_block!(),
query![put_value!(perm_v!(2), 1),
put_value!(perm_v!(3), 2),
put_value!(perm_v!(1), 3),
put_unsafe_value!(4, 4)],
deallocate!(),
goto!(11, 4),
try_me_else!(9), // catch/4, 11.
goto!(12, 4), // goto catch/4.
try_me_else!(10), // catch/4, 12.
allocate!(3),
query![get_var_in_query!(perm_v!(3), 1),
get_var_in_query!(perm_v!(2), 4),
put_var!(perm_v!(1), 1)],
fact![get_var_in_fact!(perm_v!(3), 1),
get_var_in_fact!(perm_v!(2), 4)],
query![put_var!(perm_v!(1), 1)],
install_new_block!(),
query![put_value!(perm_v!(3), 1)],
call_n!(1),
query![put_value!(perm_v!(2), 1),
put_unsafe_value!(1, 2)],
deallocate!(),
goto!(42, 2), // goto end_block/2 at 42.
goto!(44, 2), //21: goto end_block/2.
trust_me!(),
allocate!(4),
query![get_var_in_query!(perm_v!(2), 2),
get_var_in_query!(perm_v!(1), 3),
get_var_in_query!(temp_v!(2), 1),
allocate!(3),
fact![get_var_in_fact!(perm_v!(2), 2),
get_var_in_fact!(perm_v!(1), 3)],
query![get_var_in_query!(temp_v!(2), 1),
put_value!(temp_v!(4), 1)],
reset_block!(),
query![put_var!(perm_v!(4), 1)],
query![put_var!(perm_v!(3), 1)],
get_ball!(),
query![put_value!(perm_v!(4), 1),
put_var!(perm_v!(3), 2)],
copy_term!(),
query![put_unsafe_value!(3, 1),
put_value!(perm_v!(2), 2),
put_value!(perm_v!(1), 3)],
deallocate!(),
goto!(31, 2), // goto handle_ball/2.
try_me_else!(10), // handle_ball/2, 31.
goto!(32, 2), // goto handle_ball/2.
try_me_else!(10), // handle_ball/2, 32.
allocate!(2),
get_level!(),
query![get_var_in_query!(perm_v!(2), 3)],
fact![get_var_in_fact!(perm_v!(2), 3)],
unify!(),
cut!(non_terminal!()),
erase_ball!(),
query![put_value!(perm_v!(2), 1)],
deallocate!(),
execute_n!(1),
trust_me!(),
unwind_stack!(),
try_me_else!(8), // end_block/2, 42.
try_me_else!(9), // end_block/2, 44.
allocate!(1),
query![get_var_in_query!(perm_v!(1), 1),
put_value!(temp_v!(2), 1)],
fact![get_var_in_fact!(perm_v!(1), 1)],
query![put_value!(temp_v!(2), 1)],
clean_up_block!(),
query![put_value!(perm_v!(1), 1)],
deallocate!(),
reset_block!(),
proceed!(),
trust_me!(),
allocate!(0),
trust_me!(), // 53.
allocate!(0),
query![get_var_in_query!(temp_v!(3), 1),
put_value!(temp_v!(2), 1)],
reset_block!(),
deallocate!(),
goto!(58, 0), // goto false.
set_ball!(), // throw/1, 56.
goto!(61, 0),
set_ball!(), // throw/1, 59.
unwind_stack!(),
fail!(), // false/0, 58.
proceed!(),
try_me_else!(7), // not/1, 60.
fail!(), // false/0, 61.
try_me_else!(7), // not/1, 62.
allocate!(1),
get_level!(),
call_n!(1),
cut!(non_terminal!()),
deallocate!(),
goto!(58, 0), // goto false.
goto!(61, 0),
trust_me!(),
proceed!(),
copy_term!(), // copy_term/2, 69.
duplicate_term!(), // duplicate_term/2, 71.
proceed!()]
}
@@ -115,11 +112,11 @@ pub fn build_code_dir() -> (Code, CodeDir) {
code_dir.insert((String::from("atomic"), 1), (PredicateKeyType::BuiltIn, 1));
code_dir.insert((String::from("var"), 1), (PredicateKeyType::BuiltIn, 3));
code_dir.insert((String::from("false"), 0), (PredicateKeyType::BuiltIn, 58));
code_dir.insert((String::from("not"), 1), (PredicateKeyType::BuiltIn, 60));
code_dir.insert((String::from("copy_term"), 2), (PredicateKeyType::BuiltIn, 69));
code_dir.insert((String::from("false"), 0), (PredicateKeyType::BuiltIn, 61));
code_dir.insert((String::from("not"), 1), (PredicateKeyType::BuiltIn, 62));
code_dir.insert((String::from("duplicate_term"), 2), (PredicateKeyType::BuiltIn, 71));
code_dir.insert((String::from("catch"), 3), (PredicateKeyType::BuiltIn, 5));
code_dir.insert((String::from("throw"), 1), (PredicateKeyType::BuiltIn, 56));
code_dir.insert((String::from("throw"), 1), (PredicateKeyType::BuiltIn, 59));
(builtin_code, code_dir)
}