Procházet zdrojové kódy

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>
Wenchao Xia před 11 roky
rodič
revize
515b943a91
1 změnil soubory, kde provedl 8 přidání a 6 odebrání
  1. 8 6
      scripts/qapi.py

+ 8 - 6
scripts/qapi.py

@@ -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
-            elif ch == '\t':
+        self.col = 1
+        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 @@ def __init__(self, fp):
         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 @@ def accept(self):
                 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)