Mercurial > hg > truffle
comparison src/share/vm/c1/c1_GraphBuilder.cpp @ 6616:7a302948f5a4
7192167: JSR 292: C1 has old broken code which needs to be removed
Reviewed-by: kvn, roland, jrose
author | twisti |
---|---|
date | Tue, 21 Aug 2012 10:48:50 -0700 |
parents | 09aad8452938 |
children | 7f813940ac35 |
comparison
equal
deleted
inserted
replaced
6615:09aad8452938 | 6616:7a302948f5a4 |
---|---|
1644 return compilation()->dependency_recorder(); | 1644 return compilation()->dependency_recorder(); |
1645 } | 1645 } |
1646 | 1646 |
1647 | 1647 |
1648 void GraphBuilder::invoke(Bytecodes::Code code) { | 1648 void GraphBuilder::invoke(Bytecodes::Code code) { |
1649 const bool has_receiver = | |
1650 code == Bytecodes::_invokespecial || | |
1651 code == Bytecodes::_invokevirtual || | |
1652 code == Bytecodes::_invokeinterface; | |
1653 const bool is_invokedynamic = (code == Bytecodes::_invokedynamic); | 1649 const bool is_invokedynamic = (code == Bytecodes::_invokedynamic); |
1654 | 1650 |
1655 bool will_link; | 1651 bool will_link; |
1656 ciMethod* target = stream()->get_method(will_link); | 1652 ciMethod* target = stream()->get_method(will_link); |
1657 ciKlass* holder = stream()->get_declared_method_holder(); | 1653 ciKlass* holder = stream()->get_declared_method_holder(); |
1688 | 1684 |
1689 // Some methods are obviously bindable without any type checks so | 1685 // Some methods are obviously bindable without any type checks so |
1690 // convert them directly to an invokespecial or invokestatic. | 1686 // convert them directly to an invokespecial or invokestatic. |
1691 if (target->is_loaded() && !target->is_abstract() && target->can_be_statically_bound()) { | 1687 if (target->is_loaded() && !target->is_abstract() && target->can_be_statically_bound()) { |
1692 switch (bc_raw) { | 1688 switch (bc_raw) { |
1693 case Bytecodes::_invokevirtual: code = Bytecodes::_invokespecial; break; | 1689 case Bytecodes::_invokevirtual: |
1694 case Bytecodes::_invokehandle: code = Bytecodes::_invokestatic; break; | 1690 code = Bytecodes::_invokespecial; |
1691 break; | |
1692 case Bytecodes::_invokehandle: | |
1693 code = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokespecial; | |
1694 break; | |
1695 } | 1695 } |
1696 } | 1696 } |
1697 | 1697 |
1698 // Push appendix argument (MethodType, CallSite, etc.), if one. | 1698 // Push appendix argument (MethodType, CallSite, etc.), if one. |
1699 if (stream()->has_appendix()) { | 1699 if (stream()->has_appendix()) { |
1876 CHECK_BAILOUT(); | 1876 CHECK_BAILOUT(); |
1877 | 1877 |
1878 // inlining not successful => standard invoke | 1878 // inlining not successful => standard invoke |
1879 bool is_loaded = target->is_loaded(); | 1879 bool is_loaded = target->is_loaded(); |
1880 ValueType* result_type = as_ValueType(target->return_type()); | 1880 ValueType* result_type = as_ValueType(target->return_type()); |
1881 | 1881 ValueStack* state_before = copy_state_exhandling(); |
1882 // We require the debug info to be the "state before" because | 1882 |
1883 // invokedynamics may deoptimize. | 1883 // The bytecode (code) might change in this method so we are checking this very late. |
1884 ValueStack* state_before = is_invokedynamic ? copy_state_before() : copy_state_exhandling(); | 1884 const bool has_receiver = |
1885 | 1885 code == Bytecodes::_invokespecial || |
1886 code == Bytecodes::_invokevirtual || | |
1887 code == Bytecodes::_invokeinterface; | |
1886 Values* args = state()->pop_arguments(target->arg_size_no_receiver()); | 1888 Values* args = state()->pop_arguments(target->arg_size_no_receiver()); |
1887 Value recv = has_receiver ? apop() : NULL; | 1889 Value recv = has_receiver ? apop() : NULL; |
1888 int vtable_index = methodOopDesc::invalid_vtable_index; | 1890 int vtable_index = methodOopDesc::invalid_vtable_index; |
1889 | 1891 |
1890 #ifdef SPARC | 1892 #ifdef SPARC |