add another test, add unwind_protect!
This commit is contained in:
@@ -219,11 +219,13 @@ impl ListingCompiler {
|
|||||||
let mod_name = self.get_module_name();
|
let mod_name = self.get_module_name();
|
||||||
|
|
||||||
if let Some(mut submodule) = wam_indices.take_module(submodule) {
|
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 {
|
if let &mut Some(ref mut module) = &mut self.module {
|
||||||
module.remove_module(mod_name, &submodule);
|
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 {
|
} else {
|
||||||
submodule.inserted_expansions = true;
|
submodule.inserted_expansions = true;
|
||||||
wam_indices.remove_module(clause_name!("user"), &submodule);
|
wam_indices.remove_module(clause_name!("user"), &submodule);
|
||||||
@@ -243,11 +245,13 @@ impl ListingCompiler {
|
|||||||
let mod_name = self.get_module_name();
|
let mod_name = self.get_module_name();
|
||||||
|
|
||||||
if let Some(mut submodule) = wam_indices.take_module(submodule) {
|
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 {
|
if let &mut Some(ref mut module) = &mut self.module {
|
||||||
module.remove_module(mod_name, &submodule);
|
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 {
|
} else {
|
||||||
submodule.inserted_expansions = true;
|
submodule.inserted_expansions = true;
|
||||||
wam_indices.remove_module(clause_name!("user"), &submodule);
|
wam_indices.remove_module(clause_name!("user"), &submodule);
|
||||||
|
|||||||
@@ -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 {
|
macro_rules! discard_result {
|
||||||
($f: expr) => (
|
($f: expr) => (
|
||||||
match $f {
|
match $f {
|
||||||
|
|||||||
14
src/tests.rs
14
src/tests.rs
@@ -1898,6 +1898,20 @@ foo(X) :- call(X) -> call(X).");
|
|||||||
assert_prolog_failure!(&mut wam, "?- retract( (atom(X) :- 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).");
|
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, "
|
submit(&mut wam, "
|
||||||
:- dynamic(foo/1).
|
:- dynamic(foo/1).
|
||||||
foo(X) :- call(X), call(X).
|
foo(X) :- call(X), call(X).
|
||||||
|
|||||||
Reference in New Issue
Block a user