Search in sources :

Example 6 with WhileVisitor

use of lucee.transformer.bytecode.visitor.WhileVisitor in project Lucee by lucee.

the class TagLoop method writeOutTypeCollection.

/**
 * write out collection loop
 * @param adapter
 * @throws TemplateException
 */
private void writeOutTypeCollection(BytecodeContext bc) throws TransformerException {
    GeneratorAdapter adapter = bc.getAdapter();
    // VariableReference item=VariableInterpreter.getVariableReference(pc,index);
    int index = -1;
    Attribute attrIndex = getAttribute("index");
    if (attrIndex == null)
        attrIndex = getAttribute("key");
    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);
    }
    // VariableReference item=VariableInterpreter.getVariableReference(pc,item);
    int item = -1;
    Attribute attrItem = getAttribute("item");
    if (attrItem == null)
        attrItem = getAttribute("value");
    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);
    }
    boolean hasIndexAndItem = index != -1 && item != -1;
    boolean hasItem = item != -1;
    WhileVisitor whileVisitor = new WhileVisitor();
    loopVisitor = whileVisitor;
    // java.util.Iterator it=Caster.toIterator(@collection');
    int it = adapter.newLocal(Types.ITERATOR);
    Attribute coll = getAttribute("struct");
    if (coll == null)
        coll = getAttribute("collection");
    coll.getValue().writeOut(bc, Expression.MODE_REF);
    // item and index
    int entry = -1;
    if (hasIndexAndItem) {
        entry = adapter.newLocal(Types.MAP_ENTRY);
        // Caster.toCollection(collection)
        adapter.invokeStatic(Types.CASTER, Methods_Caster.TO_COLLECTION);
        // coll.entryIterator();
        adapter.invokeInterface(Types.COLLECTION, ENTRY_ITERATOR);
    } else {
        // if(hasItem) adapter.invokeStatic(ForEach.FOR_EACH_UTIL,ForEach.FOR_EACH);
        // else
        adapter.invokeStatic(ForEach.FOR_EACH_UTIL, ForEach.LOOP_COLLECTION);
    }
    adapter.storeLocal(it);
    // while(it.hasNext()) {
    whileVisitor.visitBeforeExpression(bc);
    adapter.loadLocal(it);
    adapter.invokeInterface(Types.ITERATOR, HAS_NEXT);
    whileVisitor.visitAfterExpressionBeforeBody(bc);
    if (hasIndexAndItem) {
        // entry=it.next();
        adapter.loadLocal(it);
        adapter.invokeInterface(Types.ITERATOR, NEXT);
        adapter.storeLocal(entry);
        // keyRef.set(pc,entry.getKey())
        adapter.loadLocal(index);
        adapter.loadArg(0);
        adapter.loadLocal(entry);
        adapter.invokeInterface(Types.MAP_ENTRY, GET_KEY);
        adapter.invokeStatic(Types.CASTER, Methods.METHOD_TO_STRING);
        adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
        adapter.pop();
        // valueRef.set(pc,entry.getKey())
        adapter.loadLocal(item);
        adapter.loadArg(0);
        adapter.loadLocal(entry);
        adapter.invokeInterface(Types.MAP_ENTRY, GET_VALUE);
        adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
        adapter.pop();
    } else {
        if (index == -1)
            adapter.loadLocal(item);
        else
            adapter.loadLocal(index);
        adapter.loadArg(0);
        adapter.loadLocal(it);
        adapter.invokeInterface(Types.ITERATOR, NEXT);
        adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
        adapter.pop();
    }
    getBody().writeOut(bc);
    whileVisitor.visitAfterBody(bc, getEnd());
    // Reset
    adapter.loadLocal(it);
    adapter.invokeStatic(ForEach.FOR_EACH_UTIL, ForEach.RESET);
}
Also used : GeneratorAdapter(org.objectweb.asm.commons.GeneratorAdapter) DoWhileVisitor(lucee.transformer.bytecode.visitor.DoWhileVisitor) WhileVisitor(lucee.transformer.bytecode.visitor.WhileVisitor)

Example 7 with WhileVisitor

use of lucee.transformer.bytecode.visitor.WhileVisitor in project Lucee by lucee.

the class TagLoop method writeOutTypeFile.

/**
 * write out file loop
 * @param adapter
 * @throws TemplateException
 */
