| 855 | } |
| 856 | |
| 857 | static int lua_java_call_instance(lua_State* L) { |
| 858 | jobject* ud = (jobject*)luaL_checkudata(L, 1, JAVA_INSTANCE_MT); |
| 859 | jobject instance = *ud; |
| 860 | const char* method_name = luaL_checkstring(L, 2); |
| 861 | const char* sig = luaL_checkstring(L, 3); |
| 862 | |
| 863 | JNIEnv* env = get_jni_env(); |
| 864 | if (!env) { |
| 865 | lua_pushnil(L); |
| 866 | return 1; |
| 867 | } |
| 868 | |
| 869 | jvalue args[MAX_PARAMS]; |
| 870 | memset(args, 0, sizeof(args)); |
| 871 | |
| 872 | ParsedSignature parsed = parse_signature(sig); |
| 873 | lua_to_jvalue(env,L,&parsed,args,4); |
| 874 | |
| 875 | jvalue result = call_instance_method(env, instance, method_name, sig, args); |
| 876 | |
| 877 | switch (parsed.return_type) { |
| 878 | case 'V': |
| 879 | return 0; |
| 880 | case 'Z': |
| 881 | lua_pushboolean(L, result.z); |
| 882 | return 1; |
| 883 | case 'I': |
| 884 | lua_pushinteger(L, result.i); |
| 885 | return 1; |
| 886 | case 'J': |
| 887 | lua_pushinteger(L, (lua_Integer)result.j); |
| 888 | return 1; |
| 889 | case 'F': |
| 890 | lua_pushnumber(L, result.f); |
| 891 | return 1; |
| 892 | case 'D': |
| 893 | lua_pushnumber(L, result.d); |
| 894 | return 1; |
| 895 | case 'L': |
| 896 | case '[': |
| 897 | if (result.l) { |
| 898 | jclass string_class = (*env)->FindClass(env, "java/lang/String"); |
| 899 | if ((*env)->IsInstanceOf(env, result.l, string_class)) { |
| 900 | const char* str = (*env)->GetStringUTFChars(env, (jstring)result.l, NULL); |
| 901 | lua_pushstring(L, str); |
| 902 | (*env)->ReleaseStringUTFChars(env, (jstring)result.l, str); |
| 903 | } else { |
| 904 | jobject global = (*env)->NewGlobalRef(env, result.l); |
| 905 | jobject* obj_ud = (jobject*)lua_newuserdata(L, sizeof(jobject)); |
| 906 | *obj_ud = global; |
| 907 | luaL_getmetatable(L, JAVA_INSTANCE_MT); |
| 908 | lua_setmetatable(L, -2); |
| 909 | } |
| 910 | (*env)->DeleteLocalRef(env, result.l); |
| 911 | } else { |
| 912 | lua_pushnil(L); |
| 913 | } |
| 914 | return 1; |
nothing calls this directly
no test coverage detected