Example usage for org.objectweb.asm MethodVisitor visitMethodInsn

List of usage examples for org.objectweb.asm MethodVisitor visitMethodInsn

Introduction

In this page you can find the example usage for org.objectweb.asm MethodVisitor visitMethodInsn.

Prototype

public void visitMethodInsn(final int opcode, final String owner, final String name, final String descriptor,
        final boolean isInterface) 

Source Link

Document

Visits a method instruction.

Usage

From source file:dijkstra.gen.DijkstraCodeGenerator.java

License:Open Source License

/**
 * Call the runtime input for the ID and then store the result in the 
 * @see dijkstra.ast.ASTVisitor#visit(dijkstra.ast.ASTNodeFactory.InputNode)
 *//*w w w . j  av  a 2 s  . c om*/
public byte[] visit(InputNode input) {
    final MethodVisitor mv = mvStack.peek();
    for (IDNode id : input.getIDs()) {
        mv.visitLdcInsn(id.token.getText()); // Name of the variable
        if (id.getType() == DijkstraType.INT) {
            mv.visitMethodInsn(INVOKESTATIC, "dijkstra/runtime/DijkstraRuntime", "inputLong",
                    "(Ljava/lang/String;)J", false);
            if (id.symbol.isGlobal()) {
                mv.visitFieldInsn(PUTSTATIC, fullPath, id.getName(), "J");
            } else {
                mv.visitVarInsn(LSTORE, id.getAddress());
            }
        } else if (id.getType() == DijkstraType.FLOAT) {
            mv.visitMethodInsn(INVOKESTATIC, "dijkstra/runtime/DijkstraRuntime", "inputDouble",
                    "(Ljava/lang/String;)D", false);
            if (id.symbol.isGlobal()) {
                mv.visitFieldInsn(PUTSTATIC, fullPath, id.getName(), "D");
            } else {
                mv.visitVarInsn(DSTORE, id.getAddress());
            }
        } else {
            mv.visitMethodInsn(INVOKESTATIC, "dijkstra/runtime/DijkstraRuntime", "inputBoolean",
                    "(Ljava/lang/String;)Z", false);
            if (id.symbol.isGlobal()) {
                mv.visitFieldInsn(PUTSTATIC, fullPath, id.getName(), "Z");
            } else {
                mv.visitVarInsn(ISTORE, id.getAddress());
            }
        }
    }
    return null;
}

From source file:dijkstra.gen.DijkstraCodeGenerator.java

License:Open Source License

/**
 * Get the expression onto the stack and then call the runtime print
 * routine./*w  ww . j  av a  2 s .c o  m*/
 * @see dijkstra.ast.ASTVisitor#visit(dijkstra.ast.ASTNodeFactory.OutputNode)
 */
public byte[] visit(OutputNode output) {
    final MethodVisitor mv = mvStack.peek();
    output.getExpression().accept(this); // TOS = expression value
    if (output.getType() == DijkstraType.INT) {
        mv.visitMethodInsn(INVOKESTATIC, "dijkstra/runtime/DijkstraRuntime", "printLong", "(J)V", false);
    } else if (output.getType() == DijkstraType.FLOAT) {
        mv.visitMethodInsn(INVOKESTATIC, "dijkstra/runtime/DijkstraRuntime", "printDouble", "(D)V", false);
    } else {
        // Boolean
        mv.visitMethodInsn(INVOKESTATIC, "dijkstra/runtime/DijkstraRuntime", "printBoolean", "(Z)V", false);
    }
    return null;
}

From source file:dijkstra.gen.DijkstraCodeGenerator.java

License:Open Source License

public byte[] visit(AlternativeNode alternative) {
    final MethodVisitor mv = mvStack.peek();
    final Label endLabel = new Label();
    guardLabelStack.push(endLabel);//from   ww w .j av a2  s  . co m
    visitChildren(alternative);
    guardLabelStack.pop();
    mv.visitIntInsn(BIPUSH, alternative.getLineNumber());
    mv.visitMethodInsn(INVOKESTATIC, "dijkstra/runtime/DijkstraRuntime", "abortNoAlternative", "(I)V", false);
    mv.visitLabel(endLabel);
    return null;
}

From source file:dijkstra.gen.DijkstraCodeGenerator.java

License:Open Source License

