public void boxIfPrimitive(InstructionBuilder builder, Class termType) { if (termType.isPrimitive()) builder.boxPrimitive(termType.getName()); }
@Override public void doBuild(InstructionBuilder builder) { builder.invokeVirtual(plasticClass.className, typeName, methodToInvoke).boxPrimitive(typeName).returnResult(); } });
@Override public void doBuild(InstructionBuilder builder) { builder.invokeVirtual(plasticClass.className, typeName, methodToInvoke).boxPrimitive(typeName).returnResult(); } });
private void bridgeToClojure(InstructionBuilder builder, MethodDescription description, PlasticField ifnField) { builder.loadThis().getField(ifnField); int count = description.argumentTypes.length; Class[] invokeParameterTypes = new Class[count]; for (int i = 0; i < count; i++) { invokeParameterTypes[i] = Object.class; builder.loadArgument(i).boxPrimitive(description.argumentTypes[i]); } Method ifnMethod = null; try { ifnMethod = IFn.class.getMethod("invoke", invokeParameterTypes); } catch (NoSuchMethodException ex) { throw new RuntimeException(String.format("Unable to find correct IFn.invoke() method: %s", ExceptionUtils.toMessage(ex)), ex); } builder.invoke(ifnMethod); builder.castOrUnbox(description.returnType); builder.returnResult(); } });
private void createReturnValueGetter() { InstructionBuilder builder = newMethod("getReturnValue", Object.class); if (isVoid) { builder.loadNull().returnResult(); } else { builder.loadThis().getField(invocationClassName, RETURN_VALUE, description.returnType) .boxPrimitive(description.returnType).returnResult(); } }
private void createReturnValueGetter() { InstructionBuilder builder = newMethod("getReturnValue", Object.class); if (isVoid) { builder.loadNull().returnResult(); } else { builder.loadThis().getField(invocationClassName, RETURN_VALUE, description.returnType) .boxPrimitive(description.returnType).returnResult(); } }
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); } }
private void replaceFieldWriteAccess(String conduitFieldName) { ensureNotPublic(); String setAccessName = plasticClass.makeUnique(plasticClass.methodNames, "conduit_set_" + node.name); setAccess = new MethodNode(accessForMethod(), setAccessName, "(" + node.desc + ")V", null, null); InstructionBuilder builder = plasticClass.newBuilder(setAccess); pushFieldConduitOntoStack(conduitFieldName, builder); builder.loadThis(); plasticClass.pushInstanceContextFieldOntoStack(builder); // Take the value passed to this method and push it onto the stack. builder.loadArgument(0); builder.boxPrimitive(typeName); builder.invoke(FieldConduit.class, void.class, "set", Object.class, InstanceContext.class, Object.class); if (isWriteBehindEnabled()) { builder.loadThis().loadArgument(0).putField(plasticClass.className, node.name, typeName); } builder.returnResult(); plasticClass.addMethod(setAccess); plasticClass.redirectFieldWrite(node.name, isPrivate(), setAccess); }
private void replaceFieldWriteAccess(String conduitFieldName) { ensureNotPublic(); String setAccessName = plasticClass.makeUnique(plasticClass.methodNames, "conduit_set_" + node.name); setAccess = new MethodNode(accessForMethod(), setAccessName, "(" + node.desc + ")V", null, null); InstructionBuilder builder = plasticClass.newBuilder(setAccess); pushFieldConduitOntoStack(conduitFieldName, builder); builder.loadThis(); plasticClass.pushInstanceContextFieldOntoStack(builder); // Take the value passed to this method and push it onto the stack. builder.loadArgument(0); builder.boxPrimitive(typeName); builder.invoke(FieldConduit.class, void.class, "set", Object.class, InstanceContext.class, Object.class); if (isWriteBehindEnabled()) { builder.loadThis().loadArgument(0).putField(plasticClass.className, node.name, typeName); } builder.returnResult(); plasticClass.addMethod(setAccess); plasticClass.redirectFieldWrite(node.name, isPrivate(), setAccess); }
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); } });