| 788 | } |
| 789 | |
| 790 | static int lua_java_call_static(lua_State* L) { |
| 791 | JavaClassWrapper** ud = (JavaClassWrapper**)luaL_checkudata(L, 1, JAVA_WRAPPER_MT); |
| 792 | JavaClassWrapper* wrapper = *ud; |
| 793 | const char* method_name = luaL_checkstring(L, 2); |
| 794 | const char* sig = luaL_checkstring(L, 3); |
| 795 | |
| 796 | JNIEnv* env = get_jni_env(); |
| 797 | if (!env) { |
| 798 | lua_pushnil(L); |
| 799 | return 1; |
| 800 | } |
| 801 | |
| 802 | jvalue args[MAX_PARAMS]; |
| 803 | memset(args, 0, sizeof(args)); |
| 804 | |
| 805 | ParsedSignature parsed = parse_signature(sig); |
| 806 | lua_to_jvalue(env,L,&parsed,args,4); |
| 807 | |
| 808 | |
| 809 | jvalue result = call_static_method(env, wrapper, method_name, sig, args); |
| 810 | |
| 811 | |
| 812 | |
| 813 | switch (parsed.return_type) { |
| 814 | case 'V': |
| 815 | return 0; |
| 816 | case 'Z': |
| 817 | lua_pushboolean(L, result.z); |
| 818 | return 1; |
| 819 | case 'I': |
| 820 | lua_pushinteger(L, result.i); |
| 821 | return 1; |
| 822 | case 'J': |
| 823 | lua_pushinteger(L, (lua_Integer)result.j); |
| 824 | return 1; |
| 825 | case 'F': |
| 826 | lua_pushnumber(L, result.f); |
| 827 | return 1; |
| 828 | case 'D': |
| 829 | lua_pushnumber(L, result.d); |
| 830 | return 1; |
| 831 | case 'L': |
| 832 | case '[': |
| 833 | if (result.l) { |
| 834 | jclass string_class = (*env)->FindClass(env, "java/lang/String"); |
| 835 | if ((*env)->IsInstanceOf(env, result.l, string_class)) { |
| 836 | const char* str = (*env)->GetStringUTFChars(env, (jstring)result.l, NULL); |
| 837 | lua_pushstring(L, str); |
| 838 | (*env)->ReleaseStringUTFChars(env, (jstring)result.l, str); |
| 839 | } else { |
| 840 | jobject global = (*env)->NewGlobalRef(env, result.l); |
| 841 | jobject* obj_ud = (jobject*)lua_newuserdata(L, sizeof(jobject)); |
| 842 | *obj_ud = global; |
| 843 | luaL_getmetatable(L, JAVA_INSTANCE_MT); |
| 844 | lua_setmetatable(L, -2); |
| 845 | } |
| 846 | (*env)->DeleteLocalRef(env, result.l); |
| 847 | } else { |
nothing calls this directly
no test coverage detected