190 utfSource = getUTF(env, source, sourceBuf, sizeof(sourceBuf));
191 if (utfSource == NULL) {
192 JNU_ThrowOutOfMemoryError(env, NULL);
193 goto free_utfName;
194 }
195 } else {
196 utfSource = NULL;
197 }
198 result = JVM_DefineClassWithSource(env, utfName, loader, body, length, pd, utfSource);
199
200 if (utfSource && utfSource != sourceBuf)
201 free(utfSource);
202
203 free_utfName:
204 if (utfName && utfName != buf)
205 free(utfName);
206
207 return result;
208 }
209
210 /*
211 * Returns NULL if class not found.
212 */
213 JNIEXPORT jclass JNICALL
214 Java_java_lang_ClassLoader_findBootstrapClass(JNIEnv *env, jobject loader,
215 jstring classname)
216 {
217 char *clname;
218 jclass cls = 0;
219 char buf[128];
220
221 if (classname == NULL) {
222 return 0;
223 }
224
225 clname = getUTF(env, classname, buf, sizeof(buf));
226 if (clname == NULL) {
227 JNU_ThrowOutOfMemoryError(env, NULL);
228 return NULL;
229 }
|
190 utfSource = getUTF(env, source, sourceBuf, sizeof(sourceBuf));
191 if (utfSource == NULL) {
192 JNU_ThrowOutOfMemoryError(env, NULL);
193 goto free_utfName;
194 }
195 } else {
196 utfSource = NULL;
197 }
198 result = JVM_DefineClassWithSource(env, utfName, loader, body, length, pd, utfSource);
199
200 if (utfSource && utfSource != sourceBuf)
201 free(utfSource);
202
203 free_utfName:
204 if (utfName && utfName != buf)
205 free(utfName);
206
207 return result;
208 }
209
210 JNIEXPORT jclass JNICALL
211 Java_java_lang_ClassLoader_defineClass0(JNIEnv *env,
212 jclass cls,
213 jobject loader,
214 jclass lookup,
215 jstring name,
216 jbyteArray data,
217 jint offset,
218 jint length,
219 jobject pd,
220 jboolean initialize,
221 jint flags,
222 jobject classData)
223 {
224 jbyte *body;
225 char *utfName;
226 jclass result = 0;
227 char buf[128];
228
229 if (data == NULL) {
230 JNU_ThrowNullPointerException(env, 0);
231 return 0;
232 }
233
234 /* Work around 4153825. malloc crashes on Solaris when passed a
235 * negative size.
236 */
237 if (length < 0) {
238 JNU_ThrowArrayIndexOutOfBoundsException(env, 0);
239 return 0;
240 }
241
242 body = (jbyte *)malloc(length);
243 if (body == 0) {
244 JNU_ThrowOutOfMemoryError(env, 0);
245 return 0;
246 }
247
248 (*env)->GetByteArrayRegion(env, data, offset, length, body);
249
250 if ((*env)->ExceptionOccurred(env))
251 goto free_body;
252
253 if (name != NULL) {
254 utfName = getUTF(env, name, buf, sizeof(buf));
255 if (utfName == NULL) {
256 goto free_body;
257 }
258 fixClassname(utfName);
259 } else {
260 utfName = NULL;
261 }
262
263 return JVM_LookupDefineClass(env, lookup, utfName, body, length, pd, initialize, flags, classData);
264
265 free_body:
266 free(body);
267 return result;
268 }
269
270 /*
271 * Returns NULL if class not found.
272 */
273 JNIEXPORT jclass JNICALL
274 Java_java_lang_ClassLoader_findBootstrapClass(JNIEnv *env, jobject loader,
275 jstring classname)
276 {
277 char *clname;
278 jclass cls = 0;
279 char buf[128];
280
281 if (classname == NULL) {
282 return 0;
283 }
284
285 clname = getUTF(env, classname, buf, sizeof(buf));
286 if (clname == NULL) {
287 JNU_ThrowOutOfMemoryError(env, NULL);
288 return NULL;
289 }
|