Mercurial > hg > truffle
comparison src/cpu/x86/vm/c1_Runtime1_x86.cpp @ 3682:6c04a4f268e5
implement generic callback mechanism (CiGenericCallback)
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Fri, 18 Nov 2011 11:52:59 +0100 |
parents | bc95d122df79 |
children | 6917cd12e8f8 |
comparison
equal
deleted
inserted
replaced
3681:753443a8c4ff | 3682:6c04a4f268e5 |
---|---|
1056 char message[jintAsStringSize]; | 1056 char message[jintAsStringSize]; |
1057 sprintf(message, "%d", index); | 1057 sprintf(message, "%d", index); |
1058 thread->set_vm_result(Exceptions::new_exception(thread, vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), message)()); | 1058 thread->set_vm_result(Exceptions::new_exception(thread, vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), message)()); |
1059 JRT_END | 1059 JRT_END |
1060 | 1060 |
1061 JRT_ENTRY(void, graal_generic_callback(JavaThread* thread, oop _callback, oop _argument)) | |
1062 HandleMark hm; | |
1063 Handle callback(_callback); | |
1064 Handle argument(_argument); | |
1065 | |
1066 KlassHandle klass = SystemDictionary::resolve_or_null(vmSymbols::com_sun_cri_ci_CiGenericCallback(), SystemDictionary::java_system_loader(), NULL, thread); | |
1067 if (klass.is_null()) { | |
1068 tty->print_cr("couldn't resolve com_sun_cri_ci_CiGenericCallback"); | |
1069 } | |
1070 | |
1071 JavaValue result(T_OBJECT); | |
1072 JavaCallArguments args; | |
1073 args.push_oop(Handle(callback)); | |
1074 args.push_oop(Handle(argument)); | |
1075 JavaCalls::call_interface(&result, klass, vmSymbols::callback_name(), vmSymbols::callback_signature(), &args, thread); | |
1076 | |
1077 if (thread->has_pending_exception()) { | |
1078 Handle exception = PENDING_EXCEPTION; | |
1079 CLEAR_PENDING_EXCEPTION; | |
1080 | |
1081 assert(exception->is_a(SystemDictionary::Throwable_klass()), "Throwable instance expected"); | |
1082 JavaValue result(T_VOID); | |
1083 JavaCalls::call_virtual(&result, | |
1084 exception, | |
1085 KlassHandle(THREAD, | |
1086 SystemDictionary::Throwable_klass()), | |
1087 vmSymbols::printStackTrace_name(), | |
1088 vmSymbols::void_method_signature(), | |
1089 THREAD); | |
1090 } | |
1091 thread->set_vm_result((oop) result.get_jobject()); | |
1092 JRT_END | |
1093 | |
1061 | 1094 |
1062 | 1095 |
1063 | 1096 |
1064 OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { | 1097 OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { |
1065 | 1098 |
1947 __ leave(); | 1980 __ leave(); |
1948 __ ret(0); | 1981 __ ret(0); |
1949 break; | 1982 break; |
1950 } | 1983 } |
1951 | 1984 |
1985 case graal_generic_callback_id: { | |
1986 __ enter(); | |
1987 oop_maps = new OopMapSet(); | |
1988 OopMap* oop_map = save_live_registers(sasm, 0); | |
1989 int call_offset = __ call_RT(rax, noreg, (address)graal_generic_callback, j_rarg0, j_rarg1); | |
1990 oop_maps->add_gc_map(call_offset, oop_map); | |
1991 __ leave(); | |
1992 __ ret(0); | |
1993 break; | |
1994 } | |
1995 | |
1952 case graal_handle_exception_id: { | 1996 case graal_handle_exception_id: { |
1953 StubFrame f(sasm, "graal_handle_exception", dont_gc_arguments); | 1997 StubFrame f(sasm, "graal_handle_exception", dont_gc_arguments); |
1954 oop_maps = new OopMapSet(); | 1998 oop_maps = new OopMapSet(); |
1955 OopMap* oop_map = save_live_registers(sasm, 1, false); | 1999 OopMap* oop_map = save_live_registers(sasm, 1, false); |
1956 graal_generate_handle_exception(sasm, oop_maps, oop_map); | 2000 graal_generate_handle_exception(sasm, oop_maps, oop_map); |