Example usage for org.objectweb.asm Opcodes IFEQ

List of usage examples for org.objectweb.asm Opcodes IFEQ

Introduction

In this page you can find the example usage for org.objectweb.asm Opcodes IFEQ.

Prototype

int IFEQ

To view the source code for org.objectweb.asm Opcodes IFEQ.

Click Source Link

Usage

From source file:lucee.transformer.bytecode.op.OpBool.java

License:Open Source License

/**
 *
 * @see lucee.transformer.bytecode.expression.ExpressionBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter, int)
 */// w  ww .  j a v a2  s  .  c om
public Type _writeOut(BytecodeContext bc, int mode) throws BytecodeException {
    GeneratorAdapter adapter = bc.getAdapter();

    if (mode == MODE_REF) {
        _writeOut(bc, MODE_VALUE);
        adapter.invokeStatic(Types.CASTER, Methods.METHOD_TO_BOOLEAN_FROM_BOOLEAN);
        return Types.BOOLEAN;
    }

    Label doFalse = new Label();
    Label end = new Label();

    if (operation == AND) {
        left.writeOut(bc, MODE_VALUE);
        adapter.ifZCmp(Opcodes.IFEQ, doFalse);

        right.writeOut(bc, MODE_VALUE);
        adapter.ifZCmp(Opcodes.IFEQ, doFalse);
        adapter.push(true);

        adapter.visitJumpInsn(Opcodes.GOTO, end);
        adapter.visitLabel(doFalse);

        adapter.push(false);
        adapter.visitLabel(end);
    }
    if (operation == OR) {
        left.writeOut(bc, MODE_VALUE);
        adapter.ifZCmp(Opcodes.IFNE, doFalse);

        right.writeOut(bc, MODE_VALUE);
        adapter.ifZCmp(Opcodes.IFNE, doFalse);

        adapter.push(false);
        adapter.visitJumpInsn(Opcodes.GOTO, end);
        adapter.visitLabel(doFalse);

        adapter.push(true);
        adapter.visitLabel(end);
    } else if (operation == XOR) {
        left.writeOut(bc, MODE_VALUE);
        right.writeOut(bc, MODE_VALUE);
        adapter.visitInsn(Opcodes.IXOR);
    } else if (operation == EQV) {

        left.writeOut(bc, MODE_VALUE);
        right.writeOut(bc, MODE_VALUE);
        adapter.invokeStatic(Types.OPERATOR, Methods_Operator.OPERATOR_EQV_BV_BV);
    } else if (operation == IMP) {

        left.writeOut(bc, MODE_VALUE);
        right.writeOut(bc, MODE_VALUE);
        adapter.invokeStatic(Types.OPERATOR, Methods_Operator.OPERATOR_IMP_BV_BV);
    }
    return Types.BOOLEAN_VALUE;

}

From source file:lucee.transformer.bytecode.op.OpContional.java

License:Open Source License

/**
 *
 * @see lucee.transformer.bytecode.expression.ExpressionBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter, int)
 *///  w  w w . ja v a  2  s  .  c  o m
public Type _writeOut(BytecodeContext bc, int mode) throws BytecodeException {
    GeneratorAdapter adapter = bc.getAdapter();

    Label yes = new Label();
    Label end = new Label();

    // cont
    ExpressionUtil.visitLine(bc, cont.getStart());
    cont.writeOut(bc, MODE_VALUE);
    ExpressionUtil.visitLine(bc, cont.getEnd());
    adapter.visitJumpInsn(Opcodes.IFEQ, yes);

    // left
    ExpressionUtil.visitLine(bc, left.getStart());
    left.writeOut(bc, MODE_REF);
    ExpressionUtil.visitLine(bc, left.getEnd());
    adapter.visitJumpInsn(Opcodes.GOTO, end);

    // right
    ExpressionUtil.visitLine(bc, right.getStart());
    adapter.visitLabel(yes);
    right.writeOut(bc, MODE_REF);
    ExpressionUtil.visitLine(bc, right.getEnd());
    adapter.visitLabel(end);

    return Types.OBJECT;

}

From source file:lucee.transformer.bytecode.op.OpElvis.java

License:Open Source License

public Type _writeOutPureDataMember(BytecodeContext bc, int mode) throws BytecodeException {
    // TODO use function isNull for this
    GeneratorAdapter adapter = bc.getAdapter();

    Label yes = new Label();
    Label end = new Label();

    List<Member> members = left.getMembers();

    // to array/* w w  w .j a  va  2s.  c  o m*/
    Iterator<Member> it = members.iterator();
    List<DataMember> list = new ArrayList<DataMember>();
    while (it.hasNext()) {
        list.add((DataMember) it.next());
    }
    DataMember[] arr = list.toArray(new DataMember[members.size()]);

    ExpressionUtil.visitLine(bc, left.getStart());

    // public static boolean call(PageContext pc , double scope,String[] varNames)
    // pc
    adapter.loadArg(0);
    // scope
    adapter.push((double) left.getScope());
    //varNames

    // all literal string?
    boolean allLiteral = true;
    for (int i = 0; i < arr.length; i++) {
        if (!(arr[i].getName() instanceof Literal))
            allLiteral = false;
    }

    ArrayVisitor av = new ArrayVisitor();
    if (!allLiteral) {
        // String Array
        av.visitBegin(adapter, Types.STRING, arr.length);
        for (int i = 0; i < arr.length; i++) {
            av.visitBeginItem(adapter, i);
            arr[i].getName().writeOut(bc, MODE_REF);
            av.visitEndItem(adapter);
        }
    } else {
        // Collection.Key Array
        av.visitBegin(adapter, Types.COLLECTION_KEY, arr.length);
        for (int i = 0; i < arr.length; i++) {
            av.visitBeginItem(adapter, i);
            Variable.registerKey(bc, arr[i].getName());
            av.visitEndItem(adapter);
        }
    }
    av.visitEnd();

    // allowNull
    //adapter.push(false);

    //ASMConstants.NULL(adapter);

    // call IsDefined.invoke
    adapter.invokeStatic(ELVIS, allLiteral ? INVOKE_KEY : INVOKE_STR);
    ExpressionUtil.visitLine(bc, left.getEnd());

    adapter.visitJumpInsn(Opcodes.IFEQ, yes);

    // left
    ExpressionUtil.visitLine(bc, left.getStart());
    left.writeOut(bc, MODE_REF);
    ExpressionUtil.visitLine(bc, left.getEnd());
    adapter.visitJumpInsn(Opcodes.GOTO, end);

    // right
    ExpressionUtil.visitLine(bc, right.getStart());
    adapter.visitLabel(yes);
    right.writeOut(bc, MODE_REF);
    ExpressionUtil.visitLine(bc, right.getEnd());
    adapter.visitLabel(end);

    return Types.OBJECT;

}

From source file:lucee.transformer.bytecode.op.OpNegate.java

License:Open Source License

/**
 *
 * @see lucee.transformer.bytecode.expression.ExpressionBase#_writeOut(org.objectweb.asm.commons.GeneratorAdapter, int)
 *//* w  ww  .ja  v  a 2 s . com*/
public Type _writeOut(BytecodeContext bc, int mode) throws BytecodeException {
    GeneratorAdapter adapter = bc.getAdapter();
    if (mode == MODE_REF) {
        _writeOut(bc, MODE_VALUE);
        adapter.invokeStatic(Types.CASTER, Methods.METHOD_TO_BOOLEAN_FROM_BOOLEAN);
        return Types.BOOLEAN;
    }

    Label l1 = new Label();
    Label l2 = new Label();

    expr.writeOut(bc, MODE_VALUE);
    adapter.ifZCmp(Opcodes.IFEQ, l1);

    adapter.visitInsn(Opcodes.ICONST_0);
    adapter.visitJumpInsn(Opcodes.GOTO, l2);
    adapter.visitLabel(l1);
    adapter.visitInsn(Opcodes.ICONST_1);
    adapter.visitLabel(l2);

    return Types.BOOLEAN_VALUE;

}

From source file:lucee.transformer.bytecode.statement.ForEach.java

License:Open Source License

@Override
public void _writeOut(BytecodeContext bc) throws BytecodeException {
    GeneratorAdapter adapter = bc.getAdapter();
    final int it = adapter.newLocal(Types.ITERATOR);
    final int item = adapter.newLocal(Types.REFERENCE);

    //Value/* w ww  .  j  a  v a 2s  .  c  om*/
    // ForEachUtil.toIterator(value)
    value.writeOut(bc, Expression.MODE_REF);
    adapter.invokeStatic(FOR_EACH_UTIL, TO_ITERATOR);
    //adapter.invokeStatic(COLLECTION_UTIL, TO_ITERATOR);
    // Iterator it=...
    adapter.storeLocal(it);
    TryFinallyVisitor tfv = new TryFinallyVisitor(new OnFinally() {

        @Override
        public void _writeOut(BytecodeContext bc) throws BytecodeException {
            GeneratorAdapter a = bc.getAdapter();
            //if(fcf!=null && fcf.getAfterFinalGOTOLabel()!=null)ASMUtil.visitLabel(a,fcf.getFinalEntryLabel());
            a.loadLocal(it);
            a.invokeStatic(FOR_EACH_UTIL, RESET);
            /*if(fcf!=null){
               Label l=fcf.getAfterFinalGOTOLabel();
               if(l!=null)a.visitJumpInsn(Opcodes.GOTO, l);
            }*/
        }
    }, getFlowControlFinal());
    tfv.visitTryBegin(bc);
    // Key
    // new VariableReference(...)
    key.writeOut(bc, Expression.MODE_REF);
    // VariableReference item=...
    adapter.storeLocal(item);

    // while
    ExpressionUtil.visitLine(bc, getStart());
    adapter.visitLabel(begin);

    // hasNext
    adapter.loadLocal(it);
    adapter.invokeInterface(Types.ITERATOR, HAS_NEXT);
    adapter.ifZCmp(Opcodes.IFEQ, end);

    // item.set(pc,it.next());
    adapter.loadLocal(item);
    adapter.loadArg(0);
    adapter.loadLocal(it);
    adapter.invokeInterface(Types.ITERATOR, NEXT);
    adapter.invokeInterface(Types.REFERENCE, SET);
    adapter.pop();

    // Body
    body.writeOut(bc);
    adapter.visitJumpInsn(Opcodes.GOTO, begin);
    adapter.visitLabel(end);
    tfv.visitTryEnd(bc);

}

From source file:lucee.transformer.bytecode.statement.tag.TagGroupUtil.java

License:Open Source License

public static void writeOutTypeQuery(final TagGroup tag, BytecodeContext bc) throws BytecodeException {
    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);//from   w w w . ja  v a2 s  . c o m

    // 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);
        CastInt.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) {
        CastInt.toExprInt(attrMaxRow.getValue()).writeOut(bc, Expression.MODE_VALUE);
        adapter.invokeStatic(NUMBER_ITERATOR, LOAD_MAX);
    } else if (attrEndRow != null) {
        CastInt.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() {
        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);
}

From source file:lucee.transformer.bytecode.statement.tag.TagGroupUtil.java

License:Open Source License

public static void writeOutTypeGroup(TagGroup tag, BytecodeContext bc) throws BytecodeException {
    GeneratorAdapter adapter = bc.getAdapter();
    boolean isOutput = tag.getType() == TagGroup.TAG_OUTPUT;
    ParseBodyVisitor pbv = isOutput ? new ParseBodyVisitor() : null;
    if (isOutput)
        pbv.visitBegin(bc);//  w  w w  . j  ava2 s .c  om

    // 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);
}

From source file:lucee.transformer.bytecode.statement.tag.TagGroupUtil.java

License:Open Source License

public static void writeOutTypeInnerGroup(TagGroup tag, BytecodeContext bc) throws BytecodeException {
    GeneratorAdapter adapter = bc.getAdapter();

    TagGroup parent = getParentTagGroupQuery(tag, tag.getType());
    tag.setNumberIterator(parent.getNumberIterator());
    tag.setQuery(parent.getQuery());//from w  w  w.  ja va 2  s  .  c o m
    //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();
}

From source file:lucee.transformer.bytecode.statement.tag.TagGroupUtil.java

License:Open Source License

public static void writeOutTypeInnerQuery(TagGroup tag, BytecodeContext bc) throws BytecodeException {
    GeneratorAdapter adapter = bc.getAdapter();
    //if(tr ue)return ;
    TagGroup parent = getParentTagGroupQuery(tag, tag.getType());
    tag.setNumberIterator(parent.getNumberIterator());
    tag.setQuery(parent.getQuery());// www .j  av a  2  s.co  m
    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();
}

From source file:lucee.transformer.bytecode.statement.tag.TagIf.java

License:Open Source License

private static Label writeOutElseIfStart(BytecodeContext bc, Tag tag) throws BytecodeException {
    GeneratorAdapter adapter = bc.getAdapter();

    ExprBoolean cont = CastBoolean.toExprBoolean(tag.getAttribute("condition").getValue());

    Label endIf = new Label();

    ExpressionUtil.visitLine(bc, tag.getStart());
    cont.writeOut(bc, Expression.MODE_VALUE);
    adapter.ifZCmp(Opcodes.IFEQ, endIf);
    return endIf;
}