private void writeOutTypeFile(BytecodeContext bc) throws TransformerException {
    WhileVisitor whileVisitor = new WhileVisitor();
    loopVisitor = whileVisitor;
    GeneratorAdapter adapter = bc.getAdapter();
    // charset=@charset
    int charset = adapter.newLocal(Types.STRING);
    Attribute attrCharset = getAttribute("charset");
    if (attrCharset == null)
        adapter.visitInsn(Opcodes.ACONST_NULL);
    else
        attrCharset.getValue().writeOut(bc, Expression.MODE_REF);
    adapter.storeLocal(charset);
    // startline=@startline
    int startline = adapter.newLocal(Types.INT_VALUE);
    Attribute attrStartLine = getAttribute("startline");
    // CF8
    if (attrStartLine == null)
        attrStartLine = getAttribute("from");
    if (attrStartLine == null)
        adapter.push(1);
    else {
        attrStartLine.getValue().writeOut(bc, Expression.MODE_VALUE);
        adapter.visitInsn(Opcodes.D2I);
    }
    adapter.storeLocal(startline);
    // endline=@endline
    int endline = adapter.newLocal(Types.INT_VALUE);
    Attribute attrEndLine = getAttribute("endline");
    if (attrEndLine == null)
        attrEndLine = getAttribute("to");
    if (attrEndLine == null)
        adapter.push(-1);
    else {
        attrEndLine.getValue().writeOut(bc, Expression.MODE_VALUE);
        adapter.visitInsn(Opcodes.D2I);
    }
    adapter.storeLocal(endline);
    // VariableReference index=VariableInterpreter.getVariableReference(pc,@index);
    int index = -1, item = -1;
    // item
    Attribute attrItem = getAttribute("item");
    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);
    }
    // index
    Attribute attrIndex = getAttribute("index");
    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);
    }
    // java.io.File file=FileUtil.toResourceExisting(pc,@file);
    int resource = adapter.newLocal(Types.RESOURCE);
    adapter.loadArg(0);
    getAttribute("file").getValue().writeOut(bc, Expression.MODE_REF);
    adapter.invokeStatic(RESOURCE_UTIL, TO_RESOURCE_EXISTING);
    adapter.storeLocal(resource);
    // pc.getConfig().getSecurityManager().checkFileLocation(resource);
    adapter.loadArg(0);
    adapter.invokeVirtual(Types.PAGE_CONTEXT, GET_CONFIG);
    adapter.invokeInterface(Types.CONFIG_WEB, GET_SECURITY_MANAGER);
    adapter.loadLocal(resource);
    adapter.invokeInterface(Types.SECURITY_MANAGER, CHECK_FILE_LOCATION);
    // char[] carr=new char[characters];
    Attribute attr = getAttribute("characters");
    int carr = -1;
    if (attr != null) {
        carr = adapter.newLocal(Types.CHAR_ARRAY);
        attr.getValue().writeOut(bc, Expression.MODE_VALUE);
        adapter.cast(Types.DOUBLE_VALUE, Types.INT_VALUE);
        adapter.newArray(Types.CHAR);
        adapter.storeLocal(carr);
    }
    // BufferedReader reader = IOUtil.getBufferedReader(resource,charset);
    final int br = adapter.newLocal(Types.BUFFERED_READER);
    adapter.loadLocal(resource);
    adapter.loadLocal(charset);
    adapter.invokeStatic(IO_UTIL, GET_BUFFERED_READER);
    adapter.storeLocal(br);
    // String line;
    int line = adapter.newLocal(Types.STRING);
    // int count=0;
    int count = adapter.newLocal(Types.INT_VALUE);
    adapter.push(0);
    adapter.storeLocal(count);
    TryFinallyVisitor tfv = new TryFinallyVisitor(new OnFinally() {

        @Override
        public void _writeOut(BytecodeContext bc) {
            bc.getAdapter().loadLocal(br);
            bc.getAdapter().invokeStatic(IO_UTIL, CLOSE_EL);
        }
    }, null);
    // TryFinallyVisitor tcfv=new TryFinallyVisitor();
    // try
    tfv.visitTryBegin(bc);
    // tcfv.visitTryBegin(bc);
    // while((line=br.readLine())!=null) {
    // WhileVisitor wv=new WhileVisitor();
    whileVisitor.visitBeforeExpression(bc);
    DecisionObjectVisitor dv = new DecisionObjectVisitor();
    dv.visitBegin();
    if (attr != null) {
        // IOUtil.read(bufferedreader,12)
        adapter.loadLocal(br);
        adapter.loadLocal(carr);
        adapter.arrayLength();
        adapter.invokeStatic(Types.IOUTIL, READ);
    } else {
        // br.readLine()
        adapter.loadLocal(br);
        adapter.invokeVirtual(Types.BUFFERED_READER, READ_LINE);
    }
    adapter.dup();
    adapter.storeLocal(line);
    dv.visitNEQ();
    adapter.visitInsn(Opcodes.ACONST_NULL);
    dv.visitEnd(bc);
    whileVisitor.visitAfterExpressionBeforeBody(bc);
    // if(++count < startLine) continue;
    DecisionIntVisitor dv2 = new DecisionIntVisitor();
    dv2.visitBegin();
    adapter.iinc(count, 1);
    adapter.loadLocal(count);
    dv2.visitLT();
    adapter.loadLocal(startline);
    dv2.visitEnd(bc);
    Label end = new Label();
    adapter.ifZCmp(Opcodes.IFEQ, end);
    whileVisitor.visitContinue(bc);
    adapter.visitLabel(end);
    // if(endLine!=-1 && count > endLine) break;
    DecisionIntVisitor div = new DecisionIntVisitor();
    div.visitBegin();
    adapter.loadLocal(endline);
    div.visitNEQ();
    adapter.push(-1);
    div.visitEnd(bc);
    Label end2 = new Label();
    adapter.ifZCmp(Opcodes.IFEQ, end2);
    DecisionIntVisitor div2 = new DecisionIntVisitor();
    div2.visitBegin();
    adapter.loadLocal(count);
    div2.visitGT();
    adapter.loadLocal(endline);
    div2.visitEnd(bc);
    Label end3 = new Label();
    adapter.ifZCmp(Opcodes.IFEQ, end3);
    whileVisitor.visitBreak(bc);
    adapter.visitLabel(end3);
    adapter.visitLabel(end2);
    // index and item
    if (index != -1 && item != -1) {
        // index.set(pc,line);
        adapter.loadLocal(index);
        adapter.loadArg(0);
        adapter.loadLocal(count);
        adapter.cast(Types.INT_VALUE, Types.DOUBLE_VALUE);
        adapter.invokeStatic(Types.CASTER, Methods.METHOD_TO_DOUBLE_FROM_DOUBLE);
        adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
        adapter.pop();
        // item.set(pc,line);
        adapter.loadLocal(item);
        adapter.loadArg(0);
        adapter.loadLocal(line);
        adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
        adapter.pop();
    } else // only index
    if (index != -1) {
        // index.set(pc,line);
        adapter.loadLocal(index);
        adapter.loadArg(0);
        adapter.loadLocal(line);
        adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
        adapter.pop();
    } else // only item
    {
        // item.set(pc,line);
        adapter.loadLocal(item);
        adapter.loadArg(0);
        adapter.loadLocal(line);
        adapter.invokeVirtual(Types.VARIABLE_REFERENCE, SET);
        adapter.pop();
    }
    getBody().writeOut(bc);
    whileVisitor.visitAfterBody(bc, getEnd());
    tfv.visitTryEnd(bc);
}
Also used : OnFinally(lucee.transformer.bytecode.visitor.OnFinally) Label(org.objectweb.asm.Label) GeneratorAdapter(org.objectweb.asm.commons.GeneratorAdapter) DecisionIntVisitor(lucee.transformer.bytecode.visitor.DecisionIntVisitor) DoWhileVisitor(lucee.transformer.bytecode.visitor.DoWhileVisitor) WhileVisitor(lucee.transformer.bytecode.visitor.WhileVisitor) TryFinallyVisitor(lucee.transformer.bytecode.visitor.TryFinallyVisitor) BytecodeContext(lucee.transformer.bytecode.BytecodeContext) DecisionObjectVisitor(lucee.transformer.bytecode.visitor.DecisionObjectVisitor)

