From e02884a94f37871fd2d44cfedd3e9ef9f28f0464 Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Sat, 24 Mar 2018 22:56:52 +0000 Subject: [PATCH] error handling --- CXX/yapi.cpp | 15 +++---- packages/python/swig/yap4py/yapi.py | 65 +++++++++++++++-------------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/CXX/yapi.cpp b/CXX/yapi.cpp index 85b6e6fb3..0802b719d 100644 --- a/CXX/yapi.cpp +++ b/CXX/yapi.cpp @@ -437,6 +437,7 @@ bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) { LOCAL_RestartEnv = &buf; if (sigsetjmp(*LOCAL_RestartEnv, false)) { std::cerr << "Restart\n"; + throw *new YAPError(); //q.e = new YAPError(); } // don't forget, on success these bindings will still be there); @@ -490,7 +491,7 @@ bool YAPEngine::mgoal(Term t, Term tmod) { if (sigsetjmp(*LOCAL_RestartEnv, false)) { // PyEval_RestoreThread(_save); std::cerr << "Restart\n"; - //throw new YAPError(); + throw *new YAPError(); } // don't forget, on success these guys may create slots __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec "); @@ -567,10 +568,7 @@ Term YAPEngine::fun(Term t) { sigjmp_buf buf, *oldp = LOCAL_RestartEnv; LOCAL_RestartEnv = &buf; if (sigsetjmp(*LOCAL_RestartEnv, false)) { - // throw new YAPError(); - LOCAL_RestartEnv = oldp; - RECOVER_MACHINE_REGS(); - return 0; + throw *new YAPError(); } // don't forget, on success these guys may create slots __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec "); @@ -693,7 +691,7 @@ bool YAPQuery::next() { return false; LOCAL_RestartEnv = &buf; if (sigsetjmp(*LOCAL_RestartEnv, false)) { - //e = new YAPError(); + throw *new YAPError(); } // don't forget, on success these guys may create slots __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec "); @@ -712,10 +710,9 @@ bool YAPQuery::next() { } q_state = 1; if ((terr = Yap_PeekException())) { - LOCAL_RestartEnv = &buf; + throw * new YAPError(); - result = false; - } + } __android_log_print(ANDROID_LOG_INFO, "YAPDroid", "out %d", result); if (!result) { diff --git a/packages/python/swig/yap4py/yapi.py b/packages/python/swig/yap4py/yapi.py index a26d3b007..56ba37a59 100644 --- a/packages/python/swig/yap4py/yapi.py +++ b/packages/python/swig/yap4py/yapi.py @@ -144,38 +144,41 @@ class YAPShell: # if not isinstance(eq[0],str): # print( "Error: Variable Name matches a Python Symbol") # return - self.do_ask = True - engine = self.engine - bindings = [] - g = python_query(self, query) - if not self.q: - self.q = Query( engine, g ) - for bind in self.q: - bindings += [bind] - if self.do_ask: - print(bindings) - bindings = [] + try: + engine = self.engine + bindings = [] + loop = False + g = python_query(self, query) + if not self.q: + self.q = Query( engine, g ) + for bind in self.q: + bindings += [bind] + if loop: + continue + if not self.q: + break s = input("more(;), all(*), no(\\n), python(#) ?").lstrip() - else: - s = ";" - if s.startswith(';') or s.startswith('y'): - continue - elif s.startswith('#'): - try: - exec(s.lstrip('#')) - except: - raise - elif s.startswith('*') or s.startswith('a'): - self.do_ask = False - continue - else: - break - if self.q: - self.os = query - if bindings: - return True,bindings - print("No (more) answers") - return False, None + if s.startswith(';') or s.startswith('y'): + continue + elif s.startswith('#'): + try: + exec(s.lstrip('#')) + except: + raise + elif s.startswith('*') or s.startswith('a'): + loop = True + continue + else: + break + if self.q: + self.os = query + if bindings: + return True,bindings + print("No (more) answers") + return False, None + except e: + print("Exception") + print(e) def live(self, engine, **kwargs):