qapi script: remember line number in schema parsing

Before this patch, 'QAPISchemaError' scans whole input until 'pos'
to get error line number. After this patch, the scan is avoided since
line number is remembered in schema parsing. This patch also benefits
other error report functions, which would be introduced later.

Signed-off-by: Wenchao Xia <wenchaoqemu@gmail.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
Wenchao Xia 2014-03-04 18:44:33 -08:00 committed by Luiz Capitulino
parent 4b35991a3b
commit 515b943a91

View file

@ -39,12 +39,10 @@ class QAPISchemaError(Exception):
def __init__(self, schema, msg): def __init__(self, schema, msg):
self.fp = schema.fp self.fp = schema.fp
self.msg = msg self.msg = msg
self.line = self.col = 1 self.col = 1
for ch in schema.src[0:schema.pos]: self.line = schema.line
if ch == '\n': for ch in schema.src[schema.line_pos:schema.pos]:
self.line += 1 if ch == '\t':
self.col = 1
elif ch == '\t':
self.col = (self.col + 7) % 8 + 1 self.col = (self.col + 7) % 8 + 1
else: else:
self.col += 1 self.col += 1
@ -60,6 +58,8 @@ class QAPISchema:
if self.src == '' or self.src[-1] != '\n': if self.src == '' or self.src[-1] != '\n':
self.src += '\n' self.src += '\n'
self.cursor = 0 self.cursor = 0
self.line = 1
self.line_pos = 0
self.exprs = [] self.exprs = []
self.accept() self.accept()
@ -100,6 +100,8 @@ class QAPISchema:
if self.cursor == len(self.src): if self.cursor == len(self.src):
self.tok = None self.tok = None
return return
self.line += 1
self.line_pos = self.cursor
elif not self.tok.isspace(): elif not self.tok.isspace():
raise QAPISchemaError(self, 'Stray "%s"' % self.tok) raise QAPISchemaError(self, 'Stray "%s"' % self.tok)