1826 CompileLog* log = compilation()->log(); |
1826 CompileLog* log = compilation()->log(); |
1827 if (log != NULL) |
1827 if (log != NULL) |
1828 log->elem("call method='%d' instr='%s'", |
1828 log->elem("call method='%d' instr='%s'", |
1829 log->identify(target), |
1829 log->identify(target), |
1830 Bytecodes::name(code)); |
1830 Bytecodes::name(code)); |
|
1831 |
|
1832 // invoke-special-super |
|
1833 if (bc_raw == Bytecodes::_invokespecial && !target->is_object_initializer()) { |
|
1834 ciInstanceKlass* sender_klass = |
|
1835 calling_klass->is_anonymous() ? calling_klass->host_klass() : |
|
1836 calling_klass; |
|
1837 if (sender_klass->is_interface()) { |
|
1838 int index = state()->stack_size() - (target->arg_size_no_receiver() + 1); |
|
1839 Value receiver = state()->stack_at(index); |
|
1840 CheckCast* c = new CheckCast(sender_klass, receiver, copy_state_before()); |
|
1841 c->set_invokespecial_receiver_check(); |
|
1842 state()->stack_at_put(index, append_split(c)); |
|
1843 } |
|
1844 } |
1831 |
1845 |
1832 // Some methods are obviously bindable without any type checks so |
1846 // Some methods are obviously bindable without any type checks so |
1833 // convert them directly to an invokespecial or invokestatic. |
1847 // convert them directly to an invokespecial or invokestatic. |
1834 if (target->is_loaded() && !target->is_abstract() && target->can_be_statically_bound()) { |
1848 if (target->is_loaded() && !target->is_abstract() && target->can_be_statically_bound()) { |
1835 switch (bc_raw) { |
1849 switch (bc_raw) { |