71 Java_java_lang_reflect_Module_defineModule0(JNIEnv *env, jclass cls, jobject module, |
71 Java_java_lang_reflect_Module_defineModule0(JNIEnv *env, jclass cls, jobject module, |
72 jboolean is_open, jstring version, |
72 jboolean is_open, jstring version, |
73 jstring location, jobjectArray packages) |
73 jstring location, jobjectArray packages) |
74 { |
74 { |
75 char** pkgs = NULL; |
75 char** pkgs = NULL; |
76 jsize idx; |
|
77 jsize num_packages = (*env)->GetArrayLength(env, packages); |
76 jsize num_packages = (*env)->GetArrayLength(env, packages); |
78 |
77 |
79 if (num_packages != 0 && (pkgs = calloc(num_packages, sizeof(char*))) == NULL) { |
78 if (num_packages != 0 && (pkgs = calloc(num_packages, sizeof(char*))) == NULL) { |
80 JNU_ThrowOutOfMemoryError(env, NULL); |
79 JNU_ThrowOutOfMemoryError(env, NULL); |
81 return; |
80 return; |
82 } else { |
81 } else if ((*env)->EnsureLocalCapacity(env, (jint)num_packages) == 0) { |
83 int valid = 1; |
82 jboolean failed = JNI_FALSE; |
|
83 int idx; |
84 for (idx = 0; idx < num_packages; idx++) { |
84 for (idx = 0; idx < num_packages; idx++) { |
85 jstring pkg = (*env)->GetObjectArrayElement(env, packages, idx); |
85 jstring pkg = (*env)->GetObjectArrayElement(env, packages, idx); |
86 pkgs[idx] = GetInternalPackageName(env, pkg, NULL, 0); |
86 char* name = GetInternalPackageName(env, pkg, NULL, 0); |
87 if (pkgs[idx] == NULL) { |
87 if (name != NULL) { |
88 valid = 0; |
88 pkgs[idx] = name; |
|
89 } else { |
|
90 failed = JNI_TRUE; |
89 break; |
91 break; |
90 } |
92 } |
91 } |
93 } |
92 |
94 if (!failed) { |
93 if (valid != 0) { |
|
94 JVM_DefineModule(env, module, is_open, version, location, |
95 JVM_DefineModule(env, module, is_open, version, location, |
95 (const char* const*)pkgs, num_packages); |
96 (const char* const*)pkgs, num_packages); |
96 } |
97 } |
97 } |
98 } |
98 |
99 |
99 if (num_packages > 0) { |
100 if (num_packages > 0) { |
|
101 int idx; |
100 for (idx = 0; idx < num_packages; idx++) { |
102 for (idx = 0; idx < num_packages; idx++) { |
101 if (pkgs[idx] != NULL) { |
103 if (pkgs[idx] != NULL) { |
102 free(pkgs[idx]); |
104 free(pkgs[idx]); |
103 } |
105 } |
104 } |
106 } |