@Override public void doBuild(final LocalVariable indexVariable, InstructionBuilder builder) { builder.loadConstant(0).storeVariable(indexVariable); builder.doWhile(Condition.LESS_THAN, new WhileCallback() { @Override public void buildTest(InstructionBuilder builder) { builder.dupe().arrayLength(); builder.loadVariable(indexVariable).swap(); } @Override public void buildBody(InstructionBuilder builder) { builder.dupe().loadVariable(indexVariable).loadArrayElement(); callback.doBuild(builder); builder.increment(indexVariable); } }); } });
@Override public void doBuild(final LocalVariable indexVariable, InstructionBuilder builder) { builder.loadConstant(0).storeVariable(indexVariable); builder.doWhile(Condition.LESS_THAN, new WhileCallback() { @Override public void buildTest(InstructionBuilder builder) { builder.dupe().arrayLength(); builder.loadVariable(indexVariable).swap(); } @Override public void buildBody(InstructionBuilder builder) { builder.dupe().loadVariable(indexVariable).loadArrayElement(); callback.doBuild(builder); builder.increment(indexVariable); } }); } });
@Override public void doBuild(final LocalVariable invocation, InstructionBuilder builder) { builder.dupe().storeVariable(invocation); builder.invoke(AbstractMethodInvocation.class, MethodInvocation.class, "proceed"); if (description.checkedExceptionTypes.length > 0) { builder.invoke(MethodInvocation.class, boolean.class, "didThrowCheckedException"); builder.when(Condition.NON_ZERO, new InstructionBuilderCallback() { @Override public void doBuild(InstructionBuilder builder) { builder.loadVariable(invocation).loadTypeConstant(Exception.class); builder.invokeVirtual(invocationClassName, Throwable.class.getName(), "getCheckedException", Class.class.getName()); builder.throwException(); } }); } if (!isVoid) { builder.loadVariable(invocation).getField(invocationClassName, RETURN_VALUE, description.returnType); } builder.returnResult(); } });
@Override public void doBuild(final LocalVariable invocation, InstructionBuilder builder) { builder.dupe().storeVariable(invocation); builder.invoke(AbstractMethodInvocation.class, MethodInvocation.class, "proceed"); if (description.checkedExceptionTypes.length > 0) { builder.invoke(MethodInvocation.class, boolean.class, "didThrowCheckedException"); builder.when(Condition.NON_ZERO, new InstructionBuilderCallback() { @Override public void doBuild(InstructionBuilder builder) { builder.loadVariable(invocation).loadTypeConstant(Exception.class); builder.invokeVirtual(invocationClassName, Throwable.class.getName(), "getCheckedException", Class.class.getName()); builder.throwException(); } }); } if (!isVoid) { builder.loadVariable(invocation).getField(invocationClassName, RETURN_VALUE, description.returnType); } builder.returnResult(); } });
public void doBuild(InstructionBuilder builder) { builder.loadArgument(0).loadConstant(method.getMethodIdentifier()).invoke(Event.class, void.class, "setMethodDescription", String.class); builder.loadThis(); int count = description.argumentTypes.length; for (int i = 0; i < count; i++) { builder.loadThis().getField(sourceField).loadArgument(0).loadConstant(i); builder.invoke(EventHandlerMethodParameterSource.class, Object.class, "get", ComponentEvent.class, int.class); builder.castOrUnbox(description.argumentTypes[i]); } builder.invokeVirtual(method); if (!method.isVoid()) { builder.boxPrimitive(description.returnType); builder.loadArgument(0).swap(); builder.invoke(Event.class, boolean.class, "storeResult", Object.class); // storeResult() returns true if the method is aborted. Return true since, certainly, // a method was invoked. builder.when(Condition.NON_ZERO, RETURN_TRUE); } // Set the result to true, to indicate that some method was invoked. builder.loadConstant(true).storeVariable(resultVariable); } });