< prev index next >

src/share/vm/interpreter/templateInterpreter.cpp

Print this page




 585 }
 586 
 587 //------------------------------------------------------------------------------------------------------------------------
 588 // Entry points
 589 
 590 /**
 591  * Returns the return entry table for the given invoke bytecode.
 592  */
 593 address* TemplateInterpreter::invoke_return_entry_table_for(Bytecodes::Code code) {
 594   switch (code) {
 595   case Bytecodes::_invokestatic:
 596   case Bytecodes::_invokespecial:
 597   case Bytecodes::_invokevirtual:
 598   case Bytecodes::_invokehandle:
 599     return Interpreter::invoke_return_entry_table();
 600   case Bytecodes::_invokeinterface:
 601     return Interpreter::invokeinterface_return_entry_table();
 602   case Bytecodes::_invokedynamic:
 603     return Interpreter::invokedynamic_return_entry_table();
 604   default:
 605     fatal(err_msg("invalid bytecode: %s", Bytecodes::name(code)));
 606     return NULL;
 607   }
 608 }
 609 
 610 /**
 611  * Returns the return entry address for the given top-of-stack state and bytecode.
 612  */
 613 address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
 614   guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length");
 615   const int index = TosState_as_index(state);
 616   switch (code) {
 617   case Bytecodes::_invokestatic:
 618   case Bytecodes::_invokespecial:
 619   case Bytecodes::_invokevirtual:
 620   case Bytecodes::_invokehandle:
 621     return _invoke_return_entry[index];
 622   case Bytecodes::_invokeinterface:
 623     return _invokeinterface_return_entry[index];
 624   case Bytecodes::_invokedynamic:
 625     return _invokedynamic_return_entry[index];
 626   default:
 627     assert(!Bytecodes::is_invoke(code), err_msg("invoke instructions should be handled separately: %s", Bytecodes::name(code)));
 628     return _return_entry[length].entry(state);
 629   }
 630 }
 631 
 632 
 633 address TemplateInterpreter::deopt_entry(TosState state, int length) {
 634   guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
 635   return _deopt_entry[length].entry(state);
 636 }
 637 
 638 //------------------------------------------------------------------------------------------------------------------------
 639 // Suport for invokes
 640 
 641 int TemplateInterpreter::TosState_as_index(TosState state) {
 642   assert( state < number_of_states , "Invalid state in TosState_as_index");
 643   assert(0 <= (int)state && (int)state < TemplateInterpreter::number_of_return_addrs, "index out of bounds");
 644   return (int)state;
 645 }
 646 
 647 




 585 }
 586 
 587 //------------------------------------------------------------------------------------------------------------------------
 588 // Entry points
 589 
 590 /**
 591  * Returns the return entry table for the given invoke bytecode.
 592  */
 593 address* TemplateInterpreter::invoke_return_entry_table_for(Bytecodes::Code code) {
 594   switch (code) {
 595   case Bytecodes::_invokestatic:
 596   case Bytecodes::_invokespecial:
 597   case Bytecodes::_invokevirtual:
 598   case Bytecodes::_invokehandle:
 599     return Interpreter::invoke_return_entry_table();
 600   case Bytecodes::_invokeinterface:
 601     return Interpreter::invokeinterface_return_entry_table();
 602   case Bytecodes::_invokedynamic:
 603     return Interpreter::invokedynamic_return_entry_table();
 604   default:
 605     fatal("invalid bytecode: %s", Bytecodes::name(code));
 606     return NULL;
 607   }
 608 }
 609 
 610 /**
 611  * Returns the return entry address for the given top-of-stack state and bytecode.
 612  */
 613 address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
 614   guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length");
 615   const int index = TosState_as_index(state);
 616   switch (code) {
 617   case Bytecodes::_invokestatic:
 618   case Bytecodes::_invokespecial:
 619   case Bytecodes::_invokevirtual:
 620   case Bytecodes::_invokehandle:
 621     return _invoke_return_entry[index];
 622   case Bytecodes::_invokeinterface:
 623     return _invokeinterface_return_entry[index];
 624   case Bytecodes::_invokedynamic:
 625     return _invokedynamic_return_entry[index];
 626   default:
 627     assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code));
 628     return _return_entry[length].entry(state);
 629   }
 630 }
 631 
 632 
 633 address TemplateInterpreter::deopt_entry(TosState state, int length) {
 634   guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
 635   return _deopt_entry[length].entry(state);
 636 }
 637 
 638 //------------------------------------------------------------------------------------------------------------------------
 639 // Suport for invokes
 640 
 641 int TemplateInterpreter::TosState_as_index(TosState state) {
 642   assert( state < number_of_states , "Invalid state in TosState_as_index");
 643   assert(0 <= (int)state && (int)state < TemplateInterpreter::number_of_return_addrs, "index out of bounds");
 644   return (int)state;
 645 }
 646 
 647 


< prev index next >