List of usage examples for org.objectweb.asm MethodVisitor visitVarInsn
public void visitVarInsn(final int opcode, final int var)
From source file:dijkstra.gen.DijkstraCodeGenerator.java
License:Open Source License
public byte[] visit(AssignNode assign) { final MethodVisitor mv = mvStack.peek(); if (assign.getVar() instanceof ArrayAccessorNode) { final ArrayAccessorNode arrAcc = ((ArrayAccessorNode) assign.getVar()); // Load the pointer to the array final DijkstraType arrayType = ((ArraySymbol) arrAcc.getId().symbol).getArrayType(); if (arrAcc.getId().symbol.isGlobal()) { if (arrayType == DijkstraType.INT) { mv.visitFieldInsn(GETSTATIC, fullPath, arrAcc.getId().getName(), "[J"); } else if (arrayType == DijkstraType.FLOAT) { mv.visitFieldInsn(GETSTATIC, fullPath, arrAcc.getId().getName(), "[D"); } else { mv.visitFieldInsn(GETSTATIC, fullPath, arrAcc.getId().getName(), "[Z"); }/*w w w. j a va2 s. c o m*/ } else if (arrAcc.getId().symbol.isGlobal() && inClass) { if (arrayType == DijkstraType.INT) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, arrAcc.getId().getName(), "[J"); } else if (arrayType == DijkstraType.FLOAT) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, arrAcc.getId().getName(), "[D"); } else { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, arrAcc.getId().getName(), "[Z"); } } else { mv.visitVarInsn(ALOAD, arrAcc.getId().getAddress()); } // Visit the array accessor expression so we know what index we're getting arrAcc.getExpression().accept(this); // Convert the expression type to an int if (arrAcc.getExpression().getType() == DijkstraType.INT) { mv.visitInsn(L2I); } else { mv.visitInsn(D2I); } } else if (assign.getVar() instanceof AttributeNode) { if (((AttributeNode) assign.getVar()).getObj().symbol.isGlobal() && !inClass) { mv.visitFieldInsn(GETSTATIC, fullPath, ((AttributeNode) assign.getVar()).getObj().getName(), "L" + classPackage + "/" + ((ObjectSymbol) ((AttributeNode) assign.getVar()).getObj().symbol).getObjectType() + ";"); } else if (((AttributeNode) assign.getVar()).getObj().symbol.isGlobal() && inClass) { mv.visitFieldInsn(GETFIELD, fullPath, ((AttributeNode) assign.getVar()).getObj().getName(), "L" + classPackage + "/" + ((ObjectSymbol) ((AttributeNode) assign.getVar()).getObj().symbol).getObjectType() + ";"); } else { mv.visitVarInsn(ALOAD, ((AttributeNode) assign.getVar()).getObj().getAddress()); } // mv.visitVarInsn(ALOAD, ((AttributeNode)assign.getVar()).getObj().getAddress()); } assign.getExpression().accept(this); // TOS = expression value reading = false; if (assign.getType() == DijkstraType.INT) { if (assign.getExpression().getType() == DijkstraType.FLOAT) { mv.visitInsn(D2L); } assign.getVar().accept(this); } else if (assign.getType() == DijkstraType.FLOAT) { if (assign.getExpression().getType() == DijkstraType.INT) { mv.visitInsn(L2D); } assign.getVar().accept(this); } else if (assign.getType() == DijkstraType.BOOLEAN) { assign.getVar().accept(this); } else { assign.getVar().accept(this); // mv.visitVarInsn(ASTORE, ((IDNode)assign.getVar()).getAddress()); } reading = true; return null; }
From source file:dijkstra.gen.DijkstraCodeGenerator.java
License:Open Source License
public byte[] visit(AssignListNode assignList) { final MethodVisitor mv = mvStack.peek(); final List<ASTNode> ids = assignList.getVarList(); final List<ASTNode> exprs = assignList.getExpressionList(); for (int exprsArrayIndex = 0, idsArrayIndex = 0; exprsArrayIndex < exprs .size(); idsArrayIndex++, exprsArrayIndex++) { if (ids.get(idsArrayIndex) instanceof ArrayAccessorNode) { ArrayAccessorNode arrAcc = ((ArrayAccessorNode) ids.get(idsArrayIndex)); // Load the pointer to the array final DijkstraType arrayType = ((ArraySymbol) arrAcc.getId().symbol).getArrayType(); if (arrAcc.getId().symbol.isGlobal()) { if (arrayType == DijkstraType.INT) { mv.visitFieldInsn(GETSTATIC, fullPath, arrAcc.getId().getName(), "[J"); } else if (arrayType == DijkstraType.FLOAT) { mv.visitFieldInsn(GETSTATIC, fullPath, arrAcc.getId().getName(), "[D"); } else { mv.visitFieldInsn(GETSTATIC, fullPath, arrAcc.getId().getName(), "[Z"); }/*from w ww .j a v a 2 s . c o m*/ } else if (arrAcc.getId().symbol.isGlobal() && inClass) { if (arrayType == DijkstraType.INT) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, arrAcc.getId().getName(), "[J"); } else if (arrayType == DijkstraType.FLOAT) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, arrAcc.getId().getName(), "[D"); } else { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, arrAcc.getId().getName(), "[Z"); } } else { mv.visitVarInsn(ALOAD, arrAcc.getId().getAddress()); } // Visit the array accessor expression so we know what index we're getting arrAcc.getExpression().accept(this); // Convert the expression type to an int if (arrAcc.getExpression().getType() == DijkstraType.INT) { mv.visitInsn(L2I); } else { mv.visitInsn(D2I); } } else if (ids.get(idsArrayIndex) instanceof AttributeNode) { IDNode node = ((AttributeNode) ids.get(idsArrayIndex)).getObj(); if (node.symbol.isGlobal() && !inClass) { mv.visitFieldInsn(GETSTATIC, fullPath, node.getName(), "L" + classPackage + "/" + ((ObjectSymbol) node.symbol).getObjectType() + ";"); } else if (node.symbol.isGlobal() && inClass) { mv.visitFieldInsn(GETFIELD, fullPath, node.getName(), "L" + classPackage + "/" + ((ObjectSymbol) node.symbol).getObjectType() + ";"); } else { mv.visitVarInsn(ALOAD, node.getAddress()); } // mv.visitVarInsn(ALOAD, ((AttributeNode)ids.get(idsArrayIndex)).getObj().getAddress()); } exprs.get(exprsArrayIndex).accept(this); if (exprs.get(exprsArrayIndex).nodeType == ASTNodeType.FUNCALL) { List<DijkstraType> returnTypes = ((FunctionSymbol) ((FunctionCallNode) exprs.get(exprsArrayIndex)) .getId().symbol).getReturnTypes(); 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 = 1; i < returnTypes.size(); i++) { idsArrayIndex++; if (ids.get(idsArrayIndex) instanceof ArrayAccessorNode) { ArrayAccessorNode arrAcc = ((ArrayAccessorNode) ids.get(idsArrayIndex)); // Load the pointer to the array final DijkstraType arrayType = ((ArraySymbol) arrAcc.getId().symbol).getArrayType(); if (arrAcc.getId().symbol.isGlobal()) { if (arrayType == DijkstraType.INT) { mv.visitFieldInsn(GETSTATIC, fullPath, arrAcc.getId().getName(), "[J"); } else if (arrayType == DijkstraType.FLOAT) { mv.visitFieldInsn(GETSTATIC, fullPath, arrAcc.getId().getName(), "[D"); } else { mv.visitFieldInsn(GETSTATIC, fullPath, arrAcc.getId().getName(), "[Z"); } } else if (arrAcc.getId().symbol.isGlobal() && inClass) { if (arrayType == DijkstraType.INT) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, arrAcc.getId().getName(), "[J"); } else if (arrayType == DijkstraType.FLOAT) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, arrAcc.getId().getName(), "[D"); } else { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, arrAcc.getId().getName(), "[Z"); } } else { mv.visitVarInsn(ALOAD, arrAcc.getId().getAddress()); } // Visit the array accessor expression so we know what index we're getting arrAcc.getExpression().accept(this); // Convert the expression type to an int if (arrAcc.getExpression().getType() == DijkstraType.INT) { mv.visitInsn(L2I); } else { mv.visitInsn(D2I); } } if (returnTypes.get(i) == DijkstraType.INT) { mv.visitVarInsn(LLOAD, JVMInfo.getAddressForSymbol(returnValues.peek())); } else if (returnTypes.get(i) == DijkstraType.FLOAT) { mv.visitVarInsn(DLOAD, JVMInfo.getAddressForSymbol(returnValues.peek())); } else { // boolean mv.visitVarInsn(ILOAD, JVMInfo.getAddressForSymbol(returnValues.peek())); } returnValues.pop(); } } } // Pop them off an assign them in order reading = false; final List<DijkstraType> exprTypes = getExpressionListTypes(assignList.getExpressionList()); for (int i = ids.size() - 1; i >= 0; i--) { final DijkstraType idType; if (ids.get(i) instanceof ArrayAccessorNode) { idType = ((ArraySymbol) ((ArrayAccessorNode) ids.get(i)).getId().symbol).getArrayType(); } else { idType = ids.get(i).getType(); } DijkstraType exprType = exprTypes.get(i); if (idType == DijkstraType.INT) { if (exprType == DijkstraType.FLOAT) { mv.visitInsn(D2L); } } else if (idType == DijkstraType.FLOAT) { if (exprType == DijkstraType.INT) { mv.visitInsn(L2D); } } ids.get(i).accept(this); } reading = true; 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 www. j a v a 2 s. 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(FunctionDeclarationNode funDeclNode) { if (processingClassFields) { return null; }/*from w ww. ja v a 2 s . com*/ final String methodName = funDeclNode.getIDNode().getName(); final StringBuilder sig = new StringBuilder(); sig.append('('); for (IDNode param : funDeclNode.getParamList()) { if (param.getType() == DijkstraType.INT) { sig.append('J'); } else if (param.getType() == DijkstraType.FLOAT) { sig.append('D'); } else { sig.append('Z'); } } sig.append(')'); sig.append("[Ljava/lang/Object;"); if (inClass) { mvStack.push(cw.visitMethod(ACC_PUBLIC, methodName, sig.toString(), null, null)); } else { mvStack.push(cw.visitMethod(ACC_PUBLIC + ACC_STATIC, methodName, sig.toString(), null, null)); } final MethodVisitor mv = mvStack.peek(); JVMInfo.enterScope(inClass); // Load the parameters into the JVMInfo so it knows the proper addresses for (IDNode param : funDeclNode.getParamList()) { param.getAddress(); } mv.visitIntInsn(SIPUSH, funDeclNode.getReturnTypes().size()); mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); returnArrayStack.push(new ArraySymbol(null, UNDEFINED)); mv.visitVarInsn(ASTORE, JVMInfo.getAddressForSymbol(returnArrayStack.peek())); mv.visitInsn(ICONST_0); returnIndexStack.push(new Symbol(null, UNDEFINED)); mv.visitVarInsn(ISTORE, JVMInfo.getAddressForSymbol(returnIndexStack.peek())); mv.visitCode(); final Label startLabel = new Label(); mv.visitLabel(startLabel); funDeclNode.getCompoundNode().accept(this); returnIndexStack.pop(); mv.visitVarInsn(ALOAD, JVMInfo.getAddressForSymbol(returnArrayStack.pop())); mv.visitInsn(ARETURN); final Label endLabel = new Label(); mv.visitLabel(endLabel); int paramLoc = 0; for (IDNode param : funDeclNode.getParamList()) { if (param.getType() == DijkstraType.INT) { mv.visitLocalVariable(param.getName(), "J", null, startLabel, endLabel, paramLoc); paramLoc += 2; } else if (param.getType() == DijkstraType.FLOAT) { mv.visitLocalVariable(param.getName(), "D", null, startLabel, endLabel, paramLoc); paramLoc += 2; } else { mv.visitLocalVariable(param.getName(), "Z", null, startLabel, endLabel, paramLoc); paramLoc += 1; } } mv.visitMaxs(0, 0); mv.visitEnd(); JVMInfo.exitScope(); mvStack.pop(); 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 w ww. j a v a 2 s.co 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();//from w ww. j a va 2s .co 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:dijkstra.gen.DijkstraCodeGenerator.java
License:Open Source License
/** * When visiting an ID node, we want the value of the ID on the top of stack * @see dijkstra.ast.ASTVisitor#visit(dijkstra.ast.ASTNodeFactory.IDNode) *///from w ww . ja va 2s .c o m public byte[] visit(IDNode id) { final MethodVisitor mv = mvStack.peek(); if (reading) { if (id.getType() == DijkstraType.INT) { if (id.symbol.isGlobal() && !inClass) { mv.visitFieldInsn(GETSTATIC, fullPath, id.getName(), "J"); } else if (id.symbol.isGlobal() && inClass) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, id.getName(), "J"); } else { mv.visitVarInsn(LLOAD, id.getAddress()); } } else if (id.getType() == DijkstraType.FLOAT) { if (id.symbol.isGlobal() && !inClass) { mv.visitFieldInsn(GETSTATIC, fullPath, id.getName(), "D"); } else if (id.symbol.isGlobal() && inClass) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, id.getName(), "D"); } else { mv.visitVarInsn(DLOAD, id.getAddress()); } } else if (id.getType() == DijkstraType.BOOLEAN) { if (id.symbol.isGlobal() && !inClass) { mv.visitFieldInsn(GETSTATIC, fullPath, id.getName(), "Z"); } else if (id.symbol.isGlobal() && inClass) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, id.getName(), "Z"); } else { mv.visitVarInsn(ILOAD, id.getAddress()); } } else { if (id.symbol.isGlobal() && !inClass) { mv.visitFieldInsn(GETSTATIC, fullPath, id.getName(), "L" + classPackage + "/" + ((ObjectSymbol) id.symbol).getObjectType() + ";"); } else if (id.symbol.isGlobal() && inClass) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, fullPath, id.getName(), "L" + classPackage + "/" + ((ObjectSymbol) id.symbol).getObjectType() + ";"); } else { mv.visitVarInsn(ALOAD, id.getAddress()); } } } else { if (id.getType() == DijkstraType.INT) { if (id.symbol.isGlobal() && !inClass) { mv.visitFieldInsn(PUTSTATIC, fullPath, id.getName(), "J"); } else if (id.symbol.isGlobal() && inClass) { mv.visitFieldInsn(PUTFIELD, fullPath, id.getName(), "J"); } else { mv.visitVarInsn(LSTORE, id.getAddress()); } } else if (id.getType() == DijkstraType.FLOAT) { if (id.symbol.isGlobal() && !inClass) { mv.visitFieldInsn(PUTSTATIC, fullPath, id.getName(), "D"); } else if (id.symbol.isGlobal() && inClass) { mv.visitFieldInsn(PUTFIELD, fullPath, id.getName(), "D"); } else { mv.visitVarInsn(DSTORE, id.getAddress()); } } else if (id.getType() == DijkstraType.BOOLEAN) { if (id.symbol.isGlobal() && !inClass) { mv.visitFieldInsn(PUTSTATIC, fullPath, id.getName(), "Z"); } else if (id.symbol.isGlobal() && inClass) { mv.visitFieldInsn(PUTFIELD, fullPath, id.getName(), "Z"); } else { mv.visitVarInsn(ISTORE, id.getAddress()); } } else { if (id.symbol.isGlobal() && !inClass) { mv.visitFieldInsn(PUTSTATIC, fullPath, id.getName(), "L" + classPackage + "/" + ((ObjectSymbol) id.symbol).getObjectType() + ";"); } else if (id.symbol.isGlobal() && inClass) { mv.visitFieldInsn(PUTFIELD, fullPath, id.getName(), "L" + classPackage + "/" + ((ObjectSymbol) id.symbol).getObjectType() + ";"); } else { mv.visitVarInsn(ASTORE, id.getAddress()); } } } 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 a v a2 s . c o m * 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 int emitLogArgument(final MethodVisitor mv, final int position, final OptionalInt localVarIndex, final Type argType) { mv.visitLdcInsn(position);/*from w w w .ja v a2s.co m*/ int _typeLength = 1; if (localVarIndex.isPresent()) { final int _tmp = localVarIndex.getAsInt(); switch (argType.getSort()) { case Type.BOOLEAN: case Type.BYTE: case Type.CHAR: case Type.INT: case Type.SHORT: mv.visitVarInsn(Opcodes.ILOAD, _tmp); break; case Type.LONG: mv.visitVarInsn(Opcodes.LLOAD, _tmp); _typeLength++; break; case Type.FLOAT: mv.visitVarInsn(Opcodes.FLOAD, _tmp); break; case Type.DOUBLE: mv.visitVarInsn(Opcodes.DLOAD, _tmp); _typeLength++; break; case Type.ARRAY: case Type.OBJECT: mv.visitVarInsn(Opcodes.ALOAD, _tmp); break; } } else { mv.visitLdcInsn(Logger.UNINITIALIZED_THIS); } emitConvertToString(mv, argType); emitInvokeLog(mv, LOG_ARGUMENT); return _typeLength; }
From source file:dyco4j.LoggingHelper.java
License:BSD License
public static int emitLogArgument(final MethodVisitor mv, final int index, final Type argType) { mv.visitLdcInsn(index);// w ww . j av a 2 s .co m int _typeLength = 1; switch (argType.getSort()) { case Type.BOOLEAN: case Type.BYTE: case Type.CHAR: case Type.INT: case Type.SHORT: mv.visitVarInsn(Opcodes.ILOAD, index); break; case Type.LONG: mv.visitVarInsn(Opcodes.LLOAD, index); _typeLength++; break; case Type.FLOAT: mv.visitVarInsn(Opcodes.FLOAD, index); break; case Type.DOUBLE: mv.visitVarInsn(Opcodes.DLOAD, index); _typeLength++; break; case Type.ARRAY: case Type.OBJECT: mv.visitVarInsn(Opcodes.ALOAD, index); break; } emitConvertToString(mv, argType); emitInvokeLog(mv, LOG_ARGUMENT); return _typeLength; }