*/
void extendShimInvoke(SwitchBlock block)
{
final String accessMethodName = setupMethodHandleAccess();
block.addCase(methodIndex, false, new InstructionBuilderCallback()
{
public void doBuild(InstructionBuilder builder)
{
builder.startTryCatch(new TryCatchCallback()
{
public void doBlock(TryCatchBlock block)
{
block.addTry(new InstructionBuilderCallback()
{
public void doBuild(InstructionBuilder builder)
{
// The third argument is an Object array; get each
for (int i = 0; i < description.argumentTypes.length; i++)
{
String argumentType = description.argumentTypes[i];
builder.loadArgument(2);
builder.loadArrayElement(i, Object.class.getName());
builder.castOrUnbox(argumentType);
}
builder.invokeVirtual(className, description.returnType, accessMethodName,
description.argumentTypes);
// TODO: hate see "void" just there.
if (description.returnType.equals("void"))
builder.loadNull();
else
builder.boxPrimitive(description.returnType);
builder.newInstance(SuccessMethodInvocationResult.class).dupe(1).swap();
builder.invokeConstructor(SuccessMethodInvocationResult.class, Object.class);
builder.returnResult();
}
});
for (String exceptionType : description.checkedExceptionTypes)
{
block.addCatch(exceptionType, new InstructionBuilderCallback()
{
public void doBuild(InstructionBuilder builder)
{
builder.newInstance(FailureMethodInvocationResult.class).dupe(1).swap();
builder.invokeConstructor(FailureMethodInvocationResult.class, Throwable.class);