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
|