summaryrefslogtreecommitdiffstats
path: root/vpp-api/java/jvpp/gen
diff options
context:
space:
mode:
authorMarek Gradzki <mgradzki@cisco.com>2016-05-24 13:32:26 +0200
committerMarek Gradzki <mgradzki@cisco.com>2016-05-24 15:44:28 +0000
commitc4cb44c05d121da2e0f0ccd39d5e1bf470731a85 (patch)
tree09fcf64e9fb23053baa775b23ec4e33d2a97cebb /vpp-api/java/jvpp/gen
parent4a71314e0bee9f0fc236190a2a6df957adef67f6 (diff)
VPP-86: fix array copy in generated JNI code
Change-Id: Ic67b3c0623d98c5ee3f1ffa1e1bd9cfb96b233bd Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
Diffstat (limited to 'vpp-api/java/jvpp/gen')
-rw-r--r--vpp-api/java/jvpp/gen/jvpp_c_gen.py34
-rwxr-xr-xvpp-api/java/jvpp/gen/jvpp_gen.py13
2 files changed, 29 insertions, 18 deletions
diff --git a/vpp-api/java/jvpp/gen/jvpp_c_gen.py b/vpp-api/java/jvpp/gen/jvpp_c_gen.py
index e277976c720..c02c826fc49 100644
--- a/vpp-api/java/jvpp/gen/jvpp_c_gen.py
+++ b/vpp-api/java/jvpp/gen/jvpp_c_gen.py
@@ -89,7 +89,8 @@ u64_struct_setter_template = Template("""
u8_array_struct_setter_template = Template("""
{
jsize cnt = (*env)->GetArrayLength (env, ${java_name});
- if (cnt > sizeof(mp->${c_name})) cnt = sizeof(mp->${c_name});
+ size_t max_size = ${field_length};
+ if (max_size != 0 && cnt > max_size) cnt = max_size;
(*env)->GetByteArrayRegion(env, ${java_name}, 0, cnt, (jbyte *)mp->${c_name});
}
""")
@@ -97,8 +98,11 @@ u8_array_struct_setter_template = Template("""
u32_array_struct_setter_template = Template("""
jint * ${java_name}ArrayElements = (*env)->GetIntArrayElements(env, ${java_name}, NULL);
{
- int _i;
- for (_i = 0; _i < 0; _i++) {
+ size_t _i;
+ jsize cnt = (*env)->GetArrayLength (env, ${java_name});
+ size_t max_size = ${field_length};
+ if (max_size != 0 && cnt > max_size) cnt = max_size;
+ for (_i = 0; _i < cnt; _i++) {
mp->${c_name}[_i] = clib_host_to_net_u32(${java_name}ArrayElements[_i]);
}
}
@@ -180,16 +184,18 @@ def generate_jni_impl(func_list, inputfile):
jni_getter=jni_getter)
# field setters
- for t in zip(f['c_types'], f['args']):
+ for t in zip(f['c_types'], f['args'], f['lengths']):
c_type = t[0]
c_name = t[1]
+ field_length = t[2]
java_field_name = util.underscore_to_camelcase(c_name)
struct_setter_template = struct_setter_templates[c_type]
struct_setters += struct_setter_template.substitute(
c_name=c_name,
- java_name=java_field_name)
+ java_name=java_field_name,
+ field_length=field_length)
jni_impl.append(jni_impl_template.substitute(
inputfile=inputfile,
@@ -221,23 +227,23 @@ u64_dto_field_setter_template = Template("""
""")
u8_array_dto_field_setter_template = Template("""
- jbyteArray ${java_name} = (*env)->NewByteArray(env, sizeof(mp->${c_name}));
- (*env)->SetByteArrayRegion(env, ${java_name}, 0, sizeof(mp->${c_name}), (const jbyte*)mp->${c_name});
+ jbyteArray ${java_name} = (*env)->NewByteArray(env, ${field_length});
+ (*env)->SetByteArrayRegion(env, ${java_name}, 0, ${field_length}, (const jbyte*)mp->${c_name});
(*env)->SetObjectField(env, dto, ${java_name}FieldId, ${java_name});
""")
# For each u64 array we get its elements. Then we convert values to host byte order.
# All changes to jint* buffer are written to jlongArray (isCopy is set to NULL)
u64_array_dto_field_setter_template = Template("""
- jlongArray ${java_name} = (*env)->NewLongArray(env, sizeof(mp->${c_name}));
{
+ jlongArray ${java_name} = (*env)->NewLongArray(env, ${field_length});
jlong * ${java_name}ArrayElements = (*env)->GetLongArrayElements(env, ${java_name}, NULL);
- int _i;
- for (_i = 0; _i < 0; _i++) {
+ unsigned int _i;
+ for (_i = 0; _i < ${field_length}; _i++) {
${java_name}ArrayElements[_i] = clib_net_to_host_u64(mp->${c_name}[_i]);
}
+ (*env)->SetObjectField(env, dto, ${java_name}FieldId, ${java_name});
}
- (*env)->SetObjectField(env, dto, ${java_name}FieldId, ${java_name});
""")
dto_field_setter_templates = {'u8': default_dto_field_setter_template,
@@ -282,10 +288,11 @@ def generate_msg_handlers(func_list, inputfile):
dto_setters = ''
# dto setters
- for t in zip(f['c_types'], f['types'], f['args']):
+ for t in zip(f['c_types'], f['types'], f['args'], f['lengths']):
c_type = t[0]
jni_type = t[1]
c_name = t[2]
+ field_length = t[3]
java_field_name = util.underscore_to_camelcase(c_name)
jni_signature = util.jni_2_signature_mapping[jni_type]
@@ -302,7 +309,8 @@ def generate_msg_handlers(func_list, inputfile):
java_name=java_field_name,
jni_signature=jni_signature,
c_name=c_name,
- jni_setter=jni_setter)
+ jni_setter=jni_setter,
+ field_length=field_length)
handlers.append(msg_handler_template.substitute(
inputfile=inputfile,
diff --git a/vpp-api/java/jvpp/gen/jvpp_gen.py b/vpp-api/java/jvpp/gen/jvpp_gen.py
index 931141e884a..e2ff2adcf14 100755
--- a/vpp-api/java/jvpp/gen/jvpp_gen.py
+++ b/vpp-api/java/jvpp/gen/jvpp_gen.py
@@ -72,16 +72,19 @@ def get_args(t, filter):
def get_types(t, filter):
types_list = []
c_types_list = []
+ lengths_list = []
for i in t:
if not filter(i[1]):
continue
if len(i) is 3: # array type
types_list.append(vpp_2_jni_type_mapping[i[0]] + 'Array')
c_types_list.append(i[0] + '[]')
+ lengths_list.append(i[2])
else: # primitive type
types_list.append(vpp_2_jni_type_mapping[i[0]])
c_types_list.append(i[0])
- return types_list, c_types_list
+ lengths_list.append(0)
+ return types_list, c_types_list, lengths_list
def get_definitions():
@@ -96,18 +99,18 @@ def get_definitions():
# For replies include all the arguments except message_id
if util.is_reply(java_name):
- types, c_types = get_types(a[1:], is_response_field)
+ types, c_types, lengths = get_types(a[1:], is_response_field)
func_name[a[0]] = dict(
[('name', a[0]), ('java_name', java_name),
('args', get_args(a[1:], is_response_field)), ('full_args', get_args(a[1:], lambda x: True)),
- ('types', types), ('c_types', c_types)])
+ ('types', types), ('c_types', c_types), ('lengths', lengths)])
# For requests skip message_id, client_id and context
else:
- types, c_types = get_types(a[1:], is_request_field)
+ types, c_types, lengths = get_types(a[1:], is_request_field)
func_name[a[0]] = dict(
[('name', a[0]), ('java_name', java_name),
('args', get_args(a[1:], is_request_field)), ('full_args', get_args(a[1:], lambda x: True)),
- ('types', types), ('c_types', c_types)])
+ ('types', types), ('c_types', c_types), ('lengths', lengths)])
# Indexed by name
func_list.append(func_name[a[0]])