List of usage examples for org.objectweb.asm MethodVisitor visitMethodInsn
public void visitMethodInsn(final int opcode, final String owner, final String name, final String descriptor, final boolean isInterface)
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); }