Loading scripts/qapi.py +23 −22 Original line number Diff line number Diff line Loading @@ -268,44 +268,45 @@ class QAPISchemaParser(object): continue expr = self.get_expr(False) if isinstance(expr, dict) and "include" in expr: if 'include' in expr: if len(expr) != 1: raise QAPISemError(info, "Invalid 'include' directive") include = expr["include"] if not isinstance(include, str): raise QAPISemError(info, "Value of 'include' must be a string") incl_abs_fname = os.path.join(os.path.dirname(abs_fname), include) self._include(include, info, os.path.dirname(abs_fname), previously_included) else: expr_elem = {'expr': expr, 'info': info} if (self.docs and self.docs[-1].info['file'] == fname and not self.docs[-1].expr): self.docs[-1].expr = expr expr_elem['doc'] = self.docs[-1] self.exprs.append(expr_elem) def _include(self, include, info, base_dir, previously_included): incl_abs_fname = os.path.join(base_dir, include) # catch inclusion cycle inf = info while inf: if incl_abs_fname == os.path.abspath(inf['file']): raise QAPISemError(info, "Inclusion loop for %s" % include) raise QAPISemError(info, "Inclusion loop for %s" % include) inf = inf['parent'] # skip multiple include of the same file if incl_abs_fname in previously_included: continue return try: fobj = open(incl_abs_fname, 'r') except IOError as e: raise QAPISemError(info, '%s: %s' % (e.strerror, include)) exprs_include = QAPISchemaParser(fobj, previously_included, info) exprs_include = QAPISchemaParser(fobj, previously_included, info) self.exprs.extend(exprs_include.exprs) self.docs.extend(exprs_include.docs) else: expr_elem = {'expr': expr, 'info': info} if (self.docs and self.docs[-1].info['file'] == fname and not self.docs[-1].expr): self.docs[-1].expr = expr expr_elem['doc'] = self.docs[-1] self.exprs.append(expr_elem) def accept(self, skip_comment=True): while True: Loading Loading
scripts/qapi.py +23 −22 Original line number Diff line number Diff line Loading @@ -268,44 +268,45 @@ class QAPISchemaParser(object): continue expr = self.get_expr(False) if isinstance(expr, dict) and "include" in expr: if 'include' in expr: if len(expr) != 1: raise QAPISemError(info, "Invalid 'include' directive") include = expr["include"] if not isinstance(include, str): raise QAPISemError(info, "Value of 'include' must be a string") incl_abs_fname = os.path.join(os.path.dirname(abs_fname), include) self._include(include, info, os.path.dirname(abs_fname), previously_included) else: expr_elem = {'expr': expr, 'info': info} if (self.docs and self.docs[-1].info['file'] == fname and not self.docs[-1].expr): self.docs[-1].expr = expr expr_elem['doc'] = self.docs[-1] self.exprs.append(expr_elem) def _include(self, include, info, base_dir, previously_included): incl_abs_fname = os.path.join(base_dir, include) # catch inclusion cycle inf = info while inf: if incl_abs_fname == os.path.abspath(inf['file']): raise QAPISemError(info, "Inclusion loop for %s" % include) raise QAPISemError(info, "Inclusion loop for %s" % include) inf = inf['parent'] # skip multiple include of the same file if incl_abs_fname in previously_included: continue return try: fobj = open(incl_abs_fname, 'r') except IOError as e: raise QAPISemError(info, '%s: %s' % (e.strerror, include)) exprs_include = QAPISchemaParser(fobj, previously_included, info) exprs_include = QAPISchemaParser(fobj, previously_included, info) self.exprs.extend(exprs_include.exprs) self.docs.extend(exprs_include.docs) else: expr_elem = {'expr': expr, 'info': info} if (self.docs and self.docs[-1].info['file'] == fname and not self.docs[-1].expr): self.docs[-1].expr = expr expr_elem['doc'] = self.docs[-1] self.exprs.append(expr_elem) def accept(self, skip_comment=True): while True: Loading