Example usage for org.objectweb.asm Opcodes ISTORE

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

Introduction

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

Prototype

int ISTORE

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

Click Source Link

Usage

From source file:org.elasticsearch.painless.node.SSource.java

License:Apache License

@Override
void write(MethodWriter writer, Globals globals) {
    if (reserved.usesScore()) {
        // if the _score value is used, we do this once:
        // final double _score = scorer.score();
        Variable scorer = mainMethod.getVariable(null, Locals.SCORER);
        Variable score = mainMethod.getVariable(null, Locals.SCORE);

        writer.visitVarInsn(Opcodes.ALOAD, scorer.getSlot());
        writer.invokeVirtual(WriterConstants.SCORER_TYPE, WriterConstants.SCORER_SCORE);
        writer.visitInsn(Opcodes.F2D);//from   w  w  w. j  a v  a  2  s.  com
        writer.visitVarInsn(Opcodes.DSTORE, score.getSlot());
    }

    if (reserved.usesCtx()) {
        // if the _ctx value is used, we do this once:
        // final Map<String,Object> ctx = input.get("ctx");

        Variable input = mainMethod.getVariable(null, Locals.PARAMS);
        Variable ctx = mainMethod.getVariable(null, Locals.CTX);

        writer.visitVarInsn(Opcodes.ALOAD, input.getSlot());
        writer.push(Locals.CTX);
        writer.invokeInterface(MAP_TYPE, MAP_GET);
        writer.visitVarInsn(Opcodes.ASTORE, ctx.getSlot());
    }

    if (reserved.getMaxLoopCounter() > 0) {
        // if there is infinite loop protection, we do this once:
        // int #loop = settings.getMaxLoopCounter()

        Variable loop = mainMethod.getVariable(null, Locals.LOOP);

        writer.push(reserved.getMaxLoopCounter());
        writer.visitVarInsn(Opcodes.ISTORE, loop.getSlot());
    }

    for (AStatement statement : statements) {
        statement.write(writer, globals);
    }

    if (!methodEscape) {
        writer.visitInsn(Opcodes.ACONST_NULL);
        writer.returnValue();
    }
}

From source file:org.elasticsearch.painless.node.SSubEachArray.java

License:Apache License

@Override
void write(MethodWriter writer, Globals globals) {
    writer.writeStatementOffset(location);

    expression.write(writer, globals);//  w  w  w  . ja  va2 s .  c om
    writer.visitVarInsn(array.type.type.getOpcode(Opcodes.ISTORE), array.getSlot());
    writer.push(-1);
    writer.visitVarInsn(index.type.type.getOpcode(Opcodes.ISTORE), index.getSlot());

    Label begin = new Label();
    Label end = new Label();

    writer.mark(begin);

    writer.visitIincInsn(index.getSlot(), 1);
    writer.visitVarInsn(index.type.type.getOpcode(Opcodes.ILOAD), index.getSlot());
    writer.visitVarInsn(array.type.type.getOpcode(Opcodes.ILOAD), array.getSlot());
    writer.arrayLength();
    writer.ifICmp(MethodWriter.GE, end);

    writer.visitVarInsn(array.type.type.getOpcode(Opcodes.ILOAD), array.getSlot());
    writer.visitVarInsn(index.type.type.getOpcode(Opcodes.ILOAD), index.getSlot());
    writer.arrayLoad(indexed.type);
    writer.writeCast(cast);
    writer.visitVarInsn(variable.type.type.getOpcode(Opcodes.ISTORE), variable.getSlot());

    if (loopCounter != null) {
        writer.writeLoopCounter(loopCounter.getSlot(), statementCount, location);
    }

    block.continu = begin;
    block.brake = end;
    block.write(writer, globals);

    writer.goTo(begin);
    writer.mark(end);
}

From source file:org.elasticsearch.painless.node.SSubEachIterable.java

License:Apache License

