X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvpp-api%2Fvapi%2Fvapi_json_parser.py;h=d0f8de03617897fb8119786393e0544557dcdc6f;hb=2959d42fe;hp=2c08b90a93beedd5d9a49a71554b7e86836b6926;hpb=89fec713f84b8f567c52743c9c514ac29297fbda;p=vpp.git diff --git a/src/vpp-api/vapi/vapi_json_parser.py b/src/vpp-api/vapi/vapi_json_parser.py index 2c08b90a93b..d0f8de03617 100644 --- a/src/vpp-api/vapi/vapi_json_parser.py +++ b/src/vpp-api/vapi/vapi_json_parser.py @@ -167,45 +167,9 @@ class Message(object): else: field_type = json_parser.lookup_type_like_id(field[0]) logger.debug("Parsing message field `%s'" % field) - if len(field) == 2: - if self.header is not None and\ - self.header.has_field(field[1]): - continue - p = field_class(field_name=field[1], - field_type=field_type) - elif len(field) == 3: - if field[2] == 0: - raise ParseError( - "While parsing message `%s': variable length " - "array `%s' doesn't have reference to member " - "containing the actual length" % ( - name, field[1])) - p = field_class( - field_name=field[1], - field_type=field_type, - array_len=field[2]) - elif len(field) == 4: - nelem_field = None - for f in fields: - if f.name == field[3]: - nelem_field = f - if nelem_field is None: - raise ParseError( - "While parsing message `%s': couldn't find " - "variable length array `%s' member containing " - "the actual length `%s'" % ( - name, field[1], field[3])) - p = field_class( - field_name=field[1], - field_type=field_type, - array_len=field[2], - nelem_field=nelem_field) - else: - raise Exception("Don't know how to parse message " - "definition for message `%s': `%s'" % - (m, m[1:])) - logger.debug("Parsed field `%s'" % p) - fields.append(p) + f = parse_field(field_class, fields, field, field_type) + logger.debug("Parsed field `%s'" % f) + fields.append(f) self.fields = fields self.depends = [f.type for f in self.fields] logger.debug("Parsed message: %s" % self) @@ -217,6 +181,48 @@ class Message(object): self.crc) +def parse_field(field_class, fields, field, field_type): + l = len(field) + if l > 2: + if type(field[2]) is dict: + if "limit" in field[2]: + array_len = field[2]["limit"] + else: + l -= 1 + else: + array_len = field[2] + + if l == 2: + return field_class(field_name=field[1], + field_type=field_type) + elif l == 3: + if field[2] == 0: + raise ParseError("While parsing type `%s': array `%s' has " + "variable length" % (name, field[1])) + return field_class(field_name=field[1], + field_type=field_type, + array_len=array_len) + elif l == 4: + nelem_field = None + for f in fields: + if f.name == field[3]: + nelem_field = f + if nelem_field is None: + raise ParseError( + "While parsing message `%s': couldn't find " + "variable length array `%s' member containing " + "the actual length `%s'" % ( + name, field[1], field[3])) + return field_class(field_name=field[1], + field_type=field_type, + array_len=array_len, + nelem_field=nelem_field) + else: + raise ParseError( + "Don't know how to parse field `%s' of type definition " + "for type `%s'" % (field, t)) + + class StructType (Type, Struct): def __init__(self, definition, json_parser, field_class, logger): @@ -230,36 +236,8 @@ class StructType (Type, Struct): continue field_type = json_parser.lookup_type_like_id(field[0]) logger.debug("Parsing type field `%s'" % field) - if len(field) == 2: - p = field_class(field_name=field[1], - field_type=field_type) - elif len(field) == 3: - if field[2] == 0: - raise ParseError("While parsing type `%s': array `%s' has " - "variable length" % (name, field[1])) - p = field_class(field_name=field[1], - field_type=field_type, - array_len=field[2]) - elif len(field) == 4: - nelem_field = None - for f in fields: - if f.name == field[3]: - nelem_field = f - if nelem_field is None: - raise ParseError( - "While parsing message `%s': couldn't find " - "variable length array `%s' member containing " - "the actual length `%s'" % ( - name, field[1], field[3])) - p = field_class(field_name=field[1], - field_type=field_type, - array_len=field[2], - nelem_field=nelem_field) - else: - raise ParseError( - "Don't know how to parse field `%s' of type definition " - "for type `%s'" % (field, t)) - fields.append(p) + f = parse_field(field_class, fields, field, field_type) + fields.append(f) Type.__init__(self, name) Struct.__init__(self, name, fields) @@ -298,7 +276,7 @@ class JsonParser(object): x: simple_type_class(x) for x in [ 'i8', 'i16', 'i32', 'i64', 'u8', 'u16', 'u32', 'u64', - 'f64' + 'f64', 'bool' ] } @@ -362,9 +340,8 @@ class JsonParser(object): continue try: type_pairs = [[self.lookup_type_like_id(t), n] - for t, n in u[1:-1]] - crc = u[-1]["crc"] - union = self.union_class(name, type_pairs, crc) + for t, n in u[1:]] + union = self.union_class(name, type_pairs, 0) progress = progress + 1 except ParseError as e: exceptions.append(e)