Example usage for org.objectweb.asm Opcodes GOTO

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

Introduction

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

Prototype

int GOTO

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

Click Source Link

Usage

From source file:com.yahoo.yqlplus.engine.internal.bytecode.ClassAdapterGenerator.java

private void generatePutProperty(TypeWidget targetType, final PropertyAdapter propertyAdapter) {
    MethodGenerator method = createStaticMethod("putProperty");
    final BytecodeExpression targetExpr = method.addArgument("target", targetType).read();
    final BytecodeExpression propertyName = method.addArgument("property", BaseTypeAdapter.STRING).read();
    final BytecodeExpression valueExpr = method.addArgument("value", AnyTypeWidget.getInstance()).read();
    method.add(new BytecodeSequence() {
        @Override/*from   www. j  av a 2 s  . c om*/
        public void generate(CodeEmitter code) {
            Map<String, Label> labelMap = Maps.newLinkedHashMap();
            Label done = new Label();
            for (PropertyAdapter.Property property : propertyAdapter.getProperties()) {
                labelMap.put(property.name, new Label());
            }
            propertyName.generate(code);
            code.emitStringSwitch(labelMap, done, true);
            MethodVisitor mv = code.getMethodVisitor();
            for (PropertyAdapter.Property property : propertyAdapter.getProperties()) {
                mv.visitLabel(labelMap.get(property.name));
                AssignableValue av = propertyAdapter.property(targetExpr, property.name);
                try {
                    code.exec(av.write(new BytecodeCastExpression(property.type, valueExpr)));
                } catch (UnsupportedOperationException ignored) {
                    // can't write what isn't writable
                }
                mv.visitJumpInsn(Opcodes.GOTO, done);
            }
            mv.visitLabel(done);
            mv.visitInsn(Opcodes.RETURN);
        }
    });
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.ArrayTypeWidget.java

@Override
public ComparisonAdapter getComparisionAdapter() {
    return new ComparisonAdapter() {
        @Override//ww w .  j  a v  a2  s .c o m
        public void coerceBoolean(CodeEmitter scope, Label isTrue, Label isFalse, Label isNull) {
            // null or true
            if (isNullable()) {
                scope.getMethodVisitor().visitJumpInsn(Opcodes.IFNULL, isNull);
            } else {
                scope.pop(ArrayTypeWidget.this);
            }
            scope.getMethodVisitor().visitJumpInsn(Opcodes.GOTO, isTrue);
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.BlockAdapter.java

@Override
public void jump(BytecodeExpression test, final BytecodeExpression result) {
    final BytecodeExpression testExpr = test;
    final TypeWidget type = testExpr.getType();
    body.add(new BytecodeSequence() {
        @Override/*  w  ww .j av a 2  s.  com*/
        public void generate(CodeEmitter code) {
            code.exec(testExpr);
            Label isTrue = new Label();
            Label isFalse = new Label();
            type.getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
            MethodVisitor mv = code.getMethodVisitor();
            mv.visitLabel(isTrue);
            code.exec(result);
            mv.visitJumpInsn(Opcodes.GOTO, body.getEnd());
            mv.visitLabel(isFalse);
        }
    });
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.BytecodeCatchBuilder.java

@Override
public BytecodeSequence build() {
    return new BytecodeSequence() {
        @Override//from w ww  . j  a  v  a2 s .c om
        public void generate(CodeEmitter code) {
            MethodVisitor mv = code.getMethodVisitor();
            for (CatchClause catchClause : catchClauses) {
                if (catchClause.exceptionInternalNames.isEmpty()) {
                    mv.visitTryCatchBlock(body.getStart(), body.getEnd(), catchClause.getStart(), null);
                } else {
                    for (String name : catchClause.exceptionInternalNames) {
                        mv.visitTryCatchBlock(body.getStart(), body.getEnd(), catchClause.getStart(), name);
                    }
                }
            }
            Label done = new Label();
            body.generate(code);
            mv.visitJumpInsn(Opcodes.GOTO, done);
            for (CatchClause catchClause : catchClauses.subList(0, catchClauses.size() - 1)) {
                catchClause.generate(code);
                mv.visitJumpInsn(Opcodes.GOTO, done);
            }
            catchClauses.get(catchClauses.size() - 1).generate(code);
            mv.visitLabel(done);
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.CaseAdapter.java

@Override
public void when(final BytecodeExpression test, final BytecodeExpression value) {
    final TypeWidget type = test.getType();
    resultTypes.add(value.getType());//from   w  w w. j  av a2  s .c  om
    body.add(new BytecodeSequence() {
        @Override
        public void generate(CodeEmitter code) {
            code.exec(test);
            Label isTrue = new Label();
            Label isFalse = new Label();
            type.getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
            MethodVisitor mv = code.getMethodVisitor();
            mv.visitLabel(isTrue);
            code.exec(value);
            code.cast(unifiedOutputType, value.getType());
            mv.visitJumpInsn(Opcodes.GOTO, end);
            mv.visitLabel(isFalse);
        }
    });
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.ExpressionHandler.java

@Override
public BytecodeExpression and(Location loc, final List<BytecodeExpression> inputs) {
    return new BaseTypeExpression(BaseTypeAdapter.BOOLEAN) {
        @Override/*ww w .  ja va2s  . co m*/
        public void generate(CodeEmitter code) {
            MethodVisitor mv = code.getMethodVisitor();
            Label done = new Label();
            Label isFalse = new Label();
            for (BytecodeExpression input : inputs) {
                Label isTrue = new Label();
                code.exec(input);
                input.getType().getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
                mv.visitLabel(isTrue);
            }
            code.emitBooleanConstant(true);
            mv.visitJumpInsn(Opcodes.GOTO, done);
            mv.visitLabel(isFalse);
            code.emitBooleanConstant(false);
            mv.visitLabel(done);
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.ExpressionHandler.java

@Override
public BytecodeExpression or(Location loc, final List<BytecodeExpression> inputs) {
    return new BaseTypeExpression(BaseTypeAdapter.BOOLEAN) {
        @Override/* w  w w.j  av a  2s .  c  om*/
        public void generate(CodeEmitter code) {
            MethodVisitor mv = code.getMethodVisitor();
            Label done = new Label();
            Label isTrue = new Label();
            for (BytecodeExpression input : inputs) {
                Label isFalse = new Label();
                code.exec(input);
                input.getType().getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
                mv.visitLabel(isFalse);
            }
            code.emitBooleanConstant(false);
            mv.visitJumpInsn(Opcodes.GOTO, done);
            mv.visitLabel(isTrue);
            code.emitBooleanConstant(true);
            mv.visitLabel(done);
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.ExpressionHandler.java

@Override
public BytecodeExpression not(Location loc, final BytecodeExpression input) {
    return new BaseTypeExpression(BaseTypeAdapter.BOOLEAN) {
        @Override/* w w w  .j a  va2  s.  c om*/
        public void generate(CodeEmitter code) {
            MethodVisitor mv = code.getMethodVisitor();
            Label done = new Label();
            Label isTrue = new Label();
            Label isFalse = new Label();
            code.exec(input);
            input.getType().getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
            mv.visitLabel(isFalse);
            code.emitBooleanConstant(true);
            mv.visitJumpInsn(Opcodes.GOTO, done);
            mv.visitLabel(isTrue);
            code.emitBooleanConstant(false);
            mv.visitLabel(done);
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.ExpressionHandler.java

@Override
public BytecodeExpression bool(Location loc, final BytecodeExpression input) {
    return new BaseTypeExpression(BaseTypeAdapter.BOOLEAN) {
        @Override/*from   www  .  j  av  a 2s.c o m*/
        public void generate(CodeEmitter code) {
            if (input.getType() == BaseTypeAdapter.BOOLEAN) {
                code.exec(input);
            } else {
                MethodVisitor mv = code.getMethodVisitor();
                Label done = new Label();
                Label isTrue = new Label();
                Label isFalse = new Label();
                code.exec(input);
                input.getType().getComparisionAdapter().coerceBoolean(code, isTrue, isFalse, isFalse);
                mv.visitLabel(isFalse);
                code.emitBooleanConstant(false);
                mv.visitJumpInsn(Opcodes.GOTO, done);
                mv.visitLabel(isTrue);
                code.emitBooleanConstant(true);
                mv.visitLabel(done);
            }
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.bytecode.types.gambit.ExpressionHandler.java

@Override
public BytecodeExpression isNull(Location location, final BytecodeExpression input) {
    return new BaseTypeExpression(BaseTypeAdapter.BOOLEAN) {
        @Override//  ww w  .j av a  2 s .c om
        public void generate(CodeEmitter code) {
            MethodVisitor mv = code.getMethodVisitor();
            code.exec(input);
            // it's surprising to not evaluate even if we know input isn't nullable
            if (input.getType().isPrimitive()) {
                code.pop(input.getType());
                code.emitBooleanConstant(false);
            } else {
                Label done = new Label();
                Label isNull = new Label();
                mv.visitJumpInsn(Opcodes.IFNULL, isNull);
                code.emitBooleanConstant(false);
                mv.visitJumpInsn(Opcodes.GOTO, done);
                mv.visitLabel(isNull);
                code.emitBooleanConstant(true);
                mv.visitLabel(done);
            }
        }
    };
}