X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=extras%2Fjapi%2Fjava%2Fjvpp%2Fgen%2Fjvppgen%2Fjvpp_model.py;h=da1e01f5a63458abb51e4321fd43513397fe5890;hb=413f4a5;hp=3c2db15d176b0bf6764b4065fb84524279aa85a6;hpb=53fffa1db7cb04982db8977acd61b808ef60d5a8;p=vpp.git diff --git a/extras/japi/java/jvpp/gen/jvppgen/jvpp_model.py b/extras/japi/java/jvpp/gen/jvppgen/jvpp_model.py index 3c2db15d176..da1e01f5a63 100755 --- a/extras/japi/java/jvpp/gen/jvppgen/jvpp_model.py +++ b/extras/japi/java/jvpp/gen/jvppgen/jvpp_model.py @@ -17,6 +17,8 @@ import json import pprint from collections import OrderedDict +import binascii + BASE_PACKAGE = "io.fd.vpp.jvpp" @@ -90,9 +92,11 @@ class SimpleType(Type): # TODO(VPP-1187): add array host to net functions to reduce number of members and simplify JNI generation class Array(Type): - def __init__(self, base_type): + def __init__(self, base_type, name=None): + if name is None: + name = base_type.name + _ARRAY_SUFFIX super(Array, self).__init__( - name=base_type.name + _ARRAY_SUFFIX, + name=name, java_name=base_type.java_name + _ARRAY_SUFFIX, java_name_fqn=base_type.java_name_fqn + _ARRAY_SUFFIX, jni_signature="[%s" % base_type.jni_signature, @@ -303,6 +307,11 @@ def is_control_ping_reply(msg): return msg.name == u'control_ping_reply' +def crc(block): + s = str(block).encode() + return binascii.crc32(s) & 0xffffffff + + class JVppModel(object): def __init__(self, logger, json_api_files, plugin_name): self.logger = logger @@ -333,8 +342,45 @@ class JVppModel(object): self._parse_types(types) + def _parse_aliases(self, types): + + # model aliases + for alias_name in self._aliases: + alias = self._aliases[alias_name] + alias_type = {"type": "type"} + java_name_lower = _underscore_to_camelcase_lower(alias_name) + vpp_type = alias["type"] + crc_value = '0x%08x' % crc(alias_name) + if "length" in alias: + length = alias["length"] + alias_type["data"] = [ + alias_name, + [ + vpp_type, + java_name_lower, + length + ], + { + "crc": crc_value + } + ] + else: + alias_type["data"] = [ + alias_name, + [ + vpp_type, + java_name_lower + ], + { + "crc": crc_value + } + ] + + types[alias_name] = alias_type + def _parse_types(self, types): self._parse_simple_types() + self._parse_aliases(types) i = 0 while True: unresolved = {} @@ -400,7 +446,10 @@ class JVppModel(object): 'i64': SimpleType('i64', 'long', 'J', 'jlong', 'Long', host_to_net_function='clib_host_to_net_i64', net_to_host_function='clib_net_to_host_i64'), - 'f64': SimpleType('f64', 'double', 'D', 'jdouble', 'Double') + 'f64': SimpleType('f64', 'double', 'D', 'jdouble', 'Double'), + 'string': SimpleType('string', 'String', 'l', 'jstring', 'Object', + host_to_net_function='_host_to_net_string', + net_to_host_function='_net_to_host_string') }) for n, t in self._types_by_name.items(): @@ -484,9 +533,6 @@ class JVppModel(object): def _parse_field(self, field, fields): type_name = _extract_type_name(field[0]) - if type_name in self._aliases and type_name not in self._types_by_name: - aliased_type = self._types_by_name.get(self._aliases.get(type_name).get("type")) - self._types_by_name[type_name] = aliased_type if type_name in self._types_by_name: if len(field) > 2: @@ -524,6 +570,7 @@ class JVppModel(object): self.messages = self._messages_by_name.values() + _ARRAY_SUFFIX = '[]'