338 Handle exception(THREAD, PENDING_EXCEPTION);
339 CLEAR_PENDING_EXCEPTION;
340 JavaCallArguments jargs;
341 jargs.push_oop(exception);
342 jargs.push_int(to_string != nullptr);
343 jargs.push_int(stack_trace != nullptr);
344 JavaValue result(T_OBJECT);
345 JavaCalls::call_static(&result,
346 HotSpotJVMCI::HotSpotJVMCIRuntime::klass(),
347 vmSymbols::exceptionToString_name(),
348 vmSymbols::exceptionToString_signature(), &jargs, THREAD);
349 if (HAS_PENDING_EXCEPTION) {
350 Handle nested_exception(THREAD, PENDING_EXCEPTION);
351 CLEAR_PENDING_EXCEPTION;
352 java_lang_Throwable::print_stack_trace(nested_exception, tty);
353 // Clear and ignore any exceptions raised during printing
354 CLEAR_PENDING_EXCEPTION;
355 had_nested_exception = true;
356 } else {
357 oop pair = result.get_oop();
358 guarantee(pair->is_objArray(), "must be");
359 objArrayOop pair_arr = objArrayOop(pair);
360 int len = pair_arr->length();
361 guarantee(len == 2, "bad len is %d", len);
362 if (to_string != nullptr) {
363 to_string_obj = HotSpotJVMCI::wrap(pair_arr->obj_at(0));
364 }
365 if (stack_trace != nullptr) {
366 stack_trace_obj = HotSpotJVMCI::wrap(pair_arr->obj_at(1));
367 }
368 }
369 } else {
370 return false;
371 }
372 }
373 if (had_nested_exception) {
374 if (to_string != nullptr) {
375 *to_string = "nested exception occurred converting exception to string";
376 }
377 if (stack_trace != nullptr) {
378 *stack_trace = "nested exception occurred converting exception stack to string";
379 }
661
662 void JVMCIEnv::clear_pending_exception() {
663 if (is_hotspot()) {
664 JavaThread* THREAD = JavaThread::current(); // For exception macros.
665 CLEAR_PENDING_EXCEPTION;
666 } else {
667 JNIAccessMark jni(this);
668 jni()->ExceptionClear();
669 }
670 }
671
672 int JVMCIEnv::get_length(JVMCIArray array) {
673 if (is_hotspot()) {
674 return HotSpotJVMCI::resolve(array)->length();
675 } else {
676 JNIAccessMark jni(this);
677 return jni()->GetArrayLength(get_jarray(array));
678 }
679 }
680
681 JVMCIObject JVMCIEnv::get_object_at(JVMCIObjectArray array, int index) {
682 if (is_hotspot()) {
683 oop result = HotSpotJVMCI::resolve(array)->obj_at(index);
684 return wrap(result);
685 } else {
686 JNIAccessMark jni(this);
687 jobject result = jni()->GetObjectArrayElement(get_jobjectArray(array), index);
688 return wrap(result);
689 }
690 }
691
692 void JVMCIEnv::put_object_at(JVMCIObjectArray array, int index, JVMCIObject value) {
693 if (is_hotspot()) {
694 HotSpotJVMCI::resolve(array)->obj_at_put(index, HotSpotJVMCI::resolve(value));
695 } else {
696 JNIAccessMark jni(this);
697 jni()->SetObjectArrayElement(get_jobjectArray(array), index, get_jobject(value));
698 }
699 }
700
701 jboolean JVMCIEnv::get_bool_at(JVMCIPrimitiveArray array, int index) {
702 if (is_hotspot()) {
703 return HotSpotJVMCI::resolve(array)->bool_at(index);
1135 jargs.push_int(type_char);
1136 jargs.push_long(value);
1137 JavaValue result(T_OBJECT);
1138 JavaCalls::call_static(&result,
1139 HotSpotJVMCI::JavaConstant::klass(),
1140 vmSymbols::forPrimitive_name(),
1141 vmSymbols::forPrimitive_signature(), &jargs, CHECK_(JVMCIObject()));
1142 return wrap(result.get_oop());
1143 } else {
1144 JNIAccessMark jni(this, THREAD);
1145 jobject result = (jstring) jni()->CallStaticObjectMethod(JNIJVMCI::JavaConstant::clazz(),
1146 JNIJVMCI::JavaConstant::forPrimitive_method(),
1147 type_char, value);
1148 if (jni()->ExceptionCheck()) {
1149 return JVMCIObject();
1150 }
1151 return wrap(result);
1152 }
1153 }
1154
1155 JVMCIObject JVMCIEnv::get_jvmci_primitive_type(BasicType type) {
1156 JVMCIObjectArray primitives = get_HotSpotResolvedPrimitiveType_primitives();
1157 JVMCIObject result = get_object_at(primitives, type);
1158 return result;
1159 }
1160
1161 JVMCIObject JVMCIEnv::new_StackTraceElement(const methodHandle& method, int bci, JVMCI_TRAPS) {
1162 JavaThread* THREAD = JavaThread::current(); // For exception macros.
1163 Symbol* file_name_sym;
1164 int line_number;
1165 java_lang_StackTraceElement::decode(method, bci, file_name_sym, line_number, CHECK_(JVMCIObject()));
1166
1167 Symbol* method_name_sym = method->name();
1168 InstanceKlass* holder = method->method_holder();
1169 const char* declaring_class_str = holder->external_name();
1170
1171 if (is_hotspot()) {
1172 HotSpotJVMCI::StackTraceElement::klass()->initialize(CHECK_(JVMCIObject()));
1173 oop objOop = HotSpotJVMCI::StackTraceElement::klass()->allocate_instance(CHECK_(JVMCIObject()));
1174 Handle obj = Handle(THREAD, objOop);
1175
1176 oop declaring_class = StringTable::intern((char*) declaring_class_str, CHECK_(JVMCIObject()));
1177 HotSpotJVMCI::StackTraceElement::set_declaringClass(this, obj(), declaring_class);
|
338 Handle exception(THREAD, PENDING_EXCEPTION);
339 CLEAR_PENDING_EXCEPTION;
340 JavaCallArguments jargs;
341 jargs.push_oop(exception);
342 jargs.push_int(to_string != nullptr);
343 jargs.push_int(stack_trace != nullptr);
344 JavaValue result(T_OBJECT);
345 JavaCalls::call_static(&result,
346 HotSpotJVMCI::HotSpotJVMCIRuntime::klass(),
347 vmSymbols::exceptionToString_name(),
348 vmSymbols::exceptionToString_signature(), &jargs, THREAD);
349 if (HAS_PENDING_EXCEPTION) {
350 Handle nested_exception(THREAD, PENDING_EXCEPTION);
351 CLEAR_PENDING_EXCEPTION;
352 java_lang_Throwable::print_stack_trace(nested_exception, tty);
353 // Clear and ignore any exceptions raised during printing
354 CLEAR_PENDING_EXCEPTION;
355 had_nested_exception = true;
356 } else {
357 oop pair = result.get_oop();
358 guarantee(pair->is_refArray(), "must be");
359 refArrayOop pair_arr = refArrayOop(pair);
360 int len = pair_arr->length();
361 guarantee(len == 2, "bad len is %d", len);
362 if (to_string != nullptr) {
363 to_string_obj = HotSpotJVMCI::wrap(pair_arr->obj_at(0));
364 }
365 if (stack_trace != nullptr) {
366 stack_trace_obj = HotSpotJVMCI::wrap(pair_arr->obj_at(1));
367 }
368 }
369 } else {
370 return false;
371 }
372 }
373 if (had_nested_exception) {
374 if (to_string != nullptr) {
375 *to_string = "nested exception occurred converting exception to string";
376 }
377 if (stack_trace != nullptr) {
378 *stack_trace = "nested exception occurred converting exception stack to string";
379 }
661
662 void JVMCIEnv::clear_pending_exception() {
663 if (is_hotspot()) {
664 JavaThread* THREAD = JavaThread::current(); // For exception macros.
665 CLEAR_PENDING_EXCEPTION;
666 } else {
667 JNIAccessMark jni(this);
668 jni()->ExceptionClear();
669 }
670 }
671
672 int JVMCIEnv::get_length(JVMCIArray array) {
673 if (is_hotspot()) {
674 return HotSpotJVMCI::resolve(array)->length();
675 } else {
676 JNIAccessMark jni(this);
677 return jni()->GetArrayLength(get_jarray(array));
678 }
679 }
680
681 JVMCIObject JVMCIEnv::get_object_at(JVMCIObjectArray array, int index, JVMCI_TRAPS) {
682 if (is_hotspot()) {
683 JavaThread* THREAD = JavaThread::current(); // For exception macros.
684 oop result = HotSpotJVMCI::resolve(array)->obj_at(index, CHECK_({}));
685 return wrap(result);
686 } else {
687 JNIAccessMark jni(this);
688 jobject result = jni()->GetObjectArrayElement(get_jobjectArray(array), index);
689 return wrap(result);
690 }
691 }
692
693 void JVMCIEnv::put_object_at(JVMCIObjectArray array, int index, JVMCIObject value) {
694 if (is_hotspot()) {
695 HotSpotJVMCI::resolve(array)->obj_at_put(index, HotSpotJVMCI::resolve(value));
696 } else {
697 JNIAccessMark jni(this);
698 jni()->SetObjectArrayElement(get_jobjectArray(array), index, get_jobject(value));
699 }
700 }
701
702 jboolean JVMCIEnv::get_bool_at(JVMCIPrimitiveArray array, int index) {
703 if (is_hotspot()) {
704 return HotSpotJVMCI::resolve(array)->bool_at(index);
1136 jargs.push_int(type_char);
1137 jargs.push_long(value);
1138 JavaValue result(T_OBJECT);
1139 JavaCalls::call_static(&result,
1140 HotSpotJVMCI::JavaConstant::klass(),
1141 vmSymbols::forPrimitive_name(),
1142 vmSymbols::forPrimitive_signature(), &jargs, CHECK_(JVMCIObject()));
1143 return wrap(result.get_oop());
1144 } else {
1145 JNIAccessMark jni(this, THREAD);
1146 jobject result = (jstring) jni()->CallStaticObjectMethod(JNIJVMCI::JavaConstant::clazz(),
1147 JNIJVMCI::JavaConstant::forPrimitive_method(),
1148 type_char, value);
1149 if (jni()->ExceptionCheck()) {
1150 return JVMCIObject();
1151 }
1152 return wrap(result);
1153 }
1154 }
1155
1156 JVMCIObject JVMCIEnv::get_jvmci_primitive_type(BasicType type, JVMCI_TRAPS) {
1157 JVMCIObjectArray primitives = get_HotSpotResolvedPrimitiveType_primitives();
1158 JVMCIObject result = get_object_at(primitives, type, JVMCI_CHECK_({}));
1159 return result;
1160 }
1161
1162 JVMCIObject JVMCIEnv::new_StackTraceElement(const methodHandle& method, int bci, JVMCI_TRAPS) {
1163 JavaThread* THREAD = JavaThread::current(); // For exception macros.
1164 Symbol* file_name_sym;
1165 int line_number;
1166 java_lang_StackTraceElement::decode(method, bci, file_name_sym, line_number, CHECK_(JVMCIObject()));
1167
1168 Symbol* method_name_sym = method->name();
1169 InstanceKlass* holder = method->method_holder();
1170 const char* declaring_class_str = holder->external_name();
1171
1172 if (is_hotspot()) {
1173 HotSpotJVMCI::StackTraceElement::klass()->initialize(CHECK_(JVMCIObject()));
1174 oop objOop = HotSpotJVMCI::StackTraceElement::klass()->allocate_instance(CHECK_(JVMCIObject()));
1175 Handle obj = Handle(THREAD, objOop);
1176
1177 oop declaring_class = StringTable::intern((char*) declaring_class_str, CHECK_(JVMCIObject()));
1178 HotSpotJVMCI::StackTraceElement::set_declaringClass(this, obj(), declaring_class);
|