Example 8 with WhileVisitor

use of lucee.transformer.bytecode.visitor.WhileVisitor in project Lucee by lucee.

the class TagWhile method _writeOut.

/**
 * @see lucee.transformer.bytecode.statement.StatementBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter)
 */
@Override
public void _writeOut(BytecodeContext bc) throws TransformerException {
    wv = new WhileVisitor();
    wv.visitBeforeExpression(bc);
    getAttribute("condition").getValue().writeOut(bc, Expression.MODE_VALUE);
    wv.visitAfterExpressionBeforeBody(bc);
    getBody().writeOut(bc);
    wv.visitAfterBody(bc, getEnd());
}
Also used : WhileVisitor(lucee.transformer.bytecode.visitor.WhileVisitor)

Aggregations

WhileVisitor (lucee.transformer.bytecode.visitor.WhileVisitor)8 GeneratorAdapter (org.objectweb.asm.commons.GeneratorAdapter)6 Label (org.objectweb.asm.Label)5 DoWhileVisitor (lucee.transformer.bytecode.visitor.DoWhileVisitor)3 BytecodeContext (lucee.transformer.bytecode.BytecodeContext)2 DecisionIntVisitor (lucee.transformer.bytecode.visitor.DecisionIntVisitor)2 OnFinally (lucee.transformer.bytecode.visitor.OnFinally)2 ParseBodyVisitor (lucee.transformer.bytecode.visitor.ParseBodyVisitor)2 TryFinallyVisitor (lucee.transformer.bytecode.visitor.TryFinallyVisitor)2 DecisionObjectVisitor (lucee.transformer.bytecode.visitor.DecisionObjectVisitor)1 Expression (lucee.transformer.expression.Expression)1 LitString (lucee.transformer.expression.literal.LitString)1