001    package railo.transformer.bytecode.statement.udf;
002    
003    import org.objectweb.asm.commons.GeneratorAdapter;
004    
005    import railo.transformer.bytecode.Body;
006    import railo.transformer.bytecode.BytecodeContext;
007    import railo.transformer.bytecode.BytecodeException;
008    import railo.transformer.bytecode.Page;
009    import railo.transformer.bytecode.Position;
010    import railo.transformer.bytecode.expression.Expression;
011    import railo.transformer.bytecode.expression.var.Variable;
012    import railo.transformer.bytecode.util.Types;
013    
014    public final class FunctionImpl extends Function {
015    
016            public FunctionImpl(Page page, Expression name, Expression returnType, Expression returnFormat, Expression output, Expression bufferOutput,
017                            int access, Expression displayName, Expression description,Expression hint, Expression secureJson, Expression verifyClient, Expression localMode,
018                            long cachedWithin, boolean _abstract, boolean _final,
019                            Body body, Position start,Position end) {
020                    super(page,name, returnType, returnFormat, output, bufferOutput, access, displayName,description, hint, secureJson, verifyClient,localMode,cachedWithin,_abstract,_final, body, start, end);
021            }
022            
023    
024            public FunctionImpl(Page page, String name, int access, String returnType, Body body,Position start,Position end) {
025                    super(page,name, access, returnType, body, start, end);
026            }
027    
028            public final void _writeOut(BytecodeContext bc, int pageType) throws BytecodeException{
029                    GeneratorAdapter adapter = bc.getAdapter();
030                    ////Page page = ASMUtil.getAncestorPage(this);
031                    ////int index=page.addFunction(this);
032    
033                    // c.set(<name>,udf);
034                    if(pageType==PAGE_TYPE_INTERFACE) {
035                            adapter.loadArg(0);
036                    }
037                    else if(pageType==PAGE_TYPE_COMPONENT) {
038                            adapter.loadArg(1);
039                    }
040                    // pc.variablesScope().set(<name>,udf);
041                    else {
042                            adapter.loadArg(0);
043                            adapter.invokeVirtual(Types.PAGE_CONTEXT, VARIABLE_SCOPE);
044                    }
045                    
046                    
047                    boolean hasKey = Variable.registerKey(bc,name,true);
048                    if(pageType==PAGE_TYPE_COMPONENT) {
049                            loadUDFProperties(bc,valueIndex,arrayIndex,false);
050                            adapter.invokeVirtual(Types.COMPONENT_IMPL, hasKey?REG_UDF_KEY:REG_UDF_STR);
051                    }
052                    else if(pageType==PAGE_TYPE_INTERFACE) {
053                            loadUDFProperties(bc,valueIndex,arrayIndex,false);
054                            adapter.invokeVirtual(Types.INTERFACE_IMPL, hasKey?REG_UDF_KEY:REG_UDF_STR);
055                    }
056                    else {
057                            adapter.newInstance(Types.UDF_IMPL);
058                            adapter.dup();
059                            loadUDFProperties(bc, valueIndex,arrayIndex,false);
060                            adapter.invokeConstructor(Types.UDF_IMPL, INIT_UDF_IMPL_PROP);
061                            
062                            //loadUDF(bc, index);
063                            adapter.invokeInterface(Types.VARIABLES, hasKey?SET_KEY:SET_STR);
064                            adapter.pop();
065                    }
066            }
067            
068    }