add another test, add unwind_protect!

This commit is contained in:
Mark Thom
2019-03-04 22:34:17 -07:00
parent 11026e2741
commit e4cc54104e
3 changed files with 31 additions and 4 deletions

View File

@@ -219,11 +219,13 @@ impl ListingCompiler {
let mod_name = self.get_module_name();
if let Some(mut submodule) = wam_indices.take_module(submodule) {
indices.use_module(code_repo, flags, &submodule)?;
unwind_protect!(indices.use_module(code_repo, flags, &submodule),
wam_indices.insert_module(submodule));
if let &mut Some(ref mut module) = &mut self.module {
module.remove_module(mod_name, &submodule);
module.use_module(code_repo, flags, &submodule)?;
unwind_protect!(module.use_module(code_repo, flags, &submodule),
wam_indices.insert_module(submodule));
} else {
submodule.inserted_expansions = true;
wam_indices.remove_module(clause_name!("user"), &submodule);
@@ -243,11 +245,13 @@ impl ListingCompiler {
let mod_name = self.get_module_name();
if let Some(mut submodule) = wam_indices.take_module(submodule) {
indices.use_qualified_module(code_repo, flags, &submodule, exports)?;
unwind_protect!(indices.use_qualified_module(code_repo, flags, &submodule, exports),
wam_indices.insert_module(submodule));
if let &mut Some(ref mut module) = &mut self.module {
module.remove_module(mod_name, &submodule);
module.use_qualified_module(code_repo, flags, &submodule, exports)?;
unwind_protect!(module.use_qualified_module(code_repo, flags, &submodule, exports),
wam_indices.insert_module(submodule));
} else {
submodule.inserted_expansions = true;
wam_indices.remove_module(clause_name!("user"), &submodule);

View File

@@ -244,6 +244,15 @@ macro_rules! get_level_and_unify {
)
}
macro_rules! unwind_protect {
($e: expr, $protected: expr) => (
match $e {
Err(e) => { $protected; return Err(e); },
_ => {}
}
)
}
macro_rules! discard_result {
($f: expr) => (
match $f {

View File

@@ -1898,6 +1898,20 @@ foo(X) :- call(X) -> call(X).");
assert_prolog_failure!(&mut wam, "?- retract( (atom(X) :- X == '[]') ).");
assert_prolog_success!(&mut wam, "?- catch(retract( (atom(X) :- X == '[]') ), error(permission_error(modify, static_procedure, atom/1), _), true).");
/* This example shows why machine::compile::localize_self_calls is necessary. */
submit(&mut wam, "
:- dynamic(p/1).
p(a).
p(b).
p(c) :- p(d).
p(d).");
assert_prolog_success!(&mut wam, "?- p(X), retract(p(_)).",
[["X = a"],
["X = a"],
["X = a"]]);
submit(&mut wam, "
:- dynamic(foo/1).
foo(X) :- call(X), call(X).