public void doBuild(InstructionBuilder builder) { simpleTerm.callback.doBuild(builder); builder.dupe().when(Condition.NULL, new InstructionBuilderCallback() { public void doBuild(InstructionBuilder builder) { switch (nullHandling) { // It is necessary to load a null onto the stack (even if there's already one // there) because of the verifier. It sees the return when the stack contains an // intermediate value (along the navigation chain) and thinks the method is // returning a value of the wrong type. case ALLOW: builder.loadNull().returnResult(); case FORBID: builder.loadConstant(simpleTerm.description); builder.loadConstant(expression); builder.loadArgument(0); builder.invokeStatic(PropertyConduitSourceImpl.class, NullPointerException.class, "nullTerm", String.class, String.class, Object.class); builder.throwException(); break; } } }); } });
/** * The first part of any implementation of get() or set(): invoke the navigation method * and if the result is null, return immediately. */ private void invokeNavigateMethod(InstructionBuilder builder) { builder.loadThis().loadArgument(0).invokeVirtual(navMethod); builder.dupe().when(Condition.NULL, RETURN_NULL); }
public void doBuild(InstructionBuilder builder) { builder.loadArgument(0).dupe().when(Condition.NULL, new InstructionBuilderCallback() { public void doBuild(InstructionBuilder builder) { builder.throwException(NullPointerException.class, String.format("Root object of property expression '%s' is null.", expression)); } }); builder.checkcast(rootType).returnResult(); } });
public void doBuild(InstructionBuilder builder) { if (!reverse && !isRoot) { addSuperCall(builder); builder.loadArgument(1).invoke(Event.class, boolean.class, "isAborted"); builder.when(Condition.NON_ZERO, JUST_RETURN); } for (PlasticMethod invokedMethod : orderedMethods) { invokeMethod(builder, invokedMethod); } if (reverse && !isRoot) { addSuperCall(builder); } builder.returnDefaultValue(); } });
@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(); } });
builder.invoke(ComponentEvent.class, boolean.class, "matches", String.class, String.class, int.class); builder.when(Condition.NON_ZERO, new InstructionBuilderCallback()
private void invokeMethod(InstructionBuilder builder, PlasticMethod method) { // First, tell the Event object what method is being invoked. builder.loadArgument(1); builder.loadConstant( method.getMethodIdentifier()); builder.invoke(Event.class, void.class, "setMethodDescription", String.class); builder.loadThis(); // Methods either take no parameters, or take a MarkupWriter parameter. if (method.getParameters().size() > 0) { builder.loadArgument(0); } builder.invokeVirtual(method); // Non-void methods will pass a value to the event. if (!method.isVoid()) { builder.boxPrimitive(method.getDescription().returnType); builder.loadArgument(1).swap(); builder.invoke(Event.class, boolean.class, "storeResult", Object.class); builder.when(Condition.NON_ZERO, JUST_RETURN); } }
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); } });