@Override
void write(MethodWriter writer, Globals globals) {
    writer.writeStatementOffset(location);

    expression.write(writer, globals);/*  w w w  . j  a va  2 s .c  om*/

    if (method == null) {
        Type itr = Definition.getType("Iterator");
        org.objectweb.asm.Type methodType = org.objectweb.asm.Type.getMethodType(itr.type,
                Definition.DEF_TYPE.type);
        writer.invokeDefCall("iterator", methodType, DefBootstrap.ITERATOR);
    } else {
        method.write(writer);
    }

    writer.visitVarInsn(iterator.type.type.getOpcode(Opcodes.ISTORE), iterator.getSlot());

    Label begin = new Label();
    Label end = new Label();

    writer.mark(begin);

    writer.visitVarInsn(iterator.type.type.getOpcode(Opcodes.ILOAD), iterator.getSlot());
    writer.invokeInterface(ITERATOR_TYPE, ITERATOR_HASNEXT);
    writer.ifZCmp(MethodWriter.EQ, end);

    writer.visitVarInsn(iterator.type.type.getOpcode(Opcodes.ILOAD), iterator.getSlot());
    writer.invokeInterface(ITERATOR_TYPE, ITERATOR_NEXT);
    writer.writeCast(cast);
    writer.visitVarInsn(variable.type.type.getOpcode(Opcodes.ISTORE), variable.getSlot());

    if (loopCounter != null) {
        writer.writeLoopCounter(loopCounter.getSlot(), statementCount, location);
    }

    block.continu = begin;
    block.brake = end;
    block.write(writer, globals);

    writer.goTo(begin);
    writer.mark(end);
}

From source file:org.elasticsearch.painless.node.STrap.java

License:Apache License

@Override
void write(final CompilerSettings settings, final Definition definition, final GeneratorAdapter adapter) {
    writeDebugInfo(adapter);//from  w  w w.j  a  v a  2  s .c  om
    final Label jump = new Label();

    adapter.mark(jump);
    adapter.visitVarInsn(variable.type.type.getOpcode(Opcodes.ISTORE), variable.slot);

    if (block != null) {
        block.continu = continu;
        block.brake = brake;
        block.write(settings, definition, adapter);
    }

    adapter.visitTryCatchBlock(begin, end, jump, variable.type.type.getInternalName());

    if (exception != null && !block.allEscape) {
        adapter.goTo(exception);
    }
}

From source file:org.elasticsearch.painless.Writer.java

License:Apache License

private void writeExecute() {
    final int access = Opcodes.ACC_PUBLIC;
    execute = new GeneratorAdapter(access, EXECUTE, SIGNATURE, null, writer);

    final Label fals = new Label();
    final Label end = new Label();
    execute.visitVarInsn(Opcodes.ALOAD, metadata.inputValueSlot);
    execute.push("#score");
    execute.invokeInterface(MAP_TYPE, MAP_GET);
    execute.dup();// w  ww .  jav a  2 s  .c  om
    execute.ifNull(fals);
    execute.checkCast(SCORE_ACCESSOR_TYPE);
    execute.invokeVirtual(SCORE_ACCESSOR_TYPE, SCORE_ACCESSOR_FLOAT);
    execute.goTo(end);
    execute.mark(fals);
    execute.pop();
    execute.push(0F);
    execute.mark(end);
    execute.visitVarInsn(Opcodes.FSTORE, metadata.scoreValueSlot);

    execute.push(settings.getMaxLoopCounter());
    execute.visitVarInsn(Opcodes.ISTORE, metadata.loopCounterSlot);

    visit(root);
    execute.endMethod();
}

From source file:org.elasticsearch.painless.Writer.java

License:Apache License

@Override
public Void visitDeclvar(final DeclvarContext ctx) {
    final Metadata.ExpressionMetadata declvaremd = metadata.getExpressionMetadata(ctx);
    final org.objectweb.asm.Type type = declvaremd.to.type;
    final Sort sort = declvaremd.to.sort;
    final int slot = (int) declvaremd.postConst;

    final ExpressionContext exprctx = ctx.expression();
    final boolean initialize = exprctx == null;

    if (!initialize) {
        visit(exprctx);/*from  ww w . jav  a  2s  . com*/
    }

    switch (sort) {
    case VOID:
        throw new IllegalStateException(Metadata.error(ctx) + "Unexpected writer state.");
    case BOOL:
    case BYTE:
    case SHORT:
    case CHAR:
    case INT:
        if (initialize)
            execute.push(0);
        break;
    case LONG:
        if (initialize)
            execute.push(0L);
        break;
    case FLOAT:
        if (initialize)
            execute.push(0.0F);
        break;
    case DOUBLE:
        if (initialize)
            execute.push(0.0);
        break;
    default:
        if (initialize)
            execute.visitInsn(Opcodes.ACONST_NULL);
    }

    execute.visitVarInsn(type.getOpcode(Opcodes.ISTORE), slot);

    return null;
}

