summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Cmarada <mcmarada@cisco.com>2019-05-29 11:08:49 +0200
committerMichal Cmarada <mcmarada@cisco.com>2019-05-29 11:08:49 +0200
commitbaa04244252b25cde53699116f74947b1389081c (patch)
treeaf3305041d95bf98b4520bd6b2da12dc3ea043f7
parent5e0ae3d2f7e2723042c462c9851c0162df683556 (diff)
fix union and object type collision
if Union is enclosed in an object with the same name two variables with same name are generated in translate function. This fixes this issue by adding "Union" suffix to union class variable Change-Id: I4158083c5f0efc409a9d4bedeca2ebedb517692e Signed-off-by: Michal Cmarada <mcmarada@cisco.com>
-rwxr-xr-xjava/jvpp/gen/jvppgen/jni_common_gen.py42
1 files changed, 32 insertions, 10 deletions
diff --git a/java/jvpp/gen/jvppgen/jni_common_gen.py b/java/jvpp/gen/jvppgen/jni_common_gen.py
index 120241a..929a197 100755
--- a/java/jvpp/gen/jvppgen/jni_common_gen.py
+++ b/java/jvpp/gen/jvppgen/jni_common_gen.py
@@ -380,16 +380,28 @@ def _generate_c2j_scalar_swap(msg_java_name, field, object_ref_name, struct_ref_
def _generate_c2j_object_swap(msg_java_name, field, object_ref_name, struct_ref_name):
field_type = field.type
- return _C2J_OBJECT_SWAP_TEMPLATE.substitute(
- java_name=field.java_name,
- class_ref_name=msg_java_name,
- jni_signature=field_type.jni_signature,
- jni_name=field_type.jni_name,
- jni_accessor=field_type.jni_accessor,
- object_ref_name=object_ref_name,
- struct_ref_name=struct_ref_name,
- net_to_host_function=field_type.net_to_host_function,
- c_name=field.name)
+ if "Union" in field_type.jni_name:
+ return _C2J_UNION_SWAP_TEMPLATE.substitute(
+ java_name=field.java_name,
+ class_ref_name=msg_java_name,
+ jni_signature=field_type.jni_signature,
+ jni_name=field_type.jni_name,
+ jni_accessor=field_type.jni_accessor,
+ object_ref_name=object_ref_name,
+ struct_ref_name=struct_ref_name,
+ net_to_host_function=field_type.net_to_host_function,
+ c_name=field.name)
+ else:
+ return _C2J_OBJECT_SWAP_TEMPLATE.substitute(
+ java_name=field.java_name,
+ class_ref_name=msg_java_name,
+ jni_signature=field_type.jni_signature,
+ jni_name=field_type.jni_name,
+ jni_accessor=field_type.jni_accessor,
+ object_ref_name=object_ref_name,
+ struct_ref_name=struct_ref_name,
+ net_to_host_function=field_type.net_to_host_function,
+ c_name=field.name)
_C2J_OBJECT_SWAP_TEMPLATE = Template("""
jfieldID ${java_name}FieldId = (*env)->GetFieldID(env, ${class_ref_name}Class, "${java_name}", "${jni_signature}");
@@ -401,6 +413,16 @@ _C2J_OBJECT_SWAP_TEMPLATE = Template("""
(*env)->DeleteLocalRef(env, ${java_name});
""")
+_C2J_UNION_SWAP_TEMPLATE = Template("""
+ jfieldID ${java_name}FieldId = (*env)->GetFieldID(env, ${class_ref_name}Class, "${java_name}", "${jni_signature}");
+ jclass ${java_name}UnionClass = (*env)->FindClass(env, "${jni_name}");
+ jmethodID ${java_name}Constructor = (*env)->GetMethodID(env, ${java_name}UnionClass, "<init>", "()V");
+ jobject ${java_name} = (*env)->NewObject(env, ${java_name}UnionClass, ${java_name}Constructor);
+ ${net_to_host_function}(env, &(${struct_ref_name}->${c_name}), ${java_name});
+ (*env)->Set${jni_accessor}Field(env, ${object_ref_name}, ${java_name}FieldId, ${java_name});
+ (*env)->DeleteLocalRef(env, ${java_name});
+""")
+
def _generate_c2j_enum_swap(msg_java_name, field, object_ref_name, struct_ref_name):
field_type = field.type