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 }