[svn] r5996: nemerle/trunk/ncc/typing/Typer.n

malekith svnadmin at nemerle.org
Tue Dec 6 12:13:12 CET 2005


Log:
Always push/pop solver stack in try-finally block.

Author: malekith
Date: Tue Dec  6 12:13:11 2005
New Revision: 5996

Modified:
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Tue Dec  6 12:13:11 2005
@@ -2126,20 +2126,31 @@
       foreach (symbol in symbols) {
         if (dump_errors) {
           foreach (op in InterpretGlobal (pt_from, symbol)) {
+            try {
             solver.PushState ();
             messenger.NeedMessage = true;
             _ = Expect (op.Type, expected, op.ToString ());
+            } finally {
             solver.PopState ();
           }
+          }
         } else {
+          def not_ok =
+            try {
           solver.PushState ();
-          def not_ok = InterpretGlobal (pt_from, symbol).IsEmpty;
+              InterpretGlobal (pt_from, symbol).IsEmpty;
+            } finally {
           solver.PopState ();
+            }
           unless (not_ok)
             foreach (op in InterpretGlobal (pt_from, symbol)) {
+              def ok =
+                try {
               solver.PushState ();
-              def ok = op.Type.Unify (expected);
+                  op.Type.Unify (expected);
+                } finally {
               solver.PopState ();
+                }
               when (ok)
                 res = op :: res;
             }
@@ -2360,9 +2371,13 @@
               else This ()
             }
             
+            def res =
+              try {
             solver.PushState ();
-            def res = Option.UnSome (TypeMember (th (), name.Id, expected));
+                Option.UnSome (TypeMember (th (), name.Id, expected));
+              } finally {
             solver.PopState ();
+              }
             if (res.IsEmpty) []
             else Option.UnSome (TypeMember (th (), name.Id, expected))
           | _ => []



More information about the svn mailing list