From source file:org.elasticsearch.painless.Writer.java

License:Apache License

private void writeLoadStoreVariable(final ParserRuleContext source, final boolean store, final Type type,
        final int slot) {
    if (type.sort == Sort.VOID) {
        throw new IllegalStateException(Metadata.error(source) + "Cannot load/store void type.");
    }/* w  ww.ja v  a2  s  . c om*/

    if (store) {
        execute.visitVarInsn(type.type.getOpcode(Opcodes.ISTORE), slot);
    } else {
        execute.visitVarInsn(type.type.getOpcode(Opcodes.ILOAD), slot);
    }
}

From source file:org.elasticsearch.painless.WriterExternal.java

License:Apache License

private void writeLoadStoreVariable(final ParserRuleContext source, final boolean store, final Type type,
        int slot) {
    if (type.sort == Sort.VOID) {
        throw new IllegalStateException(WriterUtility.error(source) + "Cannot load/store void type.");
    }/*w ww  .java  2 s .  c  o m*/

    if (store) {
        execute.visitVarInsn(type.type.getOpcode(Opcodes.ISTORE), slot);
    } else {
        execute.visitVarInsn(type.type.getOpcode(Opcodes.ILOAD), slot);
    }
}

From source file:org.elasticsearch.painless.WriterStatement.java

License:Apache License

void processDeclvar(final DeclvarContext ctx) {
    final ExpressionMetadata declvaremd = metadata.getExpressionMetadata(ctx);
    final org.objectweb.asm.Type type = declvaremd.to.type;
    final Sort sort = declvaremd.to.sort;
    int slot = (int) declvaremd.postConst;

    final ExpressionContext exprctx = ctx.expression();
    final boolean initialize = exprctx == null;

    if (!initialize) {
        writer.visit(exprctx);/*  www . j a  va2s  . c  o  m*/
    }

    switch (sort) {
    case VOID:
        throw new IllegalStateException(WriterUtility.error(ctx) + "Unexpected state.");
    case BOOL:
    case BYTE:
    case SHORT:
    case CHAR:
    case INT:
        if (initialize)
            execute.push(0);
        break;
    case LONG:
        if (initialize)
            execute.push(0L);
        break;
    case FLOAT:
        if (initialize)
            execute.push(0.0F);
        break;
    case DOUBLE:
        if (initialize)
            execute.push(0.0);
        break;
    default:
        if (initialize)
            execute.visitInsn(Opcodes.ACONST_NULL);
    }

    execute.visitVarInsn(type.getOpcode(Opcodes.ISTORE), slot);
}

From source file:org.elasticsearch.painless.WriterStatement.java

License:Apache License

void processTrap(final TrapContext ctx) {
    final StatementMetadata trapsmd = metadata.getStatementMetadata(ctx);

    final Branch branch = utility.getBranch(ctx);
    final Label jump = new Label();

    final BlockContext blockctx = ctx.block();
    final EmptyscopeContext emptyctx = ctx.emptyscope();

    execute.mark(jump);/*from   w  w  w .ja  va  2  s.  c  o  m*/
    execute.visitVarInsn(trapsmd.exception.type.getOpcode(Opcodes.ISTORE), trapsmd.slot);

    if (blockctx != null) {
        writer.visit(ctx.block());
    } else if (emptyctx == null) {
        throw new IllegalStateException(WriterUtility.error(ctx) + "Unexpected state.");
    }

    execute.visitTryCatchBlock(branch.begin, branch.end, jump, trapsmd.exception.type.getInternalName());

    if (branch.tru != null && !trapsmd.allLast) {
        execute.goTo(branch.tru);
    }
}