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:
parent
4b35991a3b
commit
515b943a91
|
@ -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
|
|
||||||
for ch in schema.src[0:schema.pos]:
|
|
||||||
if ch == '\n':
|
|
||||||
self.line += 1
|
|
||||||
self.col = 1
|
self.col = 1
|
||||||
elif ch == '\t':
|
self.line = schema.line
|
||||||
|
for ch in schema.src[schema.line_pos:schema.pos]:
|
||||||
|
if 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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue