Search in sources :

Example 1 with WhileVisitor

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

the class TagGroupUtil method writeOutTypeQuery.

public static void writeOutTypeQuery(final TagGroup tag, BytecodeContext bc) throws TransformerException {
    final GeneratorAdapter adapter = bc.getAdapter();
    tag.setNumberIterator(adapter.newLocal(NUMBER_ITERATOR));
    boolean isOutput = tag.getType() == TagGroup.TAG_OUTPUT;
    ParseBodyVisitor pbv = isOutput ? new ParseBodyVisitor() : null;
    if (isOutput)
        pbv.visitBegin(bc);
    // Query query=pc.getQuery(@query);
    tag.setQuery(adapter.newLocal(Types.QUERY));
    adapter.loadArg(0);
    Expression val = tag.getAttribute("query").getValue();
    val.writeOut(bc, Expression.MODE_REF);
    if (val instanceof LitString)
        adapter.invokeVirtual(Types.PAGE_CONTEXT, TagLoop.GET_QUERY_STRING);
    else
        adapter.invokeVirtual(Types.PAGE_CONTEXT, TagLoop.GET_QUERY_OBJ);
    adapter.storeLocal(tag.getQuery());
    tag.setPID(adapter.newLocal(Types.INT_VALUE));
    adapter.loadArg(0);
    adapter.invokeVirtual(Types.PAGE_CONTEXT, TagLoop.GET_ID);
    adapter.storeLocal(tag.getPID());
    // int startAt=query.getCurrentrow();
    final int startAt = adapter.newLocal(Types.INT_VALUE);
    adapter.loadLocal(tag.getQuery());
    adapter.loadLocal(tag.getPID());
    // adapter.loadArg(0);
    // adapter.invokeVirtual(Types.PAGE_CONTEXT, TagLoop.GET_ID);
    adapter.invokeInterface(Types.QUERY, TagLoop.GET_CURRENTROW_1);
    adapter.storeLocal(startAt);
    // if(query.getRecordcount()>0) {
    DecisionIntVisitor div = new DecisionIntVisitor();
    div.visitBegin();
    adapter.loadLocal(tag.getQuery());
    adapter.invokeInterface(Types.QUERY, GET_RECORDCOUNT);
    div.visitGT();
    adapter.push(0);
    div.visitEnd(bc);
    Label ifRecCount = new Label();
    adapter.ifZCmp(Opcodes.IFEQ, ifRecCount);
    // startrow
    int from = adapter.newLocal(Types.INT_VALUE);
    Attribute attrStartRow = tag.getAttribute("startrow");
    if (attrStartRow != null) {
        // NumberRange.range(@startrow,1)
        // attrStartRow.getValue().writeOut(bc, Expression.MODE_VALUE);
        bc.getFactory().toExprInt(attrStartRow.getValue()).writeOut(bc, Expression.MODE_VALUE);
        // adapter.visitInsn(Opcodes.D2I);
        adapter.push(1);
        adapter.invokeStatic(Types.NUMBER_RANGE, RANGE);
    // adapter.visitInsn(Opcodes.D2I);
    } else {
        adapter.push(1);
    }
    adapter.storeLocal(from);
    // numberIterator
    adapter.loadLocal(from);
    adapter.loadLocal(tag.getQuery());
    adapter.invokeInterface(Types.QUERY, GET_RECORDCOUNT);
    // adapter.visitInsn(Opcodes.I2D);
    Attribute attrMaxRow = tag.getAttribute("maxrows");
    Attribute attrEndRow = tag.getAttribute("endrow");
    if (attrMaxRow != null) {
        bc.getFactory().toExprInt(attrMaxRow.getValue()).writeOut(bc, Expression.MODE_VALUE);
        adapter.invokeStatic(NUMBER_ITERATOR, LOAD_MAX);
    } else if (attrEndRow != null) {
        bc.getFactory().toExprInt(attrEndRow.getValue()).writeOut(bc, Expression.MODE_VALUE);
        adapter.invokeStatic(NUMBER_ITERATOR, LOAD_END);
    } else {
        adapter.invokeStatic(NUMBER_ITERATOR, LOAD_2);
    }
    adapter.storeLocal(tag.getNumberIterator());
    // Group
    Attribute attrGroup = tag.getAttribute("group");
    Attribute attrGroupCS = tag.getAttribute("groupcasesensitive");
    tag.setGroup(adapter.newLocal(Types.STRING));
    final int groupCaseSensitive = adapter.newLocal(Types.BOOLEAN_VALUE);
    if (attrGroup != null) {
        attrGroup.getValue().writeOut(bc, Expression.MODE_REF);
        adapter.storeLocal(tag.getGroup());
        if (attrGroupCS != null)
            attrGroupCS.getValue().writeOut(bc, Expression.MODE_VALUE);
        else
            adapter.push(false);
        adapter.storeLocal(groupCaseSensitive);
    }
    // pc.us().addQuery(query);
    adapter.loadArg(0);
    adapter.invokeVirtual(Types.PAGE_CONTEXT, US);
    adapter.loadLocal(tag.getQuery());
    adapter.invokeInterface(UNDEFINED, ADD_QUERY);
    // current
    final int current = adapter.newLocal(Types.INT_VALUE);
    adapter.loadLocal(from);
    adapter.push(1);
    adapter.visitInsn(Opcodes.ISUB);
    adapter.storeLocal(current);
    // Try
    TryFinallyVisitor tfv = new TryFinallyVisitor(new OnFinally() {

        @Override
        public void _writeOut(BytecodeContext bc) {
            // query.reset();
            // query.go(startAt);
            adapter.loadLocal(tag.getQuery());
            adapter.loadLocal(startAt);
            adapter.loadLocal(tag.getPID());
            // adapter.loadArg(0);
            // adapter.invokeVirtual(Types.PAGE_CONTEXT, TagLoop.GET_ID);
            adapter.invokeInterface(Types.QUERY, TagLoop.GO);
            adapter.pop();
            // pc.us().removeQuery();
            adapter.loadArg(0);
            adapter.invokeVirtual(Types.PAGE_CONTEXT, US);
            adapter.invokeInterface(UNDEFINED, REMOVE_QUERY);
            // NumberIterator.release(ni);
            adapter.loadLocal(tag.getNumberIterator());
            adapter.invokeStatic(NUMBER_ITERATOR, REALEASE);
        }
    }, null);
    tfv.visitTryBegin(bc);
    WhileVisitor wv = new WhileVisitor();
    if (tag instanceof TagLoop)
        ((TagLoop) tag).setLoopVisitor(wv);
    wv.visitBeforeExpression(bc);
    // while(ni.isValid()) {
    adapter.loadLocal(tag.getNumberIterator());
    adapter.loadLocal(current);
    adapter.push(1);
    adapter.visitInsn(Opcodes.IADD);
    adapter.invokeVirtual(NUMBER_ITERATOR, IS_VALID_1);
    wv.visitAfterExpressionBeforeBody(bc);
    // if(!query.go(ni.current()))break;
    adapter.loadLocal(tag.getQuery());
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
    adapter.loadLocal(tag.getPID());
    adapter.invokeInterface(Types.QUERY, TagLoop.GO);
    NotVisitor.visitNot(bc);
    Label _if = new Label();
    adapter.ifZCmp(Opcodes.IFEQ, _if);
    wv.visitBreak(bc);
    adapter.visitLabel(_if);
    if (attrGroup != null) {
        // NumberIterator oldNi=numberIterator;
        int oldNi = adapter.newLocal(NUMBER_ITERATOR);
        adapter.loadLocal(tag.getNumberIterator());
        adapter.storeLocal(oldNi);
        // numberIterator=NumberIterator.load(ni,query,group,grp_case);
        adapter.loadArg(0);
        adapter.loadLocal(tag.getNumberIterator());
        adapter.loadLocal(tag.getQuery());
        adapter.loadLocal(tag.getGroup());
        adapter.loadLocal(groupCaseSensitive);
        adapter.invokeStatic(NUMBER_ITERATOR, LOAD_5);
        adapter.storeLocal(tag.getNumberIterator());
        // current=oldNi.current();
        adapter.loadLocal(oldNi);
        adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
        adapter.storeLocal(current);
        tag.getBody().writeOut(bc);
        // tmp(adapter,current);
        // NumberIterator.release(ni);
        adapter.loadLocal(tag.getNumberIterator());
        adapter.invokeStatic(NUMBER_ITERATOR, REALEASE);
        // numberIterator=oldNi;
        adapter.loadLocal(oldNi);
        adapter.storeLocal(tag.getNumberIterator());
    } else {
        // current=ni.current();
        adapter.loadLocal(tag.getNumberIterator());
        adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
        adapter.storeLocal(current);
        tag.getBody().writeOut(bc);
    }
    // ni.setCurrent(current+1);
    /*adapter.loadLocal(tag.getNumberIterator());
					adapter.loadLocal(current);
					adapter.push(1);
					adapter.visitInsn(Opcodes.IADD);
					adapter.invokeVirtual(NUMBER_ITERATOR, SET_CURRENT);*/
    wv.visitAfterBody(bc, tag.getEnd());
    tfv.visitTryEnd(bc);
    adapter.visitLabel(ifRecCount);
    if (isOutput)
        pbv.visitEnd(bc);
}
Also used : ParseBodyVisitor(lucee.transformer.bytecode.visitor.ParseBodyVisitor) Label(org.objectweb.asm.Label) LitString(lucee.transformer.expression.literal.LitString) Expression(lucee.transformer.expression.Expression) OnFinally(lucee.transformer.bytecode.visitor.OnFinally) GeneratorAdapter(org.objectweb.asm.commons.GeneratorAdapter) DecisionIntVisitor(lucee.transformer.bytecode.visitor.DecisionIntVisitor) WhileVisitor(lucee.transformer.bytecode.visitor.WhileVisitor) TryFinallyVisitor(lucee.transformer.bytecode.visitor.TryFinallyVisitor) BytecodeContext(lucee.transformer.bytecode.BytecodeContext)

Example 2 with WhileVisitor

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

the class TagGroupUtil method writeOutTypeGroup.

public static void writeOutTypeGroup(TagGroup tag, BytecodeContext bc) throws TransformerException {
    GeneratorAdapter adapter = bc.getAdapter();
    boolean isOutput = tag.getType() == TagGroup.TAG_OUTPUT;
    ParseBodyVisitor pbv = isOutput ? new ParseBodyVisitor() : null;
    if (isOutput)
        pbv.visitBegin(bc);
    // Group
    Attribute attrGroup = tag.getAttribute("group");
    tag.setGroup(adapter.newLocal(Types.STRING));
    attrGroup.getValue().writeOut(bc, Expression.MODE_REF);
    adapter.storeLocal(tag.getGroup());
    // Group Case Sensitve
    Attribute attrGroupCS = tag.getAttribute("groupcasesensitive");
    int groupCaseSensitive = adapter.newLocal(Types.BOOLEAN_VALUE);
    if (attrGroupCS != null)
        attrGroupCS.getValue().writeOut(bc, Expression.MODE_VALUE);
    else
        adapter.push(true);
    adapter.storeLocal(groupCaseSensitive);
    TagGroup parent = getParentTagGroupQuery(tag, tag.getType());
    tag.setNumberIterator(parent.getNumberIterator());
    tag.setQuery(parent.getQuery());
    // queryImpl = parent.getQueryImpl();
    // current
    int current = adapter.newLocal(Types.INT_VALUE);
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
    adapter.storeLocal(current);
    // current
    int icurrent = adapter.newLocal(Types.INT_VALUE);
    adapter.loadLocal(current);
    adapter.push(1);
    adapter.visitInsn(Opcodes.ISUB);
    adapter.storeLocal(icurrent);
    WhileVisitor wv = new WhileVisitor();
    if (tag instanceof TagLoop)
        ((TagLoop) tag).setLoopVisitor(wv);
    wv.visitBeforeExpression(bc);
    // while(ni.isValid()) {
    adapter.loadLocal(tag.getNumberIterator());
    adapter.loadLocal(icurrent);
    adapter.push(1);
    adapter.visitInsn(Opcodes.IADD);
    adapter.invokeVirtual(NUMBER_ITERATOR, IS_VALID_1);
    wv.visitAfterExpressionBeforeBody(bc);
    // if(!query.go(ni.current()))break;
    adapter.loadLocal(tag.getQuery());
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
    adapter.loadArg(0);
    adapter.invokeVirtual(Types.PAGE_CONTEXT, GET_ID);
    adapter.invokeInterface(Types.QUERY, TagLoop.GO);
    NotVisitor.visitNot(bc);
    Label _if = new Label();
    adapter.ifZCmp(Opcodes.IFEQ, _if);
    wv.visitBreak(bc);
    adapter.visitLabel(_if);
    // NumberIterator oldNi=numberIterator;
    int oldNi = adapter.newLocal(NUMBER_ITERATOR);
    adapter.loadLocal(tag.getNumberIterator());
    adapter.storeLocal(oldNi);
    // numberIterator=NumberIterator.load(ni,query,group,grp_case);
    adapter.loadArg(0);
    adapter.loadLocal(tag.getNumberIterator());
    adapter.loadLocal(tag.getQuery());
    adapter.loadLocal(tag.getGroup());
    adapter.loadLocal(groupCaseSensitive);
    adapter.invokeStatic(NUMBER_ITERATOR, LOAD_5);
    adapter.storeLocal(tag.getNumberIterator());
    // current=oldNi.current();
    adapter.loadLocal(oldNi);
    adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
    adapter.storeLocal(icurrent);
    tag.getBody().writeOut(bc);
    // tmp(adapter,current);
    // NumberIterator.release(ni);
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeStatic(NUMBER_ITERATOR, REALEASE);
    // numberIterator=oldNi;
    adapter.loadLocal(oldNi);
    adapter.storeLocal(tag.getNumberIterator());
    // ni.setCurrent(current+1);
    /*adapter.loadLocal(tag.getNumberIterator());
			adapter.loadLocal(icurrent);
			adapter.push(1);
			adapter.visitInsn(Opcodes.IADD);
			adapter.invokeVirtual(NUMBER_ITERATOR, SET_CURRENT);
			*/
    wv.visitAfterBody(bc, tag.getEnd());
    // query.go(ni.current(),pc.getId())
    resetCurrentrow(adapter, tag, current);
    // ni.first();
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, FIRST);
    adapter.pop();
    if (isOutput)
        pbv.visitEnd(bc);
}
Also used : ParseBodyVisitor(lucee.transformer.bytecode.visitor.ParseBodyVisitor) Label(org.objectweb.asm.Label) GeneratorAdapter(org.objectweb.asm.commons.GeneratorAdapter) WhileVisitor(lucee.transformer.bytecode.visitor.WhileVisitor)

Example 3 with WhileVisitor

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

the class TagGroupUtil method writeOutTypeInnerGroup.

public static void writeOutTypeInnerGroup(TagGroup tag, BytecodeContext bc) throws TransformerException {
    GeneratorAdapter adapter = bc.getAdapter();
    TagGroup parent = getParentTagGroupQuery(tag, tag.getType());
    tag.setNumberIterator(parent.getNumberIterator());
    tag.setQuery(parent.getQuery());
    // queryImpl = parent.getQueryImpl();
    int current = adapter.newLocal(Types.INT_VALUE);
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
    adapter.storeLocal(current);
    // inner current
    int icurrent = adapter.newLocal(Types.INT_VALUE);
    adapter.loadLocal(current);
    adapter.push(1);
    adapter.visitInsn(Opcodes.ISUB);
    adapter.storeLocal(icurrent);
    WhileVisitor wv = new WhileVisitor();
    if (tag instanceof TagLoop)
        ((TagLoop) tag).setLoopVisitor(wv);
    wv.visitBeforeExpression(bc);
    // while(ni.isValid()) {
    adapter.loadLocal(tag.getNumberIterator());
    adapter.loadLocal(icurrent);
    adapter.push(1);
    adapter.visitInsn(Opcodes.IADD);
    adapter.invokeVirtual(NUMBER_ITERATOR, IS_VALID_1);
    wv.visitAfterExpressionBeforeBody(bc);
    // if(!query.go(ni.current()))break;
    adapter.loadLocal(tag.getQuery());
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
    adapter.loadArg(0);
    adapter.invokeVirtual(Types.PAGE_CONTEXT, GET_ID);
    adapter.invokeInterface(Types.QUERY, TagLoop.GO);
    /*OLD
			adapter.invokeInterface(Types.QUERY, TagLoop.GO_1);
			*/
    NotVisitor.visitNot(bc);
    Label _if = new Label();
    adapter.ifZCmp(Opcodes.IFEQ, _if);
    wv.visitBreak(bc);
    adapter.visitLabel(_if);
    // current=ni.current();
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
    adapter.storeLocal(icurrent);
    tag.getBody().writeOut(bc);
    // ni.setCurrent(current+1);
    /*adapter.loadLocal(tag.getNumberIterator());
			adapter.loadLocal(icurrent);
			adapter.push(1);
			adapter.visitInsn(Opcodes.IADD);
			adapter.invokeVirtual(NUMBER_ITERATOR, SET_CURRENT);*/
    wv.visitAfterBody(bc, tag.getEnd());
    resetCurrentrow(adapter, tag, current);
    // ni.first();
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, FIRST);
    adapter.pop();
}
Also used : Label(org.objectweb.asm.Label) GeneratorAdapter(org.objectweb.asm.commons.GeneratorAdapter) WhileVisitor(lucee.transformer.bytecode.visitor.WhileVisitor)

Example 4 with WhileVisitor

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

the class TagGroupUtil method writeOutTypeInnerQuery.

public static void writeOutTypeInnerQuery(TagGroup tag, BytecodeContext bc) throws TransformerException {
    GeneratorAdapter adapter = bc.getAdapter();
    // if(tr ue)return ;
    TagGroup parent = getParentTagGroupQuery(tag, tag.getType());
    tag.setNumberIterator(parent.getNumberIterator());
    tag.setQuery(parent.getQuery());
    tag.setPID(parent.getPID());
    // queryImpl = parent.getQueryImpl();
    // int currentOuter=ni.current();
    int current = adapter.newLocal(Types.INT_VALUE);
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
    adapter.storeLocal(current);
    // current
    int icurrent = adapter.newLocal(Types.INT_VALUE);
    adapter.loadLocal(current);
    adapter.push(1);
    adapter.visitInsn(Opcodes.ISUB);
    adapter.storeLocal(icurrent);
    WhileVisitor wv = new WhileVisitor();
    if (tag instanceof TagLoop)
        ((TagLoop) tag).setLoopVisitor(wv);
    wv.visitBeforeExpression(bc);
    // while(ni.isValid()) {
    adapter.loadLocal(tag.getNumberIterator());
    adapter.loadLocal(icurrent);
    adapter.push(1);
    adapter.visitInsn(Opcodes.IADD);
    adapter.invokeVirtual(NUMBER_ITERATOR, IS_VALID_1);
    wv.visitAfterExpressionBeforeBody(bc);
    // if(!query.go(ni.current()))break;
    adapter.loadLocal(tag.getQuery());
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
    adapter.loadLocal(tag.getPID());
    adapter.invokeInterface(Types.QUERY, TagLoop.GO);
    NotVisitor.visitNot(bc);
    Label _if = new Label();
    adapter.ifZCmp(Opcodes.IFEQ, _if);
    wv.visitBreak(bc);
    adapter.visitLabel(_if);
    // current=ni.current();
    adapter.loadLocal(tag.getNumberIterator());
    adapter.invokeVirtual(NUMBER_ITERATOR, CURRENT);
    adapter.storeLocal(icurrent);
    tag.getBody().writeOut(bc);
    // ni.setCurrent(current+1);
    /*adapter.loadLocal(tag.getNumberIterator());
			adapter.loadLocal(icurrent);
			adapter.push(1);
			adapter.visitInsn(Opcodes.IADD);
			adapter.invokeVirtual(NUMBER_ITERATOR, SET_CURRENT);*/
    wv.visitAfterBody(bc, tag.getEnd());
    // ni.setCurrent(currentOuter);
    adapter.loadLocal(tag.getNumberIterator());
    adapter.loadLocal(current);
    adapter.invokeVirtual(NUMBER_ITERATOR, SET_CURRENT);
    adapter.loadLocal(tag.getQuery());
    adapter.loadLocal(current);
    adapter.loadLocal(tag.getPID());
    // adapter.loadArg(0);
    // adapter.invokeVirtual(Types.PAGE_CONTEXT, GET_ID);
    adapter.invokeInterface(Types.QUERY, TagLoop.GO);
    adapter.pop();
// adapter.pop();
}
Also used : Label(org.objectweb.asm.Label) GeneratorAdapter(org.objectweb.asm.commons.GeneratorAdapter) WhileVisitor(lucee.transformer.bytecode.visitor.WhileVisitor)

Example 5 with WhileVisitor

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

the class TagLoop method writeOutTypeCondition.

/**
 * write out condition loop
 * @param adapter
 * @throws TemplateException
 */
private void writeOutTypeCondition(BytecodeContext bc) throws TransformerException {
    WhileVisitor whileVisitor = new WhileVisitor();
    loopVisitor = whileVisitor;
    whileVisitor.visitBeforeExpression(bc);
    bc.getFactory().toExprBoolean(getAttribute("condition").getValue()).writeOut(bc, Expression.MODE_VALUE);
    whileVisitor.visitAfterExpressionBeforeBody(bc);
    getBody().writeOut(bc);
    whileVisitor.visitAfterBody(bc, getEnd());
}
Also used : DoWhileVisitor(lucee.transformer.bytecode.visitor.DoWhileVisitor) 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