use of lucee.transformer.bytecode.visitor.ForVisitor in project Lucee by lucee.
the class TagLoop method writeOutTypeTimes.
private void writeOutTypeTimes(BytecodeContext bc) throws TransformerException {
Factory f = bc.getFactory();
GeneratorAdapter adapter = bc.getAdapter();
int times = adapter.newLocal(Types.INT_VALUE);
ExprInt timesExpr = CastInt.toExprInt(getAttribute("times").getValue());
ExpressionUtil.writeOutSilent(timesExpr, bc, Expression.MODE_VALUE);
adapter.storeLocal(times);
ForVisitor fiv = new ForVisitor();
fiv.visitBegin(adapter, 1, false);
getBody().writeOut(bc);
fiv.visitEnd(bc, times, true, getStart());
}
use of lucee.transformer.bytecode.visitor.ForVisitor in project Lucee by lucee.
the class TagLoop method writeOutTypeListArray.
/**
* write out list loop
* @param adapter
* @throws TemplateException
*/
private void writeOutTypeListArray(BytecodeContext bc, boolean isArray) throws TransformerException {
ForVisitor forVisitor = new ForVisitor();
loopVisitor = forVisitor;
GeneratorAdapter adapter = bc.getAdapter();
// List.listToArrayRemoveEmpty("", 'c')
int array = adapter.newLocal(Types.ARRAY);
int len = adapter.newLocal(Types.INT_VALUE);
if (isArray) {
getAttribute("array").getValue().writeOut(bc, Expression.MODE_REF);
} else {
// array=List.listToArrayRemoveEmpty(list, delimter)
getAttribute("list").getValue().writeOut(bc, Expression.MODE_REF);
if (containsAttribute("delimiters")) {
getAttribute("delimiters").getValue().writeOut(bc, Expression.MODE_REF);
adapter.invokeStatic(Types.LIST_UTIL, LIST_TO_ARRAY_REMOVE_EMPTY_SS);
} else {
// ','
adapter.visitIntInsn(Opcodes.BIPUSH, 44);
// adapter.push(',');
adapter.invokeStatic(Types.LIST_UTIL, LIST_TO_ARRAY_REMOVE_EMPTY_SC);
}
}
adapter.storeLocal(array);
// int len=array.size();
adapter.loadLocal(array);
adapter.invokeInterface(Types.ARRAY, SIZE);
adapter.storeLocal(len);
// VariableInterpreter.getVariableReference(pc,Caster.toString(index));
Attribute attrIndex = getAttribute("index");
int index = -1;
if (attrIndex != null) {
index = adapter.newLocal(Types.VARIABLE_REFERENCE);
adapter.loadArg(0);
attrIndex.getValue().writeOut(bc, Expression.MODE_REF);
adapter.invokeStatic(Types.VARIABLE_INTERPRETER, GET_VARIABLE_REFERENCE);
adapter.storeLocal(index);
}
// VariableInterpreter.getVariableReference(pc,Caster.toString(item));
Attribute attrItem = getAttribute("item");
int item = -1;
if (attrItem != null) {
item = adapter.newLocal(Types.VARIABLE_REFERENCE);
adapter.loadArg(0);
attrItem.getValue().writeOut(bc, Expression.MODE_REF);
adapter.invokeStatic(Types.VARIABLE_INTERPRETER, GET_VARIABLE_REFERENCE);
adapter.storeLocal(item);
}
int obj = 0;
if (isArray)
obj = adapter.newLocal(Types.OBJECT);
// for(int i=1;i<=len;i++) {
int i = forVisitor.visitBegin(adapter, 1, false);
if (isArray) {
// value
adapter.loadLocal(array);
adapter.visitVarInsn(Opcodes.ILOAD, i);
ASMConstants.NULL(adapter);
adapter.invokeInterface(Types.ARRAY, GET);
adapter.dup();
adapter.storeLocal(obj);
Label endIf = new Label();
// adapter.loadLocal(obj);
adapter.visitJumpInsn(Opcodes.IFNONNULL, endIf);
adapter.goTo(forVisitor.getContinueLabel());
adapter.visitLabel(endIf);
if (item == -1)
adapter.loadLocal(index);
else
adapter.loadLocal(item);
adapter.loadArg(0);
adapter.loadLocal(obj);
} else {
if (item == -1)
adapter.loadLocal(index);
else
adapter.loadLocal(item);
adapter.loadArg(0);
adapter.loadLocal(array);
adapter.visitVarInsn(Opcodes.ILOAD, i);
adapter.invokeInterface(Types.ARRAY, GETE);
}
adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
adapter.pop();
// key
if (index != -1 && item != -1) {
adapter.loadLocal(index);
adapter.loadArg(0);
adapter.visitVarInsn(Opcodes.ILOAD, i);
adapter.cast(Types.INT_VALUE, Types.DOUBLE_VALUE);
adapter.invokeStatic(Types.CASTER, Methods_Caster.TO_DOUBLE[Methods_Caster.DOUBLE]);
adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
adapter.pop();
}
getBody().writeOut(bc);
forVisitor.visitEnd(bc, len, true, getStart());
}
Aggregations