public byte[] visit(MethodCallNode node) {
    final MethodVisitor mv = mvStack.peek();
    final String objectType = ((ObjectSymbol) node.getObjectId().symbol).getObjectType();
    final StringBuilder sig = new StringBuilder();
    sig.append('(');
    List<Symbol> propertySymbols;
    if (node.getId().symbol.getType() == DijkstraType.PROCEDURE) {
        propertySymbols = ((ProcedureSymbol) node.getId().symbol).getParamSymbols();
    } else {/*from   ww w.j  a va  2s .  c o  m*/
        propertySymbols = ((FunctionSymbol) node.getId().symbol).getParamSymbols();
    }
    for (Symbol property : propertySymbols) {
        if (property.getType() == DijkstraType.INT) {
            sig.append('J');
        } else if (property.getType() == DijkstraType.FLOAT) {
            sig.append('D');
        } else {
            sig.append('Z');
        }
    }
    if (node.getId().symbol.getType() == FUNCTION) {
        sig.append(")[Ljava/lang/Object;");
    } else {
        sig.append(")V");
    }

    if (node.getObjectId().symbol.isGlobal() && !inClass) {
        mv.visitFieldInsn(GETSTATIC, fullPath, node.getObjectId().getName(),
                "L" + classPackage + "/" + ((ObjectSymbol) node.getObjectId().symbol).getObjectType() + ";");
    } else if (node.getObjectId().symbol.isGlobal() && inClass) {
        mv.visitFieldInsn(GETFIELD, fullPath, node.getObjectId().getName(),
                "L" + classPackage + "/" + ((ObjectSymbol) node.getObjectId().symbol).getObjectType() + ";");
    } else {
        mv.visitVarInsn(ALOAD, node.getObjectId().getAddress());
    }
    int paramIndex = 0;
    for (ASTNode arg : node.getArgs()) {
        arg.accept(this);
        if (arg.nodeType == FUNCALL) {
            paramIndex += ((FunctionSymbol) ((FunctionCallNode) arg).getId().symbol).getReturnTypes().size()
                    - 1;
        } else if (propertySymbols.get(paramIndex).getType() == DijkstraType.INT
                && arg.getType() == DijkstraType.FLOAT) {
            mv.visitInsn(D2L);
        } else if (propertySymbols.get(paramIndex).getType() == DijkstraType.FLOAT
                && arg.getType() == DijkstraType.INT) {
            mv.visitInsn(L2D);
        }
        paramIndex++;
    }
    //      mv.visitVarInsn(ALOAD, node.getObjectId().getAddress())
    mv.visitMethodInsn(INVOKEVIRTUAL, classPackage + "/" + objectType, node.getId().getName(), sig.toString(),
            false);

    if (node.getId().symbol.getType() == FUNCTION) {
        final FunctionSymbol fSymbol = ((FunctionSymbol) node.getId().symbol);
        returnArrayStack.push(new ArraySymbol(null, UNDEFINED));
        mv.visitVarInsn(ASTORE, JVMInfo.getAddressForSymbol(returnArrayStack.peek()));
        for (int i = 0; i < fSymbol.getReturnTypes().size(); i++) {
            // Load the only element in the array and put it on the stack
            mv.visitVarInsn(ALOAD, JVMInfo.getAddressForSymbol(returnArrayStack.peek()));
            mv.visitIntInsn(SIPUSH, i);
            mv.visitInsn(AALOAD);
            DijkstraType retType = fSymbol.getReturnTypes().get(i);
            if (retType == DijkstraType.INT) {
                mv.visitTypeInsn(CHECKCAST, "java/lang/Long");
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false);
            } else if (retType == DijkstraType.FLOAT) {
                mv.visitTypeInsn(CHECKCAST, "java/lang/Double");
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false);
            } else {
                mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean");
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false);
            }
        }
        returnArrayStack.pop();
    }
    return null;
}

From source file:dijkstra.gen.DijkstraCodeGenerator.java

License:Open Source License

