Example usage for org.objectweb.asm Opcodes IADD

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

Introduction

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

Prototype

int IADD

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

Click Source Link

Usage

From source file:jpcsp.Allegrex.compiler.CompilerContext.java

License:Open Source License

@Override
public void memWrite8(int registerIndex, int offset) {
    if (!memWritePrepared) {
        if (useMMIO()) {
            loadMMIO();/*from  w  ww.  ja v a 2s .  c  o m*/
        } else if (!RuntimeContext.hasMemoryInt()) {
            loadMemory();
        } else {
            loadMemoryInt();
        }
        mv.visitInsn(Opcodes.SWAP);

        loadRegister(registerIndex);
        if (offset != 0) {
            loadImm(offset);
            mv.visitInsn(Opcodes.IADD);
        }

        if (RuntimeContext.hasMemoryInt()) {
            if (checkMemoryAccess()) {
                loadImm(codeInstruction.getAddress());
                mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeContextInternalName, "checkMemoryWrite8",
                        "(II)I");
            }
        }
        mv.visitInsn(Opcodes.SWAP);
    }

    if (useMMIO() || !RuntimeContext.hasMemoryInt()) {
        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, memoryInternalName, "write8", "(IB)V");
    } else {
        // tmp2 = value & 0xFF;
        // tmp1 = (address & 3) << 3;
        // memoryInt[address >> 2] = (memoryInt[address >> 2] & ((0xFF << tmp1) ^ 0xFFFFFFFF)) | (tmp2 << tmp1);
        loadImm(0xFF);
        mv.visitInsn(Opcodes.IAND);
        storeTmp2();
        mv.visitInsn(Opcodes.DUP);
        loadImm(3);
        mv.visitInsn(Opcodes.IAND);
        loadImm(3);
        mv.visitInsn(Opcodes.ISHL);
        storeTmp1();
        if (checkMemoryAccess()) {
            loadImm(2);
            mv.visitInsn(Opcodes.ISHR);
        } else {
            loadImm(3);
            mv.visitInsn(Opcodes.ISHL);
            loadImm(5);
            mv.visitInsn(Opcodes.IUSHR);
        }
        mv.visitInsn(Opcodes.DUP2);
        mv.visitInsn(Opcodes.IALOAD);
        loadImm(0xFF);
        loadTmp1();
        mv.visitInsn(Opcodes.ISHL);
        loadImm(-1);
        mv.visitInsn(Opcodes.IXOR);
        mv.visitInsn(Opcodes.IAND);
        loadTmp2();
        loadTmp1();
        mv.visitInsn(Opcodes.ISHL);
        mv.visitInsn(Opcodes.IOR);
        mv.visitInsn(Opcodes.IASTORE);
    }

    memWritePrepared = false;
}

From source file:jpcsp.Allegrex.compiler.CompilerContext.java

License:Open Source License

@Override
public void memWriteZero8(int registerIndex, int offset) {
    if (useMMIO()) {
        loadMMIO();//from  w  ww .j a v a 2  s.  c o  m
    } else if (!RuntimeContext.hasMemoryInt()) {
        loadMemory();
    } else {
        loadMemoryInt();
    }

    loadRegister(registerIndex);
    if (offset != 0) {
        loadImm(offset);
        mv.visitInsn(Opcodes.IADD);
    }

    if (RuntimeContext.hasMemoryInt()) {
        if (checkMemoryAccess()) {
            loadImm(codeInstruction.getAddress());
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, runtimeContextInternalName, "checkMemoryWrite8", "(II)I");
        }
    }

    if (useMMIO() || !RuntimeContext.hasMemoryInt()) {
        loadImm(0);
        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, memoryInternalName, "write8", "(IB)V");
    } else {
        // tmp1 = (address & 3) << 3;
        // memoryInt[address >> 2] = (memoryInt[address >> 2] & ((0xFF << tmp1) ^ 0xFFFFFFFF));
        mv.visitInsn(Opcodes.DUP);
        loadImm(3);
        mv.visitInsn(Opcodes.IAND);
        loadImm(3);
        mv.visitInsn(Opcodes.ISHL);
        storeTmp1();
        if (checkMemoryAccess()) {
            loadImm(2);
            mv.visitInsn(Opcodes.ISHR);
        } else {
            loadImm(3);
            mv.visitInsn(Opcodes.ISHL);
            loadImm(5);
            mv.visitInsn(Opcodes.IUSHR);
        }
        mv.visitInsn(Opcodes.DUP2);
        mv.visitInsn(Opcodes.IALOAD);
        loadImm(0xFF);
        loadTmp1();
        mv.visitInsn(Opcodes.ISHL);
        loadImm(-1);
        mv.visitInsn(Opcodes.IXOR);
        mv.visitInsn(Opcodes.IAND);
        mv.visitInsn(Opcodes.IASTORE);
    }
}

From source file:jpcsp.Allegrex.compiler.CompilerContext.java

License:Open Source License

@Override
public boolean compileVFPULoad(int registerIndex, int offset, int vt, int count) {
    if (!RuntimeContext.hasMemoryInt()) {
        // Can only generate an optimized code sequence for memoryInt
        return false;
    }/*from w w w .java 2 s  .c  o  m*/

    if ((vt & 32) != 0) {
        // Optimization possible only for column access
        return false;
    }

    // Build parameters for
    //    System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    // i.e.
    //    System.arraycopy(RuntimeContext.memoryInt,
    //                     RuntimeContext.checkMemoryRead32(rs + simm14, pc) >>> 2,
    //                     RuntimeContext.vprInt,
    //                     vprIndex,
    //                     countSequence * 4);
    loadMemoryInt();

    loadRegister(registerIndex);
    if (offset != 0) {
        loadImm(offset);
        mv.visitInsn(Opcodes.IADD);
    }
    if (checkMemoryAccess()) {
        loadImm(getCodeInstruction().getAddress());
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(RuntimeContext.class),
                "checkMemoryRead32", "(II)I");
        loadImm(2);
        mv.visitInsn(Opcodes.IUSHR);
    } else {
        loadImm(3);
        mv.visitInsn(Opcodes.ISHL);
        loadImm(5);
        mv.visitInsn(Opcodes.IUSHR);
    }

    loadVprInt();
    int vprIndex = VfpuState.getVprIndex((vt >> 2) & 7, vt & 3, (vt & 64) >> 6);
    loadImm(vprIndex);
    loadImm(count);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(System.class), "arraycopy",
            arraycopyDescriptor);

    // Set the VPR float values
    for (int i = 0; i < count; i++) {
        loadVprFloat();
        loadImm(vprIndex + i);
        loadVprInt();
        loadImm(vprIndex + i);
        mv.visitInsn(Opcodes.IALOAD);
        convertVIntToFloat();
        mv.visitInsn(Opcodes.FASTORE);
    }

    return true;
}

From source file:jpcsp.Allegrex.compiler.CompilerContext.java

License:Open Source License

@Override
public boolean compileVFPUStore(int registerIndex, int offset, int vt, int count) {
    if (!RuntimeContext.hasMemoryInt()) {
        // Can only generate an optimized code sequence for memoryInt
        return false;
    }/*from   www .ja  v a  2 s .c  o m*/

    if ((vt & 32) != 0) {
        // Optimization possible only for column access
        return false;
    }

    // Build parameters for
    //    System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    // i.e.
    //    System.arraycopy(RuntimeContext.vprInt,
    //                     vprIndex,
    //                     RuntimeContext.memoryInt,
    //                     RuntimeContext.checkMemoryWrite32(rs + simm14, pc) >>> 2,
    //                     countSequence * 4);
    loadVprInt();
    int vprIndex = VfpuState.getVprIndex((vt >> 2) & 7, vt & 3, (vt & 64) >> 6);
    loadImm(vprIndex);
    loadMemoryInt();

    loadRegister(registerIndex);
    if (offset != 0) {
        loadImm(offset);
        mv.visitInsn(Opcodes.IADD);
    }
    if (checkMemoryAccess()) {
        loadImm(getCodeInstruction().getAddress());
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(RuntimeContext.class),
                "checkMemoryWrite32", "(II)I");
        loadImm(2);
        mv.visitInsn(Opcodes.IUSHR);
    } else {
        loadImm(3);
        mv.visitInsn(Opcodes.ISHL);
        loadImm(5);
        mv.visitInsn(Opcodes.IUSHR);
    }

    loadImm(count);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(System.class), "arraycopy",
            arraycopyDescriptor);

    return true;
}

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   ww w  . j a v  a  2 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);/*from w ww.j  a  v  a 2  s  . com*/

    // 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());//  ww  w. j  a  v a 2  s.co 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());/*w  ww .  ja  va 2  s.c  om*/
    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:net.sourceforge.cobertura.instrument.pass3.FastArrayCodeProvider.java

License:GNU General Public License

public void generateCodeThatIncrementsCoberturaCounterFromInternalVariable(MethodVisitor nextMethodVisitor,
        int lastJumpIdVariableIndex, String className) {
    /*cobertura_counters[value('lastJumpIdVariableIndex')]++;*/
    /*cobertura_counters.*/
    nextMethodVisitor.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);
    /*index:*//*  ww w  . j av  a2s .  c o  m*/
    nextMethodVisitor.visitVarInsn(Opcodes.ILOAD, lastJumpIdVariableIndex);
    nextMethodVisitor.visitInsn(Opcodes.DUP2);
    nextMethodVisitor.visitInsn(Opcodes.IALOAD);
    nextMethodVisitor.visitLdcInsn(1);
    nextMethodVisitor.visitInsn(Opcodes.IADD);
    nextMethodVisitor.visitInsn(Opcodes.IASTORE);
}

From source file:net.sourceforge.cobertura.instrument.pass3.FastArrayCodeProvider.java

License:GNU General Public License

public void generateCodeThatIncrementsCoberturaCounter(MethodVisitor nextMethodVisitor, Integer counterId,
        String className) {/*  w  ww .  jav  a  2 s . c o m*/
    /*cobertura_counters[value('lastJumpIdVariableIndex')]++;*/
    /*cobertura_counters.*/
    nextMethodVisitor.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);
    /*index:*/
    nextMethodVisitor.visitLdcInsn((int) counterId);
    nextMethodVisitor.visitInsn(Opcodes.DUP2);
    nextMethodVisitor.visitInsn(Opcodes.IALOAD);
    nextMethodVisitor.visitLdcInsn(1);
    nextMethodVisitor.visitInsn(Opcodes.IADD);
    nextMethodVisitor.visitInsn(Opcodes.IASTORE);
}