1474 EXCEPTION_MARK;
1475 CallInfo info;
1476 resolve_special_call(info, link_info, THREAD);
1477 if (HAS_PENDING_EXCEPTION) {
1478 CLEAR_PENDING_EXCEPTION;
1479 return methodHandle();
1480 }
1481 return info.selected_method();
1482 }
1483
1484
1485
1486 //------------------------------------------------------------------------------------------------------------------------
1487 // ConstantPool entries
1488
1489 void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, Bytecodes::Code byte, TRAPS) {
1490 switch (byte) {
1491 case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break;
1492 case Bytecodes::_invokespecial : resolve_invokespecial (result, pool, index, CHECK); break;
1493 case Bytecodes::_invokevirtual : resolve_invokevirtual (result, recv, pool, index, CHECK); break;
1494 case Bytecodes::_invokedirect : resolve_invokevirtual (result, recv, pool, index, CHECK); break; // temp hack
1495 case Bytecodes::_invokehandle : resolve_invokehandle (result, pool, index, CHECK); break;
1496 case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break;
1497 case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
1498 }
1499 return;
1500 }
1501
1502 void LinkResolver::resolve_invoke(CallInfo& result, Handle& recv,
1503 const methodHandle& attached_method,
1504 Bytecodes::Code byte, TRAPS) {
1505 KlassHandle defc = attached_method->method_holder();
1506 Symbol* name = attached_method->name();
1507 Symbol* type = attached_method->signature();
1508 LinkInfo link_info(defc, name, type, KlassHandle(), /*check_access=*/false);
1509 switch(byte) {
1510 case Bytecodes::_invokevirtual:
1511 resolve_virtual_call(result, recv, recv->klass(), link_info,
1512 /*check_null_and_abstract=*/true, CHECK);
1513 break;
1514 case Bytecodes::_invokeinterface:
|
1474 EXCEPTION_MARK;
1475 CallInfo info;
1476 resolve_special_call(info, link_info, THREAD);
1477 if (HAS_PENDING_EXCEPTION) {
1478 CLEAR_PENDING_EXCEPTION;
1479 return methodHandle();
1480 }
1481 return info.selected_method();
1482 }
1483
1484
1485
1486 //------------------------------------------------------------------------------------------------------------------------
1487 // ConstantPool entries
1488
1489 void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, Bytecodes::Code byte, TRAPS) {
1490 switch (byte) {
1491 case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break;
1492 case Bytecodes::_invokespecial : resolve_invokespecial (result, pool, index, CHECK); break;
1493 case Bytecodes::_invokevirtual : resolve_invokevirtual (result, recv, pool, index, CHECK); break;
1494 case Bytecodes::_invokedirect : resolve_invokespecial (result, pool, index, CHECK); break; // temp hack
1495 case Bytecodes::_invokehandle : resolve_invokehandle (result, pool, index, CHECK); break;
1496 case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break;
1497 case Bytecodes::_invokeinterface: resolve_invokeinterface(result, recv, pool, index, CHECK); break;
1498 }
1499 return;
1500 }
1501
1502 void LinkResolver::resolve_invoke(CallInfo& result, Handle& recv,
1503 const methodHandle& attached_method,
1504 Bytecodes::Code byte, TRAPS) {
1505 KlassHandle defc = attached_method->method_holder();
1506 Symbol* name = attached_method->name();
1507 Symbol* type = attached_method->signature();
1508 LinkInfo link_info(defc, name, type, KlassHandle(), /*check_access=*/false);
1509 switch(byte) {
1510 case Bytecodes::_invokevirtual:
1511 resolve_virtual_call(result, recv, recv->klass(), link_info,
1512 /*check_null_and_abstract=*/true, CHECK);
1513 break;
1514 case Bytecodes::_invokeinterface:
|