public byte[] visit(ProcedureCallNode procCallNode) {
    final MethodVisitor mv = mvStack.peek();
    final String methodName = procCallNode.getId().getName();
    final StringBuilder sig = new StringBuilder();
    final List<Symbol> params = ((ProcedureSymbol) procCallNode.getId().symbol).getParamSymbols();
    final List<ASTNode> args = procCallNode.getArgs();
    sig.append('(');
    for (int i = 0; i < params.size(); i++) {
        DijkstraType paramType = params.get(i).getType();
        if (paramType == DijkstraType.INT) {
            sig.append('J');
        } else if (paramType == DijkstraType.FLOAT) {
            sig.append('D');
        } else {//from w  w  w  .ja  v a  2s.  com
            sig.append('Z');
        }
    }
    int paramIndex = 0;
    for (ASTNode arg : args) {
        arg.accept(this);
        if (arg.nodeType == FUNCALL) {
            paramIndex += ((FunctionSymbol) ((FunctionCallNode) arg).getId().symbol).getReturnTypes().size()
                    - 1;
        } else if (params.get(paramIndex).getType() == DijkstraType.INT
                && arg.getType() == DijkstraType.FLOAT) {
            mv.visitInsn(D2L);
        } else if (params.get(paramIndex).getType() == DijkstraType.FLOAT
                && arg.getType() == DijkstraType.INT) {
            mv.visitInsn(L2D);
        }
        paramIndex++;
    }
    sig.append(")V");
    mv.visitMethodInsn(INVOKESTATIC, classPackage + "/" + programName, methodName, sig.toString(), false);
    return null;
}

From source file:dijkstra.gen.DijkstraCodeGenerator.java

License:Open Source License

public byte[] visit(FunctionCallNode funCallNode) {
    final MethodVisitor mv = mvStack.peek();
    final String methodName = funCallNode.getId().getName();
    final StringBuilder sig = new StringBuilder();
    if (funCallNode.getId().symbol instanceof FunctionSymbol) {
        final FunctionSymbol fSymbol = ((FunctionSymbol) funCallNode.getId().symbol);
        final List<Symbol> params = fSymbol.getParamSymbols();
        final List<ASTNode> args = funCallNode.getArgs();
        sig.append('(');
        for (int i = 0; i < params.size(); i++) {
            DijkstraType paramType = params.get(i).getType();
            if (paramType == DijkstraType.INT) {
                sig.append('J');
            } else if (paramType == DijkstraType.FLOAT) {
                sig.append('D');
            } else {
                sig.append('Z');
            }/*from ww  w .  j a  va2  s .c o m*/
        }
        int paramIndex = 0;
        for (ASTNode arg : args) {
            arg.accept(this);
            if (arg.nodeType == FUNCALL) {
                paramIndex += ((FunctionSymbol) ((FunctionCallNode) arg).getId().symbol).getReturnTypes().size()
                        - 1;
            } else if (params.get(paramIndex).getType() == DijkstraType.INT
                    && arg.getType() == DijkstraType.FLOAT) {
                mv.visitInsn(D2L);
            } else if (params.get(paramIndex).getType() == DijkstraType.FLOAT
                    && arg.getType() == DijkstraType.INT) {
                mv.visitInsn(L2D);
            }
            paramIndex++;
        }
        sig.append(')');
        sig.append("[Ljava/lang/Object;");

        mv.visitMethodInsn(INVOKESTATIC, classPackage + "/" + programName, methodName, sig.toString(), false);
        returnArrayStack.push(new ArraySymbol(null, UNDEFINED));
        mv.visitVarInsn(ASTORE, JVMInfo.getAddressForSymbol(returnArrayStack.peek()));
        for (int i = 0; i < fSymbol.getReturnTypes().size(); i++) {
            // Load the only element in the array and put it on the stack
            mv.visitVarInsn(ALOAD, JVMInfo.getAddressForSymbol(returnArrayStack.peek()));
            mv.visitIntInsn(SIPUSH, i);
            mv.visitInsn(AALOAD);
            DijkstraType retType = fSymbol.getReturnTypes().get(i);
            if (retType == DijkstraType.INT) {
                mv.visitTypeInsn(CHECKCAST, "java/lang/Long");
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false);
            } else if (retType == DijkstraType.FLOAT) {
                mv.visitTypeInsn(CHECKCAST, "java/lang/Double");
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false);
            } else {
                mv.visitTypeInsn(CHECKCAST, "java/lang/Boolean");
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Boolean", "booleanValue", "()Z", false);
            }
        }
        returnArrayStack.pop();
    } else {
        final ClassSymbol cSymbol = ((ClassSymbol) funCallNode.getId().symbol);
        final List<Symbol> properties = cSymbol.getPropertySymbols();
        final List<ASTNode> args = funCallNode.getArgs();
        mv.visitTypeInsn(NEW, classPackage + "/" + cSymbol.getId());
        mv.visitInsn(DUP);
        sig.append('(');
        for (int i = 0; i < properties.size(); i++) {
            DijkstraType paramType = properties.get(i).getType();
            if (paramType == DijkstraType.INT) {
                sig.append('J');
            } else if (paramType == DijkstraType.FLOAT) {
                sig.append('D');
            } else {
                sig.append('Z');
            }
        }
        int paramIndex = 0;
        for (ASTNode arg : args) {
            arg.accept(this);
            if (arg.nodeType == FUNCALL) {
                paramIndex += ((FunctionSymbol) ((FunctionCallNode) arg).getId().symbol).getReturnTypes().size()
                        - 1;
            } else if (properties.get(paramIndex).getType() == DijkstraType.INT
                    && arg.getType() == DijkstraType.FLOAT) {
                mv.visitInsn(D2L);
            } else if (properties.get(paramIndex).getType() == DijkstraType.FLOAT
                    && arg.getType() == DijkstraType.INT) {
                mv.visitInsn(L2D);
            }
            paramIndex++;
        }
        sig.append(')');
        sig.append('V');

        mv.visitMethodInsn(INVOKESPECIAL, classPackage + "/" + cSymbol.getId(), "<init>", sig.toString(),
                false);
    }

    return null;
}

