comparison src/cpu/x86/vm/templateInterpreter_x86_32.cpp @ 3451:38fa55e5e792

7055355: JSR 292: crash while throwing WrongMethodTypeException Reviewed-by: jrose, twisti, bdelsart
author never
date Thu, 16 Jun 2011 13:46:55 -0700
parents 3d2ab563047a
children b20d64f83668
comparison
equal deleted inserted replaced
3450:3275a6560cf7 3451:38fa55e5e792
109 CAST_FROM_FN_PTR(address, 109 CAST_FROM_FN_PTR(address,
110 InterpreterRuntime::throw_ClassCastException), 110 InterpreterRuntime::throw_ClassCastException),
111 rax); 111 rax);
112 return entry; 112 return entry;
113 } 113 }
114
115 // Arguments are: required type at TOS+4, failing object (or NULL) at TOS.
116 address TemplateInterpreterGenerator::generate_WrongMethodType_handler() {
117 address entry = __ pc();
118
119 __ pop(rbx); // actual failing object is at TOS
120 __ pop(rax); // required type is at TOS+4
121
122 __ verify_oop(rbx);
123 __ verify_oop(rax);
124
125 // Various method handle types use interpreter registers as temps.
126 __ restore_bcp();
127 __ restore_locals();
128
129 // Expression stack must be empty before entering the VM for an exception.
130 __ empty_expression_stack();
131 __ empty_FPU_stack();
132 __ call_VM(noreg,
133 CAST_FROM_FN_PTR(address,
134 InterpreterRuntime::throw_WrongMethodTypeException),
135 // pass required type, failing object (or NULL)
136 rax, rbx);
137 return entry;
138 }
139
140 114
141 address TemplateInterpreterGenerator::generate_exception_handler_common(const char* name, const char* message, bool pass_oop) { 115 address TemplateInterpreterGenerator::generate_exception_handler_common(const char* name, const char* message, bool pass_oop) {
142 assert(!pass_oop || message == NULL, "either oop or message but not both"); 116 assert(!pass_oop || message == NULL, "either oop or message but not both");
143 address entry = __ pc(); 117 address entry = __ pc();
144 if (pass_oop) { 118 if (pass_oop) {