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 |