package railo.transformer.bytecode.statement.tag; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import org.objectweb.asm.commons.GeneratorAdapter; import org.objectweb.asm.commons.Method; import railo.transformer.bytecode.BytecodeContext; import railo.transformer.bytecode.BytecodeException; import railo.transformer.bytecode.Position; import railo.transformer.bytecode.cast.CastInt; import railo.transformer.bytecode.expression.Expression; import railo.transformer.bytecode.util.Types; import railo.transformer.cfml.evaluator.impl.Argument; public final class TagParam extends TagBaseNoFinal { // void param(String type, String name, Object defaultValue) private static final Method PARAM_TYPE_NAME_DEFAULTVALUE = new Method( "param", Types.VOID, new Type[]{Types.STRING,Types.STRING,Types.OBJECT} ); private static final Method PARAM_TYPE_NAME_DEFAULTVALUE_REGEX = new Method( "param", Types.VOID, new Type[]{Types.STRING,Types.STRING,Types.OBJECT,Types.STRING} ); private static final Method PARAM_TYPE_NAME_DEFAULTVALUE_MIN_MAX = new Method( "param", Types.VOID, new Type[]{Types.STRING,Types.STRING,Types.OBJECT,Types.DOUBLE_VALUE,Types.DOUBLE_VALUE} ); private static final Method PARAM_TYPE_NAME_DEFAULTVALUE_MAXLENGTH = new Method( "param", Types.VOID, new Type[]{Types.STRING,Types.STRING,Types.OBJECT,Types.INT_VALUE} ); public TagParam(Position start,Position end) { super(start,end); } /** * * @see railo.transformer.bytecode.statement.tag.TagBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter) */ public void _writeOut(BytecodeContext bc) throws BytecodeException { GeneratorAdapter adapter = bc.getAdapter(); //PageContextImpl pc=null; //pc.param("", "", ""); Argument.checkDefaultValue(this); // pc adapter.loadArg(0); // type Attribute attrType = getAttribute("type"); if(attrType!=null) { attrType.getValue().writeOut(bc, Expression.MODE_REF); } else adapter.push("any"); // name getAttribute("name").getValue().writeOut(bc, Expression.MODE_REF); // default Attribute attrDefault = getAttribute("default"); if(attrDefault!=null) { attrDefault.getValue().writeOut(bc, Expression.MODE_REF); } else adapter.visitInsn(Opcodes.ACONST_NULL); Attribute attrMin = getAttribute("min"); Attribute attrMax = getAttribute("max"); Attribute attrPattern = getAttribute("pattern"); Attribute maxLength = getAttribute("maxLength"); if(attrMin!=null && attrMax!=null) { attrMin.getValue().writeOut(bc, Expression.MODE_VALUE); attrMax.getValue().writeOut(bc, Expression.MODE_VALUE); adapter.invokeVirtual(Types.PAGE_CONTEXT, PARAM_TYPE_NAME_DEFAULTVALUE_MIN_MAX); } else if(attrPattern!=null) { attrPattern.getValue().writeOut(bc, Expression.MODE_REF); adapter.invokeVirtual(Types.PAGE_CONTEXT, PARAM_TYPE_NAME_DEFAULTVALUE_REGEX); } else if(maxLength!=null) { CastInt.toExprInt(maxLength.getValue()).writeOut(bc, Expression.MODE_VALUE); adapter.invokeVirtual(Types.PAGE_CONTEXT, PARAM_TYPE_NAME_DEFAULTVALUE_MAXLENGTH); } else adapter.invokeVirtual(Types.PAGE_CONTEXT, PARAM_TYPE_NAME_DEFAULTVALUE); } }