package railo.transformer.bytecode.statement.udf;
import org.objectweb.asm.commons.GeneratorAdapter;
import railo.transformer.bytecode.Body;
import railo.transformer.bytecode.BytecodeContext;
import railo.transformer.bytecode.BytecodeException;
import railo.transformer.bytecode.Page;
import railo.transformer.bytecode.Position;
import railo.transformer.bytecode.expression.Expression;
import railo.transformer.bytecode.expression.var.Variable;
import railo.transformer.bytecode.util.Types;
public final class FunctionImpl extends Function {
public FunctionImpl(Page page, Expression name, Expression returnType, Expression returnFormat, Expression output, Expression bufferOutput,
int access, Expression displayName, Expression description,Expression hint, Expression secureJson, Expression verifyClient, Expression localMode,
long cachedWithin, boolean _abstract, boolean _final,
Body body, Position start,Position end) {
super(page,name, returnType, returnFormat, output, bufferOutput, access, displayName,description, hint, secureJson, verifyClient,localMode,cachedWithin,_abstract,_final, body, start, end);
}
public FunctionImpl(Page page, String name, int access, String returnType, Body body,Position start,Position end) {
super(page,name, access, returnType, body, start, end);
}
public final void _writeOut(BytecodeContext bc, int pageType) throws BytecodeException{
GeneratorAdapter adapter = bc.getAdapter();
////Page page = ASMUtil.getAncestorPage(this);
////int index=page.addFunction(this);
// c.set(<name>,udf);
if(pageType==PAGE_TYPE_INTERFACE) {
adapter.loadArg(0);
}
else if(pageType==PAGE_TYPE_COMPONENT) {
adapter.loadArg(1);
}
// pc.variablesScope().set(<name>,udf);
else {
adapter.loadArg(0);
adapter.invokeVirtual(Types.PAGE_CONTEXT, VARIABLE_SCOPE);
}
boolean hasKey = Variable.registerKey(bc,name,true);
if(pageType==PAGE_TYPE_COMPONENT) {
loadUDFProperties(bc,valueIndex,arrayIndex,false);
adapter.invokeVirtual(Types.COMPONENT_IMPL, hasKey?REG_UDF_KEY:REG_UDF_STR);
}
else if(pageType==PAGE_TYPE_INTERFACE) {
loadUDFProperties(bc,valueIndex,arrayIndex,false);
adapter.invokeVirtual(Types.INTERFACE_IMPL, hasKey?REG_UDF_KEY:REG_UDF_STR);
}
else {
adapter.newInstance(Types.UDF_IMPL);
adapter.dup();
loadUDFProperties(bc, valueIndex,arrayIndex,false);
adapter.invokeConstructor(Types.UDF_IMPL, INIT_UDF_IMPL_PROP);
//loadUDF(bc, index);
adapter.invokeInterface(Types.VARIABLES, hasKey?SET_KEY:SET_STR);
adapter.pop();
}
}
}