src/cpu/sparc/vm/templateInterpreter_sparc.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Tue Jan 20 02:13:53 2009
--- new/src/cpu/sparc/vm/templateInterpreter_sparc.cpp Tue Jan 20 02:13:52 2009
*** 106,115 ****
--- 106,143 ----
__ should_not_reach_here();
return entry;
}
+ #ifdef ASSERT
+ address last_WrongMethodType_caller;
+ #endif //ASSERT
+
+ // Arguments are: required type in G5_method_type, and
+ // failing object (or NULL) in G3_method_handle.
+ // In the debug build, the caller should put his own PC in G1.
+ address TemplateInterpreterGenerator::generate_WrongMethodType_handler() {
+ address entry = __ pc();
+ #ifdef ASSERT
+ Address last_caller_addr(O3, (address)&last_WrongMethodType_caller);
+ __ sethi(last_caller_addr);
+ __ st_ptr(G1, last_caller_addr);
+ #endif //ASSERT
+ // expression stack must be empty before entering the VM if an exception
+ // happened
+ __ empty_expression_stack();
+ // load exception object
+ __ call_VM(Oexception,
+ CAST_FROM_FN_PTR(address,
+ InterpreterRuntime::throw_WrongMethodTypeException),
+ G5_method_type, // required
+ G3_method_handle); // actual
+ __ should_not_reach_here();
+ return entry;
+ }
+
+
address TemplateInterpreterGenerator::generate_ArrayIndexOutOfBounds_handler(const char* name) {
address entry = __ pc();
// expression stack must be empty before entering the VM if an exception happened
__ empty_expression_stack();
// convention: expect aberrant index in register G3_scratch, then shuffle the
*** 446,455 ****
--- 474,484 ----
const Address max_stack (G5_method, 0, in_bytes(methodOopDesc::max_stack_offset()));
int rounded_vm_local_words = round_to( frame::interpreter_frame_vm_local_words, WordsPerLong );
const int extra_space =
rounded_vm_local_words + // frame local scratch space
+ methodOopDesc::extra_stack() + // extra push slot for MH insertion
frame::memory_parameter_word_sp_offset + // register save area
(native_call ? frame::interpreter_frame_extra_outgoing_argument_words : 0);
const Register Glocals_size = G3;
const Register Otmp1 = O3;
*** 1443,1453 ****
--- 1472,1483 ----
const int rounded_vm_local_words =
round_to(frame::interpreter_frame_vm_local_words,WordsPerLong);
// callee_locals and max_stack are counts, not the size in frame.
const int locals_size =
round_to(callee_extra_locals * Interpreter::stackElementWords(), WordsPerLong);
! const int max_stack_words = max_stack * Interpreter::stackElementWords();
! const int extra_stack = methodOopDesc::extra_stack();
+ const int max_stack_words = (max_stack + extra_stack) * Interpreter::stackElementWords();
return (round_to((max_stack_words
+ rounded_vm_local_words
+ frame::memory_parameter_word_sp_offset), WordsPerLong)
// already rounded
+ locals_size + monitor_size);
src/cpu/sparc/vm/templateInterpreter_sparc.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File