Improved py_callback exception handling and code cleanup.

parent 3d541647
...@@ -88,45 +88,41 @@ cdef public object py_callback(object parser, char *target, int option, \ ...@@ -88,45 +88,41 @@ cdef public object py_callback(object parser, char *target, int option, \
#if parser.verbose: #if parser.verbose:
# print 'py_callback: called with nargs=%d' % nargs # print 'py_callback: called with nargs=%d' % nargs
try: names = PyList_New(nargs)
names = PyList_New(nargs) values = PyList_New(nargs)
values = PyList_New(nargs)
Py_INCREF(names) Py_INCREF(names)
Py_INCREF(values) Py_INCREF(values)
#for i in range(nargs): #for i in range(nargs):
# print 'i=%d' % i , <char*>va_arg(ap, str_type), \ # print 'i=%d' % i , <char*>va_arg(ap, str_type), \
# hex(<int>va_arg(ap, str_type)) # hex(<int>va_arg(ap, str_type))
for i in range(nargs): for i in range(nargs):
termname = <char*>va_arg(ap, str_type) termname = <char*>va_arg(ap, str_type)
PyList_SetItem(names, i, termname) PyList_SetItem(names, i, termname)
Py_INCREF(termname) Py_INCREF(termname)
val = <void *>va_arg(ap, void_type) val = <void *>va_arg(ap, void_type)
valobj = <object>val valobj = <object>val
PyList_SetItem(values, i, valobj) PyList_SetItem(values, i, valobj)
Py_INCREF(valobj) Py_INCREF(valobj)
#if parser.verbose: #if parser.verbose:
# print 'py_callback: calling handler:', \ # print 'py_callback: calling handler:', \
# (target, option, names, values) # (target, option, names, values)
# Set the signal handler and a timeout alarm # Set the signal handler and a timeout alarm
#signal.signal(signal.SIGALRM, parser.handle_timeout) #signal.signal(signal.SIGALRM, parser.handle_timeout)
#signal.alarm(parser.timeout) #signal.alarm(parser.timeout)
res = parser._handle(target, option, names, values) res = parser._handle(target, option, names, values)
#signal.alarm(0) #signal.alarm(0)
#if parser.verbose: #if parser.verbose:
# print 'py_callback: handler returned:', res # print 'py_callback: handler returned:', res
except:
traceback.print_exc()
res = None
va_end(ap) va_end(ap)
...@@ -138,7 +134,7 @@ cdef public void py_input(object parser, char *buf, int *result, int max_size): ...@@ -138,7 +134,7 @@ cdef public void py_input(object parser, char *buf, int *result, int max_size):
cdef int buflen cdef int buflen
if parser.verbose: if parser.verbose:
print "\npy_input: want to read up to %s bytes" % max_size print '\npy_input: want to read up to %s bytes' % max_size
raw = parser.read(max_size) raw = parser.read(max_size)
buflen = PyInt_AsLong(len(raw)) buflen = PyInt_AsLong(len(raw))
...@@ -146,7 +142,7 @@ cdef public void py_input(object parser, char *buf, int *result, int max_size): ...@@ -146,7 +142,7 @@ cdef public void py_input(object parser, char *buf, int *result, int max_size):
memcpy(buf, PyString_AsString(raw), buflen) memcpy(buf, PyString_AsString(raw), buflen)
if parser.verbose: if parser.verbose:
print "\npy_input: got %s bytes" % buflen print '\npy_input: got %s bytes' % buflen
import sys, os, sha, re, imp, traceback import sys, os, sha, re, imp, traceback
...@@ -158,7 +154,7 @@ import distutils.ccompiler ...@@ -158,7 +154,7 @@ import distutils.ccompiler
reSpaces = re.compile("\\s+") reSpaces = re.compile("\\s+")
#unquoted = r"""^|[^'"]%s[^'"]?""" #unquoted = r"""^|[^'"]%s[^'"]?"""
unquoted = "[^'\"]%s[^'\"]?" unquoted = '[^\'"]%s[^\'"]?'
cdef class ParserEngine: cdef class ParserEngine:
""" """
...@@ -263,19 +259,19 @@ cdef class ParserEngine: ...@@ -263,19 +259,19 @@ cdef class ParserEngine:
parser = self.parser parser = self.parser
if parser.verbose: if parser.verbose:
print "Opening library %s" % self.libFilename_py print 'Opening library %s' % self.libFilename_py
handle = bisondynlib_open(libFilename) handle = bisondynlib_open(libFilename)
self.libHandle = handle self.libHandle = handle
err = bisondynlib_err() err = bisondynlib_err()
if err: if err:
printf("ParserEngine.openLib: error '%s'\n", err) printf('ParserEngine.openLib: error "%s"\n', err)
return return
# extract symbols # extract symbols
self.libHash = bisondynlib_lookup_hash(handle) self.libHash = bisondynlib_lookup_hash(handle)
if parser.verbose: if parser.verbose:
print "Successfully loaded library" print 'Successfully loaded library'
def buildLib(self): def buildLib(self):
""" """
...@@ -294,14 +290,16 @@ cdef class ParserEngine: ...@@ -294,14 +290,16 @@ cdef class ParserEngine:
# rip the pertinent grammar specs from parser class # rip the pertinent grammar specs from parser class
parser = self.parser parser = self.parser
# get target handler methods, in the order of appearance in the source # get target handler methods, in the order of appearance in the
# file. # source file.
attribs = dir(parser) attribs = dir(parser)
gHandlers = [] gHandlers = []
for a in attribs: for a in attribs:
if a.startswith("on_"): if a.startswith('on_'):
method = getattr(parser, a) method = getattr(parser, a)
gHandlers.append(method) gHandlers.append(method)
gHandlers.sort(cmpLines) gHandlers.sort(cmpLines)
# get start symbol, tokens, precedences, lex script # get start symbol, tokens, precedences, lex script
......
...@@ -320,11 +320,20 @@ class BisonParser(object): ...@@ -320,11 +320,20 @@ class BisonParser(object):
except: except:
hdlrline = handler.__init__.func_code.co_firstlineno hdlrline = handler.__init__.func_code.co_firstlineno
print '_handle: invoking handler at line %s for "%s"' \ print 'BisonParser._handle: call handler at line %s with: %s' \
% (hdlrline, targetname) % (hdlrline, str((targetname, option, names, values)))
try:
self.last = handler(target=targetname, option=option, names=names,
values=values)
except Exception as e:
self.lasterror = e
print type(e), str(e)
#traceback.print_last()
#traceback.print_stack()
traceback.print_stack()
raise
self.last = handler(target=targetname, option=option, names=names,
values=values)
#if self.verbose: #if self.verbose:
# print 'handler for %s returned %s' \ # print 'handler for %s returned %s' \
# % (targetname, repr(self.last)) # % (targetname, repr(self.last))
...@@ -334,6 +343,8 @@ class BisonParser(object): ...@@ -334,6 +343,8 @@ class BisonParser(object):
self.last = BisonNode(targetname, option=option, names=names, values=values) self.last = BisonNode(targetname, option=option, names=names, values=values)
# reset any resulting errors (assume they've been handled) # reset any resulting errors (assume they've been handled)
if self.lasterror:
print 'lasterror:', self.lasterror
#self.lasterror = None #self.lasterror = None
# assumedly the last thing parsed is at the top of the tree # assumedly the last thing parsed is at the top of the tree
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment