]> hydra-www.ietfng.org Git - dyna2/commitdiff
minor tweaks.
authorTim Vieira <tim.f.vieira@gmail.com>
Thu, 18 Jul 2013 14:59:49 +0000 (10:59 -0400)
committerTim Vieira <tim.f.vieira@gmail.com>
Thu, 18 Jul 2013 14:59:49 +0000 (10:59 -0400)
src/Dyna/Backend/Python/dyna_doctest.py
src/Dyna/Backend/Python/interpreter.py

index 244df58bcef0f539d9a679737446d2289a16d7c8..ee89f938bb467649c630a508128cdb59b8613ffa 100644 (file)
@@ -1,10 +1,8 @@
 #!/usr/bin/env python
-import re, sys
-
+import re, sys, traceback
 from interpreter import Interpreter
 from repl import REPL
 from cStringIO import StringIO
-
 from utils import red, green, yellow, strip_comments
 
 
@@ -56,6 +54,8 @@ def run(code, out=None):
         sys.stdout = x = StringIO()
         try:
             repl.onecmd(cmd)
+        except:
+            print >> out, red % traceback.format_exc()
         finally:
             sys.stdout = sys.__stdout__
 
index 6f17887d353ae97274f49fa645271fa9febc3998..e8bac8ae046d23c583c85b732e0fa4dfd7eea7c2 100644 (file)
@@ -143,8 +143,7 @@ class Interpreter(object):
         if was is not None:
             self.push(item, was, delete=True)
         # clear existing errors -- we only care about errors at new value.
-        if item in self.error:
-            del self.error[item]
+        self.clear_error(item)
         # new value enters in the chart.
         item.value = now
         # push changes
@@ -186,7 +185,7 @@ class Interpreter(object):
             # handle error in aggregator
             now = Error()
             self.replace(item, now)
-            self.error[item] = (None, [(e, None)])
+            self.set_error(item, (None, [(e, None)]))
 
         else:
             # issue replacement update
@@ -227,7 +226,7 @@ class Interpreter(object):
                 error.append((e, handler))
 
         if error:
-            self.error[item] = (val, error)
+            self.set_error(item, (val, error))
             return
 
         # no exceptions, accept emissions.
@@ -254,7 +253,7 @@ class Interpreter(object):
         def t_emit(item, val, ruleix, variables):
             emits.append((item, val, ruleix, variables, False))
 
-        error = []
+        errors = []
 
         for handler in self._gbc[item.fn]:
             try:
@@ -262,12 +261,11 @@ class Interpreter(object):
             except (ZeroDivisionError, TypeError, KeyboardInterrupt, RuntimeError, OverflowError) as e:
                 e.exception_frame = rule_error_context()
                 e.traceback = traceback.format_exc()
-                error.append((e, handler))
+                errors.append((e, handler))
 
-        if error:
-            self.error[item] = (None, error)
-            now = Error()
-            return now
+        if errors:
+            self.set_error(item, (None, errors))
+            return Error()
 
         else:
             # no exceptions, accept emissions.
@@ -333,16 +331,13 @@ class Interpreter(object):
                 def _emit(*args):
                     emits.append(args)
 
-                # clear error, if any
-                if rule in self.error:
-                    del self.error[rule]
-
+                self.clear_error(rule)  # clear errors on rule, if any
                 rule.init(emit=_emit)
 
             except (ZeroDivisionError, TypeError, KeyboardInterrupt, RuntimeError, OverflowError) as e:
                 e.exception_frame = rule_error_context()
                 e.traceback = traceback.format_exc()
-                self.error[rule] = e
+                self.set_error(rule, e)
                 failed.append(rule)
             else:
                 rule.initialized = True
@@ -351,6 +346,16 @@ class Interpreter(object):
                     self.emit(*e, delete=False)
         self.uninitialized_rules = failed
 
+    #___________________________________________________________________________
+    # Error tracking
+
+    def clear_error(self, x):
+        if x in self.error:
+            del self.error[x]
+
+    def set_error(self, x, e):
+        self.error[x] = e
+
     #___________________________________________________________________________
     # Adding/removing rules
 
@@ -463,8 +468,7 @@ class Interpreter(object):
                 # update values before propagating
                 for head in self.chart[rule.head_fn].intern.values():
 
-                    if head in self.error:
-                        del self.error[head]
+                    self.clear_error(head)
 
                     def _emit(item, val, ruleix, variables):
                         item.aggregator.dec(val, ruleix, variables)
@@ -599,7 +603,14 @@ class Interpreter(object):
                         print >> out, '    %s more ...' % (len(E[r][etype]) - i)
                         break
                     print >> out, '    when `%s` = %s' % (item, _repr(value))
-                    print >> out, '      %s' % (e)
+
+                    if 'maximum recursion depth exceeded' in str(e):
+                        # simplify recurision limit error because if prints some
+                        # unstable stuff.
+                        print >> out, '      maximum recursion depth exceeded'
+                    else:
+                        print >> out, '      %s' % (e)
+
                     print >> out
                     print >> out, r.render_ctx(e.exception_frame, indent='      ')
                     print >> out