From source file:dijkstra.gen.DijkstraCodeGenerator.java

License:Open Source License

public byte[] visit(ReturnNode returnNode) {
    final MethodVisitor mv = mvStack.peek();
    for (ASTNode child : returnNode.children) {
        mv.visitVarInsn(ALOAD, JVMInfo.getAddressForSymbol(returnArrayStack.peek()));
        // What index are we storing it in
        int indexAddr = JVMInfo.getAddressForSymbol(returnIndexStack.peek());
        mv.visitVarInsn(ILOAD, indexAddr);
        child.accept(this);
        if (child.nodeType == FUNCALL) {
            final List<DijkstraType> returnTypes = ((FunctionSymbol) ((FunctionCallNode) child).getId().symbol)
                    .getReturnTypes();// w  ww. j ava  2s  .c  o m
            final Stack<Symbol> returnValues = new Stack<Symbol>();
            for (int i = returnTypes.size() - 1; i >= 0; i--) {
                returnValues.push(new Symbol(null, UNDEFINED));
                if (returnTypes.get(i) == DijkstraType.INT) {
                    mv.visitVarInsn(LSTORE, JVMInfo.getAddressForSymbol(returnValues.peek()));
                } else if (returnTypes.get(i) == DijkstraType.FLOAT) {
                    mv.visitVarInsn(DSTORE, JVMInfo.getAddressForSymbol(returnValues.peek()));
                } else {
                    // boolean
                    mv.visitVarInsn(ISTORE, JVMInfo.getAddressForSymbol(returnValues.peek()));
                }
            }
            for (int i = 0; i < returnTypes.size(); i++) {
                // Load the pointer to the array
                mv.visitVarInsn(ALOAD, JVMInfo.getAddressForSymbol(returnArrayStack.peek()));
                mv.visitIntInsn(SIPUSH, i);

                if (returnTypes.get(i) == DijkstraType.INT) {
                    mv.visitVarInsn(LLOAD, JVMInfo.getAddressForSymbol(returnValues.peek()));
                    mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
                } else if (returnTypes.get(i) == DijkstraType.FLOAT) {
                    mv.visitVarInsn(DLOAD, JVMInfo.getAddressForSymbol(returnValues.peek()));
                    mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;",
                            false);
                } else {
                    // boolean
                    mv.visitVarInsn(ILOAD, JVMInfo.getAddressForSymbol(returnValues.peek()));
                    mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;",
                            false);
                }
                mv.visitInsn(AASTORE);
                // Increment the return index
                mv.visitIincInsn(indexAddr, 1);
                returnValues.pop();
            }
        } else {
            DijkstraType retType = child.getType();
            if (retType == DijkstraType.INT) {
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;", false);
            } else if (retType == DijkstraType.FLOAT) {
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;", false);
            } else {
                mv.visitMethodInsn(INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;",
                        false);
            }
            mv.visitInsn(AASTORE);
            // Increment the return index
            mv.visitIincInsn(indexAddr, 1);
        }
    }
    return null;
}

