[PATCH v2 5/7] tester/gdb: mi_parser, fix on Python3 and remove globals
chrisj at rtems.org
chrisj at rtems.org
Mon Nov 26 00:56:23 UTC 2018
From: Chris Johns <chrisj at rtems.org>
- Fix mi_parser on Python3. Python3 does not support the __cmp__
operator and rich comparision operators are required, See PEP 207.
- Remove the global variables and make a class containing them. Update
the gdb class to use the mi_parser session class. Removing the globals
means the global lock in the gdb module can be removed.
---
tester/rt/gdb.py | 39 +++++++------------------
tester/rt/pygdb/__init__.py | 3 +-
tester/rt/pygdb/mi_parser.py | 69 +++++++++++++++++++++++++++++++-------------
3 files changed, 61 insertions(+), 50 deletions(-)
diff --git a/tester/rt/gdb.py b/tester/rt/gdb.py
index 2416a50..15a3862 100644
--- a/tester/rt/gdb.py
+++ b/tester/rt/gdb.py
@@ -51,15 +51,11 @@ from rtemstoolkit import path
import console
import pygdb
-#
-# The MI parser needs a global lock. It has global objects.
-#
-mi_lock = threading.Lock()
-
class gdb(object):
'''RTEMS Testing GDB base.'''
def __init__(self, bsp_arch, bsp, trace = False, mi_trace = False):
+ self.session = pygdb.mi_parser.session()
self.trace = trace
self.mi_trace = mi_trace
self.lock_trace = False
@@ -90,12 +86,6 @@ class gdb(object):
print('|] UNLOCK:%s [|' % (msg))
self.lock.release()
- def _mi_lock(self):
- mi_lock.acquire()
-
- def _mi_unlock(self):
- mi_lock.release()
-
def _put(self, text):
if self.trace:
print(')))', text)
@@ -208,15 +198,12 @@ class gdb(object):
cleanup = self._cleanup)
finally:
self._unlock('_open')
- try:
- self.gdb_console('gdb: %s' % (' '.join(cmds)))
- ec, proc = self.process.open(cmds, timeout = (timeout, self._timeout))
- if self.trace:
- print('gdb done', ec)
- if ec > 0:
- raise error.general('gdb exec: %s: %s' % (cmds[0], os.strerror(ec)))
- except:
- raise
+ self.gdb_console('gdb: %s' % (' '.join(cmds)))
+ ec, proc = self.process.open(cmds, timeout = (timeout, self._timeout))
+ if self.trace:
+ print('gdb done', ec)
+ if ec > 0:
+ raise error.general('gdb exec: %s: %s' % (cmds[0], os.strerror(ec)))
self._lock('_open')
try:
self.process = None
@@ -248,13 +235,9 @@ class gdb(object):
def gdb_parse(self, lines):
try:
- self._mi_lock()
- try:
- if self.mi_trace:
- print('mi-data:', lines)
- rec = pygdb.mi_parser.process(lines)
- finally:
- self._mi_unlock()
+ if self.mi_trace:
+ print('mi-data:', lines)
+ rec = self.session.process(lines)
if self.mi_trace:
print('mi-rec:', rec)
if rec.record_type == 'result':
@@ -302,7 +285,7 @@ class gdb(object):
self.output_buffer = self.output_buffer[last_lf + 1:]
except:
if self.trace:
- print('/// console output')
+ print('/// exception: console output')
for line in lines.splitlines():
self.output(line)
diff --git a/tester/rt/pygdb/__init__.py b/tester/rt/pygdb/__init__.py
index 00b3364..e500077 100644
--- a/tester/rt/pygdb/__init__.py
+++ b/tester/rt/pygdb/__init__.py
@@ -18,5 +18,4 @@
all = ['mi_parser']
from . import mi_parser
-scan = mi_parser.scan
-process = mi_parser.process
+session = mi_parser.session
diff --git a/tester/rt/pygdb/mi_parser.py b/tester/rt/pygdb/mi_parser.py
index dd1d08f..339587e 100755
--- a/tester/rt/pygdb/mi_parser.py
+++ b/tester/rt/pygdb/mi_parser.py
@@ -35,28 +35,48 @@ import pprint
from . import spark
-def __private():
- class Token:
+def _private():
+ class Token(object):
def __init__(self, type, value=None):
self.type = type
self.value = value
- def __cmp__(self, o):
- return cmp(self.type, o)
+ def __lt__(self, o):
+ return self.type < o
+ def __gt__(self, o):
+ return self.type > o
+ def __le__(self, o):
+ return self.type <= o
+ def __ge__(self, o):
+ return self.type >= o
+ def __eq__(self, o):
+ return self.type == o
+ def __ne__(self, o):
+ return self.type != o
def __repr__(self):
return self.value or self.type
- class AST:
+ class AST(object):
def __init__(self, type):
self.type = type
self._kids = []
def __getitem__(self, i):
return self._kids[i]
+ def __setitem__(self, i, k):
+ self._kids[i] = k
def __len__(self):
return len(self._kids)
- def __setslice__(self, low, high, seq):
- self._kids[low:high] = seq
- def __cmp__(self, o):
- return cmp(self.type, o)
+ def __lt__(self, o):
+ return self.type < o
+ def __gt__(self, o):
+ return self.type > o
+ def __le__(self, o):
+ return self.type <= o
+ def __ge__(self, o):
+ return self.type >= o
+ def __eq__(self, o):
+ return self.type == o
+ def __ne__(self, o):
+ return self.type != o
class GdbMiScannerBase(spark.GenericScanner):
def tokenize(self, input):
@@ -300,7 +320,7 @@ def __private():
#def default(self, node):
#print 'default: ' + node.type
- class GdbDynamicObject:
+ class GdbDynamicObject(object):
def __init__(self, dict_):
self.graft(dict_)
@@ -355,20 +375,29 @@ def __private():
return (GdbMiScanner(), GdbMiParser(), GdbMiInterpreter, GdbMiRecord)
-(__the_scanner, __the_parser, __the_interpreter, __the_output) = __private()
-def scan(input):
- return __the_scanner.tokenize(input)
+class session(object):
+ def __init__(self):
+ (self.the_scanner,
+ self.the_parser,
+ self.the_interpreter,
+ self.the_output) = _private()
-def parse(tokens):
- return __the_parser.parse(tokens)
+ def scan(self, input):
+ return self.the_scanner.tokenize(input)
-def process(input):
- tokens = scan(input)
- ast = parse(tokens)
- __the_interpreter(ast)
- return __the_output(ast.value)
+ def parse(self, tokens):
+ return self.the_parser.parse(tokens)
+ def process(self, input):
+ tokens = self.scan(input)
+ ast = self.parse(tokens)
+ self.the_interpreter(ast)
+ return self.the_output(ast.value)
+
+#
+# Not updated with the session class
+#
if __name__ == '__main__':
def main():
def print_tokens(tokens):
--
2.14.1
More information about the devel
mailing list