234 } else if (flag->is_uintx()) {
235 RETURN_BOXED_LONG(flag->get_uintx());
236 } else if (flag->is_double()) {
237 RETURN_BOXED_DOUBLE(flag->get_double());
238 } else {
239 JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type);
240 }
241 #undef RETURN_BOXED_LONG
242 #undef RETURN_BOXED_DOUBLE
243 C2V_END
244
245 C2V_VMENTRY_NULL(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong oop_address))
246 requireInHotSpot("getObjectAtAddress", JVMCI_CHECK_NULL);
247 if (oop_address == 0) {
248 JVMCI_THROW_MSG_NULL(InternalError, "Handle must be non-zero");
249 }
250 oop obj = *((oopDesc**) oop_address);
251 if (obj != NULL) {
252 oopDesc::verify(obj);
253 }
254 return JNIHandles::make_local(obj);
255 C2V_END
256
257 C2V_VMENTRY_NULL(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method))
258 methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
259
260 int code_size = method->code_size();
261 jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
262
263 guarantee(method->method_holder()->is_rewritten(), "Method's holder should be rewritten");
264 // iterate over all bytecodes and replace non-Java bytecodes
265
266 for (BytecodeStream s(method); s.next() != Bytecodes::_illegal; ) {
267 Bytecodes::Code code = s.code();
268 Bytecodes::Code raw_code = s.raw_code();
269 int bci = s.bci();
270 int len = s.instruction_size();
271
272 // Restore original byte code.
273 reconstituted_code[bci] = (jbyte) (s.is_wide()? Bytecodes::_wide : code);
274 if (len > 1) {
1021 HandleMark hm;
1022
1023 JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
1024 nmethodLocker locker;
1025 nmethod* nm = JVMCIENV->get_nmethod(nmethod_mirror, locker);
1026 if (nm == NULL || !nm->is_in_use()) {
1027 JVMCI_THROW_NULL(InvalidInstalledCodeException);
1028 }
1029 methodHandle mh(THREAD, nm->method());
1030 Symbol* signature = mh->signature();
1031 JavaCallArguments jca(mh->size_of_parameters());
1032
1033 JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
1034 JavaValue result(jap.return_type());
1035 jca.set_alternative_target(Handle(THREAD, JNIHandles::resolve(nmethod_mirror.as_jobject())));
1036 JavaCalls::call(&result, mh, &jca, CHECK_NULL);
1037
1038 if (jap.return_type() == T_VOID) {
1039 return NULL;
1040 } else if (is_reference_type(jap.return_type())) {
1041 return JNIHandles::make_local((oop) result.get_jobject());
1042 } else {
1043 jvalue *value = (jvalue *) result.get_value_addr();
1044 // Narrow the value down if required (Important on big endian machines)
1045 switch (jap.return_type()) {
1046 case T_BOOLEAN:
1047 value->z = (jboolean) value->i;
1048 break;
1049 case T_BYTE:
1050 value->b = (jbyte) value->i;
1051 break;
1052 case T_CHAR:
1053 value->c = (jchar) value->i;
1054 break;
1055 case T_SHORT:
1056 value->s = (jshort) value->i;
1057 break;
1058 default:
1059 break;
1060 }
1061 JVMCIObject o = JVMCIENV->create_box(jap.return_type(), value, JVMCI_CHECK_NULL);
2297 if (entry == NULL) {
2298 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [neither %s nor %s exist in %s]",
2299 method->name_and_sig_as_C_string(),
2300 jni_name, jni_long_name, sl_path));
2301 }
2302 }
2303
2304 if (method->has_native_function() && entry != method->native_function()) {
2305 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [cannot re-link from " PTR_FORMAT " to " PTR_FORMAT "]",
2306 method->name_and_sig_as_C_string(), p2i(method->native_function()), p2i(entry)));
2307 }
2308 method->set_native_function(entry, Method::native_bind_event_is_interesting);
2309 log_debug(jni, resolve)("[Dynamic-linking native method %s.%s ... JNI] @ " PTR_FORMAT,
2310 method->method_holder()->external_name(),
2311 method->name()->as_C_string(),
2312 p2i((void*) entry));
2313 }
2314 }
2315
2316 typeArrayOop info_oop = oopFactory::new_longArray(4, CHECK_0);
2317 jlongArray info = (jlongArray) JNIHandles::make_local(info_oop);
2318 runtime->init_JavaVM_info(info, JVMCI_CHECK_0);
2319 return info;
2320 }
2321
2322 C2V_VMENTRY_PREFIX(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject c2vm))
2323 if (thread == NULL) {
2324 // Called from unattached JVMCI shared library thread
2325 return false;
2326 }
2327 JVMCITraceMark jtm("isCurrentThreadAttached");
2328 if (thread->jni_environment() == env) {
2329 C2V_BLOCK(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject))
2330 requireJVMCINativeLibrary(JVMCI_CHECK_0);
2331 JVMCIRuntime* runtime = JVMCI::compiler_runtime();
2332 if (runtime == NULL || !runtime->has_shared_library_javavm()) {
2333 JVMCI_THROW_MSG_0(IllegalStateException, "Require JVMCI shared library JavaVM to be initialized in isCurrentThreadAttached");
2334 }
2335 JNIEnv* peerEnv;
2336 return runtime->GetEnv(thread, (void**) &peerEnv, JNI_VERSION_1_2) == JNI_OK;
2337 }
2548 executable = Reflection::new_method(m, false, CHECK_NULL);
2549 }
2550 return JNIHandles::make_local(THREAD, executable);
2551 }
2552
2553 C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
2554 requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
2555 Klass* klass = JVMCIENV->asKlass(jvmci_type);
2556 if (!klass->is_instance_klass()) {
2557 JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2558 err_msg("Expected non-primitive type, got %s", klass->external_name()));
2559 }
2560 InstanceKlass* iklass = InstanceKlass::cast(klass);
2561 Array<u2>* fields = iklass->fields();
2562 if (index < 0 ||index > fields->length()) {
2563 JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2564 err_msg("Field index %d out of bounds for %s", index, klass->external_name()));
2565 }
2566 fieldDescriptor fd(iklass, index);
2567 oop reflected = Reflection::new_field(&fd, CHECK_NULL);
2568 return JNIHandles::make_local(env, reflected);
2569 }
2570
2571 C2V_VMENTRY_NULL(jobjectArray, getFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address, jobjectArray current))
2572 FailedSpeculation* head = *((FailedSpeculation**)(address) failed_speculations_address);
2573 int result_length = 0;
2574 for (FailedSpeculation* fs = head; fs != NULL; fs = fs->next()) {
2575 result_length++;
2576 }
2577 int current_length = 0;
2578 JVMCIObjectArray current_array = NULL;
2579 if (current != NULL) {
2580 current_array = JVMCIENV->wrap(current);
2581 current_length = JVMCIENV->get_length(current_array);
2582 if (current_length == result_length) {
2583 // No new failures
2584 return current;
2585 }
2586 }
2587 JVMCIObjectArray result = JVMCIENV->new_byte_array_array(result_length, JVMCI_CHECK_NULL);
2588 int result_index = 0;
|
234 } else if (flag->is_uintx()) {
235 RETURN_BOXED_LONG(flag->get_uintx());
236 } else if (flag->is_double()) {
237 RETURN_BOXED_DOUBLE(flag->get_double());
238 } else {
239 JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type);
240 }
241 #undef RETURN_BOXED_LONG
242 #undef RETURN_BOXED_DOUBLE
243 C2V_END
244
245 C2V_VMENTRY_NULL(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong oop_address))
246 requireInHotSpot("getObjectAtAddress", JVMCI_CHECK_NULL);
247 if (oop_address == 0) {
248 JVMCI_THROW_MSG_NULL(InternalError, "Handle must be non-zero");
249 }
250 oop obj = *((oopDesc**) oop_address);
251 if (obj != NULL) {
252 oopDesc::verify(obj);
253 }
254 return JNIHandles::make_local(THREAD, obj);
255 C2V_END
256
257 C2V_VMENTRY_NULL(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method))
258 methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
259
260 int code_size = method->code_size();
261 jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
262
263 guarantee(method->method_holder()->is_rewritten(), "Method's holder should be rewritten");
264 // iterate over all bytecodes and replace non-Java bytecodes
265
266 for (BytecodeStream s(method); s.next() != Bytecodes::_illegal; ) {
267 Bytecodes::Code code = s.code();
268 Bytecodes::Code raw_code = s.raw_code();
269 int bci = s.bci();
270 int len = s.instruction_size();
271
272 // Restore original byte code.
273 reconstituted_code[bci] = (jbyte) (s.is_wide()? Bytecodes::_wide : code);
274 if (len > 1) {
1021 HandleMark hm;
1022
1023 JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
1024 nmethodLocker locker;
1025 nmethod* nm = JVMCIENV->get_nmethod(nmethod_mirror, locker);
1026 if (nm == NULL || !nm->is_in_use()) {
1027 JVMCI_THROW_NULL(InvalidInstalledCodeException);
1028 }
1029 methodHandle mh(THREAD, nm->method());
1030 Symbol* signature = mh->signature();
1031 JavaCallArguments jca(mh->size_of_parameters());
1032
1033 JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
1034 JavaValue result(jap.return_type());
1035 jca.set_alternative_target(Handle(THREAD, JNIHandles::resolve(nmethod_mirror.as_jobject())));
1036 JavaCalls::call(&result, mh, &jca, CHECK_NULL);
1037
1038 if (jap.return_type() == T_VOID) {
1039 return NULL;
1040 } else if (is_reference_type(jap.return_type())) {
1041 return JNIHandles::make_local(THREAD, (oop) result.get_jobject());
1042 } else {
1043 jvalue *value = (jvalue *) result.get_value_addr();
1044 // Narrow the value down if required (Important on big endian machines)
1045 switch (jap.return_type()) {
1046 case T_BOOLEAN:
1047 value->z = (jboolean) value->i;
1048 break;
1049 case T_BYTE:
1050 value->b = (jbyte) value->i;
1051 break;
1052 case T_CHAR:
1053 value->c = (jchar) value->i;
1054 break;
1055 case T_SHORT:
1056 value->s = (jshort) value->i;
1057 break;
1058 default:
1059 break;
1060 }
1061 JVMCIObject o = JVMCIENV->create_box(jap.return_type(), value, JVMCI_CHECK_NULL);
2297 if (entry == NULL) {
2298 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [neither %s nor %s exist in %s]",
2299 method->name_and_sig_as_C_string(),
2300 jni_name, jni_long_name, sl_path));
2301 }
2302 }
2303
2304 if (method->has_native_function() && entry != method->native_function()) {
2305 JVMCI_THROW_MSG_0(UnsatisfiedLinkError, err_msg("%s [cannot re-link from " PTR_FORMAT " to " PTR_FORMAT "]",
2306 method->name_and_sig_as_C_string(), p2i(method->native_function()), p2i(entry)));
2307 }
2308 method->set_native_function(entry, Method::native_bind_event_is_interesting);
2309 log_debug(jni, resolve)("[Dynamic-linking native method %s.%s ... JNI] @ " PTR_FORMAT,
2310 method->method_holder()->external_name(),
2311 method->name()->as_C_string(),
2312 p2i((void*) entry));
2313 }
2314 }
2315
2316 typeArrayOop info_oop = oopFactory::new_longArray(4, CHECK_0);
2317 jlongArray info = (jlongArray) JNIHandles::make_local(THREAD, info_oop);
2318 runtime->init_JavaVM_info(info, JVMCI_CHECK_0);
2319 return info;
2320 }
2321
2322 C2V_VMENTRY_PREFIX(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject c2vm))
2323 if (thread == NULL) {
2324 // Called from unattached JVMCI shared library thread
2325 return false;
2326 }
2327 JVMCITraceMark jtm("isCurrentThreadAttached");
2328 if (thread->jni_environment() == env) {
2329 C2V_BLOCK(jboolean, isCurrentThreadAttached, (JNIEnv* env, jobject))
2330 requireJVMCINativeLibrary(JVMCI_CHECK_0);
2331 JVMCIRuntime* runtime = JVMCI::compiler_runtime();
2332 if (runtime == NULL || !runtime->has_shared_library_javavm()) {
2333 JVMCI_THROW_MSG_0(IllegalStateException, "Require JVMCI shared library JavaVM to be initialized in isCurrentThreadAttached");
2334 }
2335 JNIEnv* peerEnv;
2336 return runtime->GetEnv(thread, (void**) &peerEnv, JNI_VERSION_1_2) == JNI_OK;
2337 }
2548 executable = Reflection::new_method(m, false, CHECK_NULL);
2549 }
2550 return JNIHandles::make_local(THREAD, executable);
2551 }
2552
2553 C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
2554 requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
2555 Klass* klass = JVMCIENV->asKlass(jvmci_type);
2556 if (!klass->is_instance_klass()) {
2557 JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2558 err_msg("Expected non-primitive type, got %s", klass->external_name()));
2559 }
2560 InstanceKlass* iklass = InstanceKlass::cast(klass);
2561 Array<u2>* fields = iklass->fields();
2562 if (index < 0 ||index > fields->length()) {
2563 JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2564 err_msg("Field index %d out of bounds for %s", index, klass->external_name()));
2565 }
2566 fieldDescriptor fd(iklass, index);
2567 oop reflected = Reflection::new_field(&fd, CHECK_NULL);
2568 return JNIHandles::make_local(THREAD, reflected);
2569 }
2570
2571 C2V_VMENTRY_NULL(jobjectArray, getFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address, jobjectArray current))
2572 FailedSpeculation* head = *((FailedSpeculation**)(address) failed_speculations_address);
2573 int result_length = 0;
2574 for (FailedSpeculation* fs = head; fs != NULL; fs = fs->next()) {
2575 result_length++;
2576 }
2577 int current_length = 0;
2578 JVMCIObjectArray current_array = NULL;
2579 if (current != NULL) {
2580 current_array = JVMCIENV->wrap(current);
2581 current_length = JVMCIENV->get_length(current_array);
2582 if (current_length == result_length) {
2583 // No new failures
2584 return current;
2585 }
2586 }
2587 JVMCIObjectArray result = JVMCIENV->new_byte_array_array(result_length, JVMCI_CHECK_NULL);
2588 int result_index = 0;
|