From source file:dodola.anole.lib.InstantRunTransform.java

License:Apache License

/**
 * Use asm to generate a concrete subclass of the AppPathLoaderImpl class.
 * It only implements one method ://from ww w. j av a2s .  com
 * String[] getPatchedClasses();
 * <p>
 * The method is supposed to return the list of classes that were patched in this iteration.
 * This will be used by the InstantRun runtime to load all patched classes and register them
 * as overrides on the original classes.2 class files.
 *
 * @param patchFileContents list of patched class names.
 * @param outputDir         output directory where to generate the .class file in.
 * @return the generated .class files
 */
public static File writePatchFileContents(List<String> patchFileContents, File outputDir) {

    ClassWriter cw = new ClassWriter(0);
    MethodVisitor mv;

    cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, IncrementalVisitor.APP_PATCHES_LOADER_IMPL,
            null, IncrementalVisitor.ABSTRACT_PATCHES_LOADER_IMPL, null);

    {
        mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(Opcodes.ALOAD, 0);
        mv.visitMethodInsn(Opcodes.INVOKESPECIAL, IncrementalVisitor.ABSTRACT_PATCHES_LOADER_IMPL, "<init>",
                "()V", false);
        mv.visitInsn(Opcodes.RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    {
        mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "getPatchedClasses", "()[Ljava/lang/String;", null, null);
        mv.visitCode();
        mv.visitIntInsn(Opcodes.BIPUSH, patchFileContents.size());
        mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String");
        for (int index = 0; index < patchFileContents.size(); index++) {
            mv.visitInsn(Opcodes.DUP);
            mv.visitIntInsn(Opcodes.BIPUSH, index);
            mv.visitLdcInsn(patchFileContents.get(index));
            mv.visitInsn(Opcodes.AASTORE);
        }
        mv.visitInsn(Opcodes.ARETURN);
        mv.visitMaxs(4, 1);
        mv.visitEnd();
    }
    cw.visitEnd();

    byte[] classBytes = cw.toByteArray();
    File outputFile = new File(outputDir, IncrementalVisitor.APP_PATCHES_LOADER_IMPL + ".class");
    try {
        Files.createParentDirs(outputFile);
        Files.write(classBytes, outputFile);
        // add the files to the list of files to be processed by subsequent tasks.
        return outputFile;
    } catch (IOException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}

From source file:dyco4j.instrumentation.LoggingHelper.java

License:BSD License

public static void emitConvertToString(final MethodVisitor mv, final Type type) {
    switch (type.getSort()) {
    case Type.ARRAY:
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER, "toString",
                "(Ljava/lang/Object;)Ljava/lang/String;" + "", false);
        break;//  w  w  w .  j  a  va 2 s  .  c  om
    case Type.BOOLEAN:
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER, "toString", "(Z)Ljava/lang/String;", false);
        break;
    case Type.BYTE:
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER, "toString", "(B)Ljava/lang/String;", false);
        break;
    case Type.CHAR:
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER, "toString", "(C)Ljava/lang/String;", false);
        break;
    case Type.DOUBLE:
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER, "toString", "(D)Ljava/lang/String;", false);
        break;
    case Type.FLOAT:
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER, "toString", "(F)Ljava/lang/String;", false);
        break;
    case Type.INT:
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER, "toString", "(I)Ljava/lang/String;", false);
        break;
    case Type.LONG:
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER, "toString", "(J)Ljava/lang/String;", false);
        break;
    case Type.SHORT:
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER, "toString", "(S)Ljava/lang/String;", false);
        break;
    case Type.OBJECT:
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER, "toString",
                "(Ljava/lang/Object;)Ljava/lang/String;" + "", false);
        break;
    default:
        throw new RuntimeException("Unknown type" + type.getInternalName());
    }
}

From source file:dyco4j.instrumentation.LoggingHelper.java

License:BSD License

static void emitInsnToLoadAndInitializeLogger(final MethodVisitor mv) {
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, LOGGER_INITIALIZER, LOGGER_INITIALIZER_INITIALIZE.getName(),
            LOGGER_INITIALIZER_INITIALIZE.getDescriptor(), false);
}