]> Repositorios git - scryer-prolog.git/commitdiff
add another test, add unwind_protect!
authorMark Thom <[email protected]>
Tue, 5 Mar 2019 05:34:17 +0000 (22:34 -0700)
committerMark Thom <[email protected]>
Tue, 5 Mar 2019 05:34:17 +0000 (22:34 -0700)
src/prolog/machine/compile.rs
src/prolog/macros.rs
src/tests.rs

index 91882632472e331d02e9ab76ae6800c39e1c6588..77a460b4e93ec97d079f24b245f3e8818be4c712 100644 (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);
index f1cc166e15971fb9b2c0ccf0dfbcac7a08e0e02b..c8f5ddf3ccbca9c0ea3ef5aef4820d257cdf71b3 100644 (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 {
index fdd92c495c9adc69aba8b592edf4d3823977ee94..b2ece0737ff693f4962e98e092d9c10a8563b6c8 100644 (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).