comparison src/share/vm/graal/graalCompilerToVM.cpp @ 13305:a63d65b682a8

moved most HotSpotResolvedJavaMethod.getExceptionHandlers logic to Java
author twisti
date Wed, 11 Dec 2013 20:42:50 -0800
parents 903fd774dd61
children dfb780080923
comparison
equal deleted inserted replaced
13304:a1dae6b6d6d2 13305:a63d65b682a8
131 env->SetByteArrayRegion(result, 0, code_size, reconstituted_code); 131 env->SetByteArrayRegion(result, 0, code_size, reconstituted_code);
132 132
133 return result; 133 return result;
134 C2V_END 134 C2V_END
135 135
136 C2V_VMENTRY(jobjectArray, initializeExceptionHandlers, (JNIEnv *, jobject, jlong metaspace_method, jobjectArray java_handlers)) 136 C2V_VMENTRY(jlong, exceptionTableStart, (JNIEnv *, jobject, jlong metaspace_method))
137 ResourceMark rm; 137 ResourceMark rm;
138 methodHandle method = asMethod(metaspace_method); 138 methodHandle method = asMethod(metaspace_method);
139 int handler_count = method->exception_table_length(); 139 assert(method->exception_table_length() != 0, "should be handled in Java code");
140 objArrayHandle array = (objArrayOop) JNIHandles::resolve(java_handlers); 140 return (jlong) (address) method->exception_table_start();
141 assert(array->length() == handler_count, "wrong length");
142 ExceptionTableElement* handlers = handler_count == 0 ? NULL : method->exception_table_start();
143
144 for (int i = 0; i < handler_count; i++) {
145 ExceptionTableElement* handler = handlers + i;
146 Handle entry = array->obj_at(i);
147 assert(!entry.is_null(), "entry should not be null");
148 ExceptionHandler::set_startBCI(entry, handler->start_pc);
149 ExceptionHandler::set_endBCI(entry, handler->end_pc);
150 ExceptionHandler::set_handlerBCI(entry, handler->handler_pc);
151 int catch_class_index = handler->catch_type_index;
152 ExceptionHandler::set_catchTypeCPI(entry, catch_class_index);
153
154 if (catch_class_index == 0) {
155 ExceptionHandler::set_catchType(entry, NULL);
156 } else {
157 ConstantPool* cp = InstanceKlass::cast(method->method_holder())->constants();
158 KlassHandle loading_klass = method->method_holder();
159 Handle catch_class = GraalCompiler::get_JavaType(cp, catch_class_index, loading_klass, CHECK_NULL);
160 if (catch_class->klass() == HotSpotResolvedObjectType::klass() && java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaClass(catch_class)) == SystemDictionary::Throwable_klass()) {
161 ExceptionHandler::set_catchType(entry, NULL);
162 ExceptionHandler::set_catchTypeCPI(entry, 0);
163 } else {
164 ExceptionHandler::set_catchType(entry, catch_class());
165 }
166 }
167 array->obj_at_put(i, entry());
168 }
169
170 return (jobjectArray) JNIHandles::make_local(array());
171 C2V_END 141 C2V_END
172 142
173 C2V_VMENTRY(jint, hasBalancedMonitors, (JNIEnv *, jobject, jlong metaspace_method)) 143 C2V_VMENTRY(jint, hasBalancedMonitors, (JNIEnv *, jobject, jlong metaspace_method))
174 144
175 // Analyze the method to see if monitors are used properly. 145 // Analyze the method to see if monitors are used properly.
912 #define CONSTANT_POOL "Lcom/oracle/graal/api/meta/ConstantPool;" 882 #define CONSTANT_POOL "Lcom/oracle/graal/api/meta/ConstantPool;"
913 #define CONSTANT "Lcom/oracle/graal/api/meta/Constant;" 883 #define CONSTANT "Lcom/oracle/graal/api/meta/Constant;"
914 #define KIND "Lcom/oracle/graal/api/meta/Kind;" 884 #define KIND "Lcom/oracle/graal/api/meta/Kind;"
915 #define LOCAL "Lcom/oracle/graal/api/meta/Local;" 885 #define LOCAL "Lcom/oracle/graal/api/meta/Local;"
916 #define RUNTIME_CALL "Lcom/oracle/graal/api/code/RuntimeCall;" 886 #define RUNTIME_CALL "Lcom/oracle/graal/api/code/RuntimeCall;"
917 #define EXCEPTION_HANDLERS "[Lcom/oracle/graal/api/meta/ExceptionHandler;"
918 #define REFLECT_METHOD "Ljava/lang/reflect/Method;" 887 #define REFLECT_METHOD "Ljava/lang/reflect/Method;"
919 #define REFLECT_CONSTRUCTOR "Ljava/lang/reflect/Constructor;" 888 #define REFLECT_CONSTRUCTOR "Ljava/lang/reflect/Constructor;"
920 #define STRING "Ljava/lang/String;" 889 #define STRING "Ljava/lang/String;"
921 #define OBJECT "Ljava/lang/Object;" 890 #define OBJECT "Ljava/lang/Object;"
922 #define CLASS "Ljava/lang/Class;" 891 #define CLASS "Ljava/lang/Class;"
931 #define METASPACE_METHOD "J" 900 #define METASPACE_METHOD "J"
932 #define METASPACE_CONSTANT_POOL "J" 901 #define METASPACE_CONSTANT_POOL "J"
933 902
934 JNINativeMethod CompilerToVM_methods[] = { 903 JNINativeMethod CompilerToVM_methods[] = {
935 {CC"initializeBytecode", CC"("METASPACE_METHOD"[B)[B", FN_PTR(initializeBytecode)}, 904 {CC"initializeBytecode", CC"("METASPACE_METHOD"[B)[B", FN_PTR(initializeBytecode)},
936 {CC"initializeExceptionHandlers", CC"("METASPACE_METHOD EXCEPTION_HANDLERS")"EXCEPTION_HANDLERS, FN_PTR(initializeExceptionHandlers)}, 905 {CC"exceptionTableStart", CC"("METASPACE_METHOD")J", FN_PTR(exceptionTableStart)},
937 {CC"hasBalancedMonitors", CC"("METASPACE_METHOD")Z", FN_PTR(hasBalancedMonitors)}, 906 {CC"hasBalancedMonitors", CC"("METASPACE_METHOD")Z", FN_PTR(hasBalancedMonitors)},
938 {CC"getUniqueConcreteMethod", CC"("METASPACE_METHOD"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getUniqueConcreteMethod)}, 907 {CC"getUniqueConcreteMethod", CC"("METASPACE_METHOD"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getUniqueConcreteMethod)},
939 {CC"getUniqueImplementor", CC"("HS_RESOLVED_TYPE")"RESOLVED_TYPE, FN_PTR(getUniqueImplementor)}, 908 {CC"getUniqueImplementor", CC"("HS_RESOLVED_TYPE")"RESOLVED_TYPE, FN_PTR(getUniqueImplementor)},
940 {CC"getStackTraceElement", CC"("METASPACE_METHOD"I)"STACK_TRACE_ELEMENT, FN_PTR(getStackTraceElement)}, 909 {CC"getStackTraceElement", CC"("METASPACE_METHOD"I)"STACK_TRACE_ELEMENT, FN_PTR(getStackTraceElement)},
941 {CC"initializeMethod", CC"("METASPACE_METHOD HS_RESOLVED_METHOD")V", FN_PTR(initializeMethod)}, 910 {CC"initializeMethod", CC"("METASPACE_METHOD HS_RESOLVED_METHOD")V", FN_PTR(initializeMethod)},