Mercurial > hg > graal-compiler
diff src/cpu/x86/vm/templateInterpreter_x86_32.cpp @ 710:e5b0439ef4ae
6655638: dynamic languages need method handles
Summary: initial implementation, with known omissions (x86/64, sparc, compiler optim., c-oops, C++ interp.)
Reviewed-by: kvn, twisti, never
author | jrose |
---|---|
date | Wed, 08 Apr 2009 10:56:49 -0700 |
parents | 7bb995fbd3c0 |
children | be93aad57795 |
line wrap: on
line diff
--- a/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Wed Apr 08 00:12:59 2009 -0700 +++ b/src/cpu/x86/vm/templateInterpreter_x86_32.cpp Wed Apr 08 10:56:49 2009 -0700 @@ -92,6 +92,33 @@ return entry; } +// Arguments are: required type at TOS+8, failing object (or NULL) at TOS+4. +// pc at TOS (just for debugging) +address TemplateInterpreterGenerator::generate_WrongMethodType_handler() { + address entry = __ pc(); + + __ pop(rbx); // actual failing object is at TOS + __ pop(rax); // required type is at TOS+4 + + __ verify_oop(rbx); + __ verify_oop(rax); + + // Various method handle types use interpreter registers as temps. + __ restore_bcp(); + __ restore_locals(); + + // Expression stack must be empty before entering the VM for an exception. + __ empty_expression_stack(); + __ empty_FPU_stack(); + __ call_VM(noreg, + CAST_FROM_FN_PTR(address, + InterpreterRuntime::throw_WrongMethodTypeException), + // pass required type, failing object (or NULL) + rax, rbx); + return entry; +} + + address TemplateInterpreterGenerator::generate_exception_handler_common(const char* name, const char* message, bool pass_oop) { assert(!pass_oop || message == NULL, "either oop or message but not both"); address entry = __ pc(); @@ -1370,6 +1397,7 @@ case Interpreter::empty : entry_point = ((InterpreterGenerator*)this)->generate_empty_entry(); break; case Interpreter::accessor : entry_point = ((InterpreterGenerator*)this)->generate_accessor_entry(); break; case Interpreter::abstract : entry_point = ((InterpreterGenerator*)this)->generate_abstract_entry(); break; + case Interpreter::method_handle : entry_point = ((InterpreterGenerator*)this)->generate_method_handle_entry(); break; case Interpreter::java_lang_math_sin : // fall thru case Interpreter::java_lang_math_cos : // fall thru @@ -1400,7 +1428,8 @@ // be sure to change this if you add/subtract anything to/from the overhead area const int overhead_size = -frame::interpreter_frame_initial_sp_offset; - const int method_stack = (method->max_locals() + method->max_stack()) * + const int extra_stack = methodOopDesc::extra_stack_entries(); + const int method_stack = (method->max_locals() + method->max_stack() + extra_stack) * Interpreter::stackElementWords(); return overhead_size + method_stack + stub_code; }