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);
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);
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).