Example usage for org.objectweb.asm MethodVisitor visitVarInsn

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

Introduction

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

Prototype

public void visitVarInsn(final int opcode, final int var) 

Source Link

Document

Visits a local variable instruction.

Usage

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;
}