From 4e7bde8c9e43669be4403aa8076a65c865036626 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 12 Sep 2015 00:19:18 +0300 Subject: [PATCH] unix/modjni: Factor out py2jvalue() function. --- unix/modjni.c | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/unix/modjni.c b/unix/modjni.c index b111e69aca..237e3cfd9c 100644 --- a/unix/modjni.c +++ b/unix/modjni.c @@ -163,14 +163,13 @@ STATIC void jmethod_print(const mp_print_t *print, mp_obj_t self_in, mp_print_ki mp_printf(print, "", qstr_str(self->name)); } -#define MATCH(s, static) ((!strncmp(s, static, sizeof(static) - 1)) && (s += sizeof(static) - 1)) +#define IMATCH(s, static) ((!strncmp(s, static, sizeof(static) - 1)) && (s += sizeof(static) - 1)) #define CHECK_TYPE(java_type_name) \ - if (strncmp(arg_types, java_type_name, sizeof(java_type_name) - 1) != 0) { \ - found = false; \ - break; \ + if (strncmp(arg_type, java_type_name, sizeof(java_type_name) - 1) != 0) { \ + return false; \ } \ - arg_types += sizeof(java_type_name) - 1; + arg_type += sizeof(java_type_name) - 1; STATIC const char *strprev(const char *s, char c) { while (*s != c) { @@ -179,6 +178,27 @@ STATIC const char *strprev(const char *s, char c) { return s; } +STATIC bool py2jvalue(const char **jtypesig, mp_obj_t arg, jvalue *out) { + const char *arg_type = *jtypesig; + mp_obj_type_t *type = mp_obj_get_type(arg); + + if (type == &mp_type_str) { + if (IMATCH(arg_type, "java.lang.String") || IMATCH(arg_type, "java.lang.Object")) { + out->l = JJ(NewStringUTF, mp_obj_str_get_str(arg)); + } else { + return false; + } + } else if (type == &mp_type_int) { + CHECK_TYPE("long"); + out->j = mp_obj_get_int(arg); + } else { + nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "arg type not supported")); + } + + *jtypesig = arg_type; + return true; +} + STATIC mp_obj_t call_method(jobject obj, const char *name, jarray methods, bool is_constr, mp_uint_t n_args, const mp_obj_t *args) { jvalue jargs[n_args]; // printf("methods=%p\n", methods); @@ -209,20 +229,8 @@ STATIC mp_obj_t call_method(jobject obj, const char *name, jarray methods, bool bool found = true; for (int i = 0; i < n_args; i++) { - mp_obj_t arg = args[i]; - mp_obj_type_t *type = mp_obj_get_type(arg); - if (type == &mp_type_str) { -// CHECK_TYPE("java.lang.String"); - if (MATCH(arg_types, "java.lang.String") || MATCH(arg_types, "java.lang.Object")) { - jargs[i].l = JJ(NewStringUTF, mp_obj_str_get_str(arg)); - } else { - found = false; - } - } else if (type == &mp_type_int) { - CHECK_TYPE("long"); - jargs[i].j = mp_obj_get_int(arg); - } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "arg type not supported")); + if (!py2jvalue(&arg_types, args[i], &jargs[i])) { + goto next_method; } if (*arg_types == ',') { @@ -269,6 +277,7 @@ ret_string:; } } +next_method: JJ(ReleaseStringUTFChars, name_o, decl); }