Example usage for org.objectweb.asm MethodVisitor visitLdcInsn

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

Introduction

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

Prototype

public void visitLdcInsn(final Object value) 

Source Link

Document

Visits a LDC instruction.

Usage

From source file:mt.swift.Deserializer.java

License:Apache License

private void generateReadElement(MethodVisitor methodVisitor, FrameRegisterManager context, Type type) {
    if (type == BasicType.BOOLEAN) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readBool",
                "()Z");
    } else if (type == BasicType.BYTE) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readByte",
                "()B");
    } else if (type == BasicType.I16) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readI16",
                "()S");
    } else if (type == BasicType.I32) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readI32",
                "()I");
    } else if (type == BasicType.I64) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readI64",
                "()J");
    } else if (type == BasicType.DOUBLE) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readDouble",
                "()D");
    } else if (type == BasicType.BINARY) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readBinary",
                "()[B");
    } else if (type == BasicType.STRING) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "readString",
                "()Ljava/lang/String;");
    } else if (type instanceof StructureType) {
        StructureType structureType = (StructureType) type;

        methodVisitor.visitVarInsn(ALOAD, context.getSlot("deserializer"));
        methodVisitor.visitLdcInsn(structureType.getName());
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, Util.getInternalName(Deserializer.class), "deserialize",
                "(Ljava/lang/String;Lcom/facebook/thrift/protocol/TProtocol;)Ljava/lang/Object;");
    } else if (type instanceof ListType) {
        ListType listType = (ListType) type;
        generateReadList(methodVisitor, context, listType);
    } else if (type instanceof SetType) {
        SetType setType = (SetType) type;
        generateReadSet(methodVisitor, context, setType);
    } else if (type instanceof MapType) {
        MapType mapType = (MapType) type;
        generateReadMap(methodVisitor, context, mapType);
    }//from  w w w.ja  v a 2 s.c o m
}

From source file:mt.swift.Serializer.java

License:Apache License

private void compileSerializeMethod(StructureType type, ClassVisitor writer, String targetClassName,
        Class clazz) {//from w w w  .  j av  a2 s  . c om
    MethodVisitor methodVisitor = writer.visitMethod(ACC_PUBLIC, "serialize",
            "(Ljava/lang/Object;L" + Util.getInternalName(Serializer.class)
                    + ";Lcom/facebook/thrift/protocol/TProtocol;)V",
            null, new String[] { "com/facebook/thrift/TException" });

    FrameRegisterManager context = new FrameRegisterManager();
    context.bindSlot("this", 0);
    context.bindSlot("object", 1);
    context.bindSlot("serializer", 2);
    context.bindSlot("protocol", 3);

    methodVisitor.visitCode();

    // protocol.writeStructBegin(new TStruct("name"))
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));

    methodVisitor.visitTypeInsn(NEW, "com/facebook/thrift/protocol/TStruct");
    methodVisitor.visitInsn(DUP);
    methodVisitor.visitLdcInsn(type.getName());
    methodVisitor.visitMethodInsn(INVOKESPECIAL, "com/facebook/thrift/protocol/TStruct", "<init>",
            "(Ljava/lang/String;)V");

    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeStructBegin",
            "(Lcom/facebook/thrift/protocol/TStruct;)V");

    // TField tfield = new TField()
    int fieldSlot = context.newAnonymousSlot();

    methodVisitor.visitTypeInsn(NEW, "com/facebook/thrift/protocol/TField");
    methodVisitor.visitInsn(DUP);
    methodVisitor.visitMethodInsn(INVOKESPECIAL, "com/facebook/thrift/protocol/TField", "<init>", "()V");
    methodVisitor.visitVarInsn(ASTORE, fieldSlot);

    for (Field field : type.getFields()) {
        // tfield.id = ...
        methodVisitor.visitVarInsn(ALOAD, fieldSlot);
        pushValue(methodVisitor, (short) field.getId()); // TODO: field.getId() should return short
        methodVisitor.visitFieldInsn(PUTFIELD, "com/facebook/thrift/protocol/TField", "id", "S");

        // tfield.type = ...
        methodVisitor.visitVarInsn(ALOAD, fieldSlot);
        pushValue(methodVisitor, field.getType().getTType());
        methodVisitor.visitFieldInsn(PUTFIELD, "com/facebook/thrift/protocol/TField", "type", "B");

        // tfield.name = ...
        methodVisitor.visitVarInsn(ALOAD, fieldSlot);
        methodVisitor.visitLdcInsn(field.getName());
        methodVisitor.visitFieldInsn(PUTFIELD, "com/facebook/thrift/protocol/TField", "name",
                "Ljava/lang/String;");

        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitVarInsn(ALOAD, fieldSlot);
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol",
                "writeFieldBegin", "(Lcom/facebook/thrift/protocol/TField;)V");

        if (Map.class.isAssignableFrom(clazz)) {
            generateGetFromMap(methodVisitor, context, field);
        } else {
            generateGetField(targetClassName, methodVisitor, context, field);
        }
        // protocol.writeXXX(element)
        generateWriteElement(methodVisitor, context, field.getType());

        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeFieldEnd",
                "()V");
    }

    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeFieldStop",
            "()V");

    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeStructEnd",
            "()V");

    context.release(fieldSlot);
    methodVisitor.visitInsn(RETURN);
    methodVisitor.visitMaxs(1, 1); // TODO: compute these
    methodVisitor.visitEnd();
}

From source file:mt.swift.Serializer.java

License:Apache License

/**
 * Generates bytecode to write element at top of stack
 *
 * @param methodVisitor//from  w  ww .ja  v  a2s. c  o  m
 * @param context
 * @param type
 */
private void generateWriteElement(MethodVisitor methodVisitor, FrameRegisterManager context, Type type) {
    if (type == BasicType.BOOLEAN) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitInsn(SWAP);
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeBool",
                "(Z)V");
    } else if (type == BasicType.BYTE) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitInsn(SWAP);
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeByte",
                "(B)V");
    } else if (type == BasicType.I16) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitInsn(SWAP);
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeI16",
                "(S)V");
    } else if (type == BasicType.I32) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitInsn(SWAP);
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeI32",
                "(I)V");
    } else if (type == BasicType.I64) {
        // can't use swap for double... use a temp variable instead
        int slot = context.newAnonymousSlot();
        methodVisitor.visitVarInsn(LSTORE, slot);
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitVarInsn(LLOAD, slot);
        context.release(slot);
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeI64",
                "(J)V");
    } else if (type == BasicType.DOUBLE) {
        // can't use swap for double... use a temp variable instead
        int slot = context.newAnonymousSlot();
        methodVisitor.visitVarInsn(DSTORE, slot);
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitVarInsn(DLOAD, slot);
        context.release(slot);
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeDouble",
                "(D)V");
    } else if (type == BasicType.BINARY) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitInsn(SWAP);
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeBinary",
                "([B)V");
    } else if (type == BasicType.STRING) {
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitInsn(SWAP);
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeString",
                "(Ljava/lang/String;)V");
    } else if (type instanceof StructureType) {
        StructureType structureType = (StructureType) type;

        methodVisitor.visitVarInsn(ALOAD, context.getSlot("serializer"));
        methodVisitor.visitInsn(SWAP); // element, serializer => serializer, element
        methodVisitor.visitLdcInsn(structureType.getName());
        methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
        methodVisitor.visitMethodInsn(INVOKEVIRTUAL, Util.getInternalName(Serializer.class), "serialize",
                "(Ljava/lang/Object;Ljava/lang/String;Lcom/facebook/thrift/protocol/TProtocol;)V");

    } else if (type instanceof ListType) {
        ListType listType = (ListType) type;
        generateWriteList(methodVisitor, context, listType);
    } else if (type instanceof SetType) {
        SetType setType = (SetType) type;
        generateWriteSet(methodVisitor, context, setType);
    } else if (type instanceof MapType) {
        MapType mapType = (MapType) type;
        generateWriteMap(methodVisitor, context, mapType);
    }
}

From source file:mt.swift.Serializer.java

License:Apache License

private void generateSystemErrPrintlnConstant(MethodVisitor visitor, String value) {
    visitor.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
    visitor.visitLdcInsn(value);
    visitor.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
}

From source file:mt.swift.Serializer.java

License:Apache License

/**
 * value for given field is read from the map and left at the top of the stack
 * /*from   w w w.j  av a2  s  .  co m*/
 * @param methodVisitor
 * @param context
 * @param field
 */
private void generateGetFromMap(MethodVisitor methodVisitor, FrameRegisterManager context, Field field) {
    // ((Map) object).get("field name")
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("object"));
    methodVisitor.visitTypeInsn(CHECKCAST, "java/util/Map");
    methodVisitor.visitLdcInsn(field.getName());
    methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "get",
            "(Ljava/lang/Object;)Ljava/lang/Object;");
    generateCast(methodVisitor, field.getType());
}

From source file:net.sf.sveditor.core.db.persistence.JITPersistenceDelegateFactory.java

License:Open Source License

protected void visit(boolean write, String tgt_classname, MethodVisitor mv, Class cls) {
    if (fDebugEn) {
        debug("--> " + (++fLevel) + " accessObject: " + cls.getName());
    }//  w  ww . j  a  v  a 2 s .com

    if (cls.getSuperclass() != null && cls.getSuperclass() != Object.class) {
        String tgt_super_classname = getClassName(cls.getSuperclass());
        visit(write, tgt_super_classname, mv, cls.getSuperclass());
    }

    Field fields[] = cls.getDeclaredFields();

    for (Field f : fields) {
        // f.setAccessible(true);
        Class field_class = f.getType();
        String field_classname = getClassName(field_class);

        if (!Modifier.isStatic(f.getModifiers())) {

            if (f.getAnnotation(SVDBParentAttr.class) != null) {
                if (!write) {
                    // PUTFIELD Requires:
                    // target value [0]
                    // target object [1]
                    mv.visitVarInsn(ALOAD, READ_OBJ_VAR);
                    mv.visitVarInsn(ALOAD, READ_PARENT_VAR);
                    mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(), "L" + field_classname + ";");
                }
                continue;
            }

            if (f.getAnnotation(SVDBDoNotSaveAttr.class) != null) {
                continue;
            }

            if ((f.getModifiers() & Modifier.PUBLIC) == 0) {
                throw new RuntimeException("Error: non-public field " + tgt_classname + "." + f.getName());
            }

            try {
                if (Enum.class.isAssignableFrom(field_class)) {
                    if (fDebugEn) {
                        debug("  " + fLevel + " Field " + f.getName() + " is an enum " + field_class.getName());
                    }
                    if (write) {
                        // Load up the field value and call writeEnumType
                        // Desired stack layout is:
                        // enum value
                        // enum class
                        // fParent
                        mv.visitVarInsn(ALOAD, THIS_VAR);
                        mv.visitFieldInsn(GETFIELD, fBaseClass, "fParent",
                                "L" + fPersistenceDelegateParentClass + ";");
                        // fParent handle left on the stack

                        // Load target class name
                        mv.visitLdcInsn(org.objectweb.asm.Type.getType(field_class));

                        // Load field value
                        mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                        mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(), "L" + field_classname + ";");
                        mv.visitMethodInsn(INVOKEINTERFACE, fPersistenceDelegateParentClass, "writeEnumType",
                                WRITE_ENUM_TYPE_SIG);
                    } else {
                        // Invoke the parent to read the enum value
                        // Store the result back to the field
                        mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // for later use

                        mv.visitVarInsn(ALOAD, THIS_VAR);
                        mv.visitFieldInsn(GETFIELD, fBaseClass, "fParent",
                                "L" + fPersistenceDelegateParentClass + ";");
                        // fParent handle left on the stack

                        // Stack layout must be:
                        // enum class
                        // fParent

                        // Load target class name
                        mv.visitLdcInsn(org.objectweb.asm.Type.getType(field_class));
                        mv.visitMethodInsn(INVOKEINTERFACE, fPersistenceDelegateParentClass, "readEnumType",
                                READ_ENUM_TYPE_SIG);

                        // Now, store the result back to the target field
                        // Desired layout
                        // enum value -- from calling readEnumType
                        // object handle -- loaded at beginning
                        mv.visitTypeInsn(CHECKCAST, field_classname);
                        mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(), "L" + field_classname + ";");
                        /*
                        mv.visitVarInsn(ASTORE, READ_OBJ_VAR);
                         */
                    }
                } else if (List.class.isAssignableFrom(field_class)) {
                    Type t = f.getGenericType();
                    if (t instanceof ParameterizedType) {
                        ParameterizedType pt = (ParameterizedType) t;
                        Type args[] = pt.getActualTypeArguments();
                        String readMethod = null, writeMethod = null;
                        boolean useStdRW = true;
                        if (args.length != 1) {
                            throw new DBFormatException("" + args.length + "-parameter list unsupported");
                        }
                        Class c = (Class) args[0];
                        if (c == String.class) {
                            if (fDebugEn) {
                                debug("  " + fLevel + " Field " + f.getName() + " is List<String>");
                            }
                            writeMethod = "writeStringList";
                            readMethod = "readStringList";
                        } else if (c == Integer.class) {
                            if (fDebugEn) {
                                debug("  " + fLevel + " Field " + f.getName() + " is List<Integer>");
                            }
                            writeMethod = "writeIntList";
                            readMethod = "readIntList";
                        } else if (c == Long.class) {
                            if (fDebugEn) {
                                debug("  " + fLevel + " Field " + f.getName() + " is List<Long>");
                            }
                            writeMethod = "writeLongList";
                            readMethod = "readLongList";
                        } else if (ISVDBItemBase.class.isAssignableFrom(c)) {
                            if (fDebugEn) {
                                debug("  " + fLevel + " Field " + f.getName() + " is List<ISVDBItemBase>");
                            }

                            useStdRW = false;
                            if (!write) {
                                // Invoke the parent to read the enum value
                                // Store the result back to the field
                                mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // for later use

                                mv.visitVarInsn(ALOAD, THIS_VAR);
                                mv.visitFieldInsn(GETFIELD, fBaseClass, "fParent",
                                        "L" + fPersistenceDelegateParentClass + ";");
                                // fParent handle left on the stack

                                // Stack layout must be:
                                // enum class
                                // fParent
                                mv.visitVarInsn(ALOAD, READ_OBJ_VAR);
                                mv.visitMethodInsn(INVOKEINTERFACE, fPersistenceDelegateParentClass,
                                        "readItemList", READ_ITEM_LIST_SIG);

                                // Now, store the result back to the target field
                                // Desired layout
                                // enum value -- from calling readEnumType
                                // object handle -- loaded at beginning
                                mv.visitTypeInsn(CHECKCAST, field_classname);
                                mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(),
                                        "L" + field_classname + ";");
                            } else {
                                // Load up the field value and call writeStringList
                                // Desired stack layout is:
                                // enum value
                                // enum class
                                // fParent
                                mv.visitVarInsn(ALOAD, THIS_VAR);
                                mv.visitFieldInsn(GETFIELD, fBaseClass, "fParent",
                                        "L" + fPersistenceDelegateParentClass + ";");
                                // fParent handle left on the stack

                                // Load field value
                                mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                                mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(),
                                        "L" + field_classname + ";");
                                mv.visitMethodInsn(INVOKEINTERFACE, fPersistenceDelegateParentClass,
                                        "writeItemList", WRITE_LIST_SIG);
                            }
                        } else {
                            if (fDebugEn) {
                                debug("  " + fLevel + " [ERROR] Field " + f.getName() + " is List<?>");
                            }
                            throw new DBFormatException("Type Arg: " + ((Class) args[0]).getName());
                        }
                        if (useStdRW) {
                            if (write) {
                                // Load up the field value and call writeStringList
                                // Desired stack layout is:
                                // enum value
                                // enum class
                                // fParent
                                mv.visitVarInsn(ALOAD, THIS_VAR);

                                // Load field value
                                mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                                mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(),
                                        "L" + field_classname + ";");
                                mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, writeMethod, WRITE_LIST_SIG);
                            } else {
                                // Invoke the parent to read the enum value
                                // Store the result back to the field
                                mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // for later use

                                mv.visitVarInsn(ALOAD, THIS_VAR);

                                mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, readMethod, READ_LIST_SIG);

                                // Now, store the result back to the target field
                                // Desired layout
                                // enum value -- from calling readEnumType
                                // object handle -- loaded at beginning
                                mv.visitTypeInsn(CHECKCAST, field_classname);
                                mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(),
                                        "L" + field_classname + ";");
                            }
                        }
                    } else {
                        if (fDebugEn) {
                            debug("  " + fLevel + " [ERROR] Field " + f.getName()
                                    + " is an unparameterized List");
                        }
                        throw new DBFormatException("Non-parameterized list");
                    }
                } else if (Set.class.isAssignableFrom(field_class)) {
                    Type t = f.getGenericType();
                    if (t instanceof ParameterizedType) {
                        ParameterizedType pt = (ParameterizedType) t;
                        Type args[] = pt.getActualTypeArguments();
                        String readMethod = null, writeMethod = null;
                        boolean useStdRW = true;
                        if (args.length != 1) {
                            throw new DBFormatException("" + args.length + "-parameter list unsupported");
                        }
                        Class c = (Class) args[0];
                        if (c == String.class) {
                            if (fDebugEn) {
                                debug("  " + fLevel + " Field " + f.getName() + " is Set<String>");
                            }
                            writeMethod = "writeStringSet";
                            readMethod = "readStringSet";
                        } else if (c == Integer.class) {
                            if (fDebugEn) {
                                debug("  " + fLevel + " Field " + f.getName() + " is Set<Integer>");
                            }
                            writeMethod = "writeIntSet";
                            readMethod = "readIntSet";
                        } else if (c == Long.class) {
                            if (fDebugEn) {
                                debug("  " + fLevel + " Field " + f.getName() + " is Set<Long>");
                            }
                            writeMethod = "writeLongSet";
                            readMethod = "readLongSet";
                        } else {
                            if (fDebugEn) {
                                debug("  " + fLevel + " [ERROR] Field " + f.getName() + " is Set<?>");
                            }
                            throw new DBFormatException("Type Arg: " + ((Class) args[0]).getName());
                        }
                        if (useStdRW) {
                            if (write) {
                                // Load up the field value and call writeStringList
                                // Desired stack layout is:
                                // enum value
                                // enum class
                                // fParent
                                mv.visitVarInsn(ALOAD, THIS_VAR);

                                // Load field value
                                mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                                mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(),
                                        "L" + field_classname + ";");
                                mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, writeMethod, WRITE_SET_SIG);
                            } else {
                                // Invoke the parent to read the enum value
                                // Store the result back to the field
                                mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // for later use

                                mv.visitVarInsn(ALOAD, THIS_VAR);

                                mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, readMethod, READ_SET_SIG);

                                // Now, store the result back to the target field
                                // Desired layout
                                // enum value -- from calling readEnumType
                                // object handle -- loaded at beginning
                                mv.visitTypeInsn(CHECKCAST, field_classname);
                                mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(),
                                        "L" + field_classname + ";");
                            }
                        }
                    } else {
                        if (fDebugEn) {
                            debug("  " + fLevel + " [ERROR] Field " + f.getName()
                                    + " is an unparameterized Set");
                        }
                        throw new DBFormatException("Non-parameterized set");
                    }
                } else if (Map.class.isAssignableFrom(field_class)) {
                    boolean local_access = true;
                    Type t = f.getGenericType();
                    if (t instanceof ParameterizedType) {
                        ParameterizedType pt = (ParameterizedType) t;
                        Type args[] = pt.getActualTypeArguments();
                        Class key_c = null;
                        Class val_c = null;
                        Class elem_c = null;
                        String readMethod = null, writeMethod = null;
                        String readSig = READ_MAP_SIG, writeSig = WRITE_MAP_SIG;

                        if (args[0] instanceof Class) {
                            key_c = (Class) args[0];
                        } else {
                            throw new DBFormatException(
                                    "Failed to deconstruct type for " + "field " + f.getName());
                        }

                        if (args[1] instanceof Class) {
                            val_c = (Class) args[1];
                        } else if (args[1] instanceof ParameterizedType) {
                            val_c = (Class) ((ParameterizedType) args[1]).getRawType();
                        } else {
                            throw new DBFormatException(
                                    "Failed to deconstruct type for " + "field " + f.getName());
                        }
                        if (key_c == String.class && val_c == String.class) {
                            if (fDebugEn) {
                                debug("  " + fLevel + " Field " + f.getName() + " is Map<String,String>");
                            }
                            writeMethod = "writeMapStringString";
                            readMethod = "readMapStringString";
                        } else if (key_c == String.class && val_c.isAssignableFrom(List.class)) {
                            // See what the list is parameterized with
                            elem_c = (Class) ((ParameterizedType) args[1]).getActualTypeArguments()[0];
                            if (fDebugEn) {
                                debug("  " + fLevel + " Field " + f.getName() + " is Map<String,List>");
                            }

                            if (elem_c == String.class) {
                                elem_c = null; // Prevent the byte-code generation from trying to load the type
                                writeMethod = "writeMapStringStringList";
                                readMethod = "readMapStringStringList";
                                writeSig = "(L" + getClassName(Map.class) + ";)V";
                                readSig = "()L" + getClassName(Map.class) + ";";
                            } else {
                                local_access = false;
                                writeMethod = "writeMapStringList";
                                readMethod = "readMapStringList";
                                writeSig = "(L" + getClassName(Map.class) + ";" + "L"
                                        + getClassName(Class.class) + ";)V";
                                readSig = "(L" + getClassName(Class.class) + ";)" + "L"
                                        + getClassName(Map.class) + ";";
                            }
                        } else if (key_c == String.class) {
                            // Assume a map of string and an object we support
                            elem_c = val_c; // Type of element object
                            if (fDebugEn) {
                                debug("  " + fLevel + " Field " + f.getName() + " is Map<String,Object>");
                            }
                            local_access = false;
                            writeMethod = "writeMapStringObject";
                            writeSig = "(L" + getClassName(Map.class) + ";" + "L" + getClassName(Class.class)
                                    + ";)V";
                            writeSig = "(L" + getClassName(Map.class) + ";" + "L" + getClassName(Class.class)
                                    + ";)V";
                            readMethod = "readMapStringObject";
                            readSig = "(L" + getClassName(Class.class) + ";)" + "L" + getClassName(Map.class)
                                    + ";";
                        } else {
                            if (fDebugEn) {
                                debug("  " + fLevel + " [ERROR] Field " + f.getName()
                                        + " is an unrecognized Map<?,?>");
                            }
                            throw new DBFormatException("Map<" + key_c.getName() + ", " + val_c.getName()
                                    + ">: Class " + cls.getName());
                        }
                        if (write) {
                            // Load up the field value and call writeStringList
                            // Desired stack layout is:
                            // enum value
                            // enum class
                            // fParent
                            mv.visitVarInsn(ALOAD, THIS_VAR);
                            if (!local_access) {
                                mv.visitFieldInsn(GETFIELD, fBaseClass, "fParent",
                                        "L" + fPersistenceDelegateParentClass + ";");
                                // fParent handle left on the stack
                            }

                            // Load field value
                            mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                            mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(),
                                    "L" + field_classname + ";");
                            if (elem_c != null) {
                                mv.visitLdcInsn(org.objectweb.asm.Type.getType(elem_c));
                            }
                            if (local_access) {
                                mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, writeMethod, writeSig);
                            } else {
                                mv.visitMethodInsn(INVOKEINTERFACE, fPersistenceDelegateParentClass,
                                        writeMethod, writeSig);
                            }
                        } else {
                            // Invoke the parent to read the enum value
                            // Store the result back to the field
                            mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // for later use

                            mv.visitVarInsn(ALOAD, THIS_VAR);
                            if (!local_access) {
                                mv.visitFieldInsn(GETFIELD, fBaseClass, "fParent",
                                        "L" + fPersistenceDelegateParentClass + ";");
                                // fParent handle left on the stack
                            }

                            // Stack layout must be:
                            // enum class
                            // fParent
                            if (elem_c != null) {
                                mv.visitLdcInsn(org.objectweb.asm.Type.getType(elem_c));
                            }
                            if (local_access) {
                                mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, readMethod, readSig);
                            } else {
                                mv.visitMethodInsn(INVOKEINTERFACE, fPersistenceDelegateParentClass, readMethod,
                                        readSig);
                            }

                            // Now, store the result back to the target field
                            // Desired layout
                            // enum value -- from calling readEnumType
                            // object handle -- loaded at beginning
                            mv.visitTypeInsn(CHECKCAST, field_classname);
                            mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(),
                                    "L" + field_classname + ";");
                        }
                    } else {
                        if (fDebugEn) {
                            debug("  " + fLevel + " [ERROR] Field " + f.getName()
                                    + " is an unparameterized map");
                        }
                        throw new DBFormatException("Non-parameterized map");
                    }
                } else if (field_class == String.class) {
                    if (fDebugEn) {
                        debug("  " + fLevel + " Field " + f.getName() + " is a String");
                    }
                    if (write) {
                        mv.visitVarInsn(ALOAD, THIS_VAR);

                        mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                        mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(), "L" + field_classname + ";");
                        // field value left on stack

                        // Call writeString
                        // Stack layout:
                        // field value
                        // parent handle
                        mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "writeString", WRITE_STRING_SIG);
                    } else {
                        mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // used by final PUTFIELD

                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);

                        // Call readString
                        // Stack layout:
                        // parent handle
                        mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "readString", READ_STRING_SIG);

                        // stack
                        // object -- result of readString
                        // object var
                        mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(), "L" + field_classname + ";");
                    }
                } else if (field_class == int.class) {
                    if (fDebugEn) {
                        debug("  " + fLevel + " Field " + f.getName() + " is an Integer");
                    }
                    if (write) {
                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);

                        mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                        mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(), "I");
                        // field value left on stack

                        // Call writeString
                        // Stack layout:
                        // field value
                        // parent handle
                        mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "writeInt", WRITE_INT_SIG);
                    } else {
                        mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // used by final PUTFIELD

                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);

                        // Call readString
                        // Stack layout:
                        // parent handle
                        mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "readInt", READ_INT_SIG);
                        mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(), "I");
                    }
                } else if (field_class == long.class) {
                    if (fDebugEn) {
                        debug("  " + fLevel + " Field " + f.getName() + " is a Long");
                    }
                    if (write) {
                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);

                        mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                        mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(), "J");
                        // field value left on stack

                        // Call writeString
                        // Stack layout:
                        // field value
                        // parent handle
                        mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "writeInt", WRITE_LONG_SIG);
                    } else {
                        mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // used by final PUTFIELD

                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);

                        // Call readString
                        // Stack layout:
                        // parent handle
                        mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "readInt", READ_LONG_SIG);
                        mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(), "J");
                    }
                } else if (field_class == boolean.class) {
                    if (fDebugEn) {
                        debug("  " + fLevel + " Field " + f.getName() + " is a Boolean");
                    }
                    if (write) {
                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);

                        mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                        mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(), "Z");
                        // field value left on stack

                        // Call writeString
                        // Stack layout:
                        // field value
                        // parent handle
                        mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "writeBoolean", WRITE_BOOL_SIG);
                    } else {
                        mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // used by final PUTFIELD

                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);

                        // Call readString
                        // Stack layout:
                        // parent handle
                        mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "readBoolean", READ_BOOL_SIG);
                        mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(), "Z");
                    }
                } else if (SVDBLocation.class == field_class) {
                    if (fDebugEn) {
                        debug("  " + fLevel + " Field " + f.getName() + " is an SVDBLocation");
                    }
                    if (write) {
                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);

                        mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                        mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(), "L" + field_classname + ";");
                        // field value left on stack

                        // Call writeString
                        // Stack layout:
                        // field value
                        // parent handle
                        mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "writeSVDBLocation", WRITE_LOCATION_SIG);
                    } else {
                        mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // used by final PUTFIELD

                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);

                        // Call readString
                        // Stack layout:
                        // parent handle
                        mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "readSVDBLocation", READ_LOCATION_SIG);
                        mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(), "L" + field_classname + ";");
                    }
                } else if (ISVDBItemBase.class.isAssignableFrom(field_class)) {
                    if (fDebugEn) {
                        debug("  " + fLevel + " Field " + f.getName() + " is an ISVDBItemBase");
                    }
                    if (write) {
                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);
                        mv.visitFieldInsn(GETFIELD, fBaseClass, "fParent",
                                "L" + fPersistenceDelegateParentClass + ";");
                        // fParent handle left on the stack

                        mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
                        mv.visitFieldInsn(GETFIELD, tgt_classname, f.getName(), "L" + field_classname + ";");
                        // field value left on stack

                        // Call writeString
                        // Stack layout:
                        // field value
                        // parent handle
                        mv.visitMethodInsn(INVOKEINTERFACE, fPersistenceDelegateParentClass, "writeSVDBItem",
                                WRITE_ITEM_SIG);
                    } else {
                        mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // used by final PUTFIELD

                        // Load the parent handle
                        mv.visitVarInsn(ALOAD, THIS_VAR);
                        mv.visitFieldInsn(GETFIELD, fBaseClass, "fParent",
                                "L" + fPersistenceDelegateParentClass + ";");
                        // fParent handle left on the stack

                        // Call readString
                        // Stack layout:
                        // parent object
                        // parent handle
                        mv.visitVarInsn(ALOAD, READ_OBJ_VAR);
                        mv.visitMethodInsn(INVOKEINTERFACE, fPersistenceDelegateParentClass, "readSVDBItem",
                                READ_ITEM_SIG);
                        mv.visitTypeInsn(CHECKCAST, field_classname);
                        mv.visitFieldInsn(PUTFIELD, tgt_classname, f.getName(), "L" + field_classname + ";");
                    }
                } else {
                    if (fDebugEn) {
                        debug("  " + fLevel + " [ERROR] Field " + f.getName() + " is an unknown class type "
                                + field_class.getName());
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                //               throw new DBFormatException("Generic Load Failure: " + e.getMessage());
            }
        }
    }

    if (fDebugEn) {
        debug("<-- " + (fLevel--) + " accessObject: " + cls.getName());
    }
}

From source file:net.sourceforge.cobertura.instrument.pass3.AbstractCodeProvider.java

License:GNU General Public License

public void generateCodeThatSetsJumpCounterIdVariable(MethodVisitor nextMethodVisitor, int new_value,
        int lastJumpIdVariableIndex) {
    nextMethodVisitor.visitLdcInsn(new_value);
    nextMethodVisitor.visitVarInsn(Opcodes.ISTORE, lastJumpIdVariableIndex);
}

From source file:net.sourceforge.cobertura.instrument.pass3.AbstractCodeProvider.java

License:GNU General Public License

public void generateCodeThatIncrementsCoberturaCounterIfVariableEqualsAndCleanVariable(
        MethodVisitor nextMethodVisitor, Integer neededJumpCounterIdVariableValue, Integer counterIdToIncrement,
        int lastJumpIdVariableIndex, String className) {

    nextMethodVisitor.visitLdcInsn((int) neededJumpCounterIdVariableValue);
    nextMethodVisitor.visitVarInsn(Opcodes.ILOAD, lastJumpIdVariableIndex);
    Label afterJump = new Label();
    nextMethodVisitor.visitJumpInsn(Opcodes.IF_ICMPNE, afterJump);
    generateCodeThatIncrementsCoberturaCounter(nextMethodVisitor, counterIdToIncrement, className);
    generateCodeThatZeroJumpCounterIdVariable(nextMethodVisitor, lastJumpIdVariableIndex);
    nextMethodVisitor.visitLabel(afterJump);
}

From source file:net.sourceforge.cobertura.instrument.pass3.AbstractCodeProvider.java

License:GNU General Public License

/**
 * {@inheritDoc}// w  w w .  j  a va2  s. c  o m
 * <p/>
 * The code injected by this implementation just registers the class using {@link TouchCollector#registerClass(Class)}. This way, during the
 * execution, touch collector knows that is responsible to ask the class after execution about a current status of the counters.
 */
protected void generateRegisterClass(MethodVisitor mv, String className) {
    mv.visitLdcInsn(className);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(TouchCollector.class), "registerClass",
            "(Ljava/lang/String;)V");
}

From source file:net.sourceforge.cobertura.instrument.pass3.AbstractCodeProvider.java

License:GNU General Public License

/**
 * {@inheritDoc}<br/><br/>/*from  w w  w  . j a  v  a  2s  .com*/
 * <p/>
 * Generates method (named  {@link #COBERTURA_CLASSMAP_METHOD_NAME}) with such a signature:
 * __cobertura_classmap( {@link LightClassmapListener} listener).</br>
 * <p/>
 * The method informs the listener about all lines, jumps and switches found, and about all counters tracking
 * the constructions.
 */
public void generateCoberturaClassMapMethod(ClassVisitor cv, ClassMap classMap) {

    LinkedList<TouchPointDescriptor> touchPointDescriptors = new LinkedList<TouchPointDescriptor>(
            classMap.getTouchPointsInLineOrder());
    int parts = 0;
    for (int j = 0; touchPointDescriptors.size() > 0; j++) {
        List<TouchPointDescriptor> bufor = new LinkedList<TouchPointDescriptor>();
        for (int i = 0; i < 1000 && touchPointDescriptors.size() > 0; i++) {
            bufor.add(touchPointDescriptors.removeFirst());
        }
        classMapContent(cv, j, bufor);
        parts++;
    }

    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, COBERTURA_CLASSMAP_METHOD_NAME,
            "(" + Type.getType(LightClassmapListener.class).toString() + ")V", null, null);
    mv.visitCode();
    mv.visitVarInsn(Opcodes.ALOAD, 0);

    mv.visitInsn(Opcodes.DUP);
    mv.visitLdcInsn(classMap.getClassName());
    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, CLASSMAP_LISTENER_INTERNALNAME, "setClazz",
            "(Ljava/lang/String;)V");

    if (classMap.getSource() != null) {
        mv.visitInsn(Opcodes.DUP);
        mv.visitLdcInsn(classMap.getSource());
        mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, CLASSMAP_LISTENER_INTERNALNAME, "setSource",
                "(Ljava/lang/String;)V");
    }

    for (int i = 0; i < parts; i++) {
        mv.visitInsn(Opcodes.DUP);
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, classMap.getClassName(),
                COBERTURA_CLASSMAP_METHOD_NAME + "_" + i,
                "(" + Type.getType(LightClassmapListener.class).toString() + ")V");
    }

    mv.visitInsn(Opcodes.POP);
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(0, 0);//will be recalculated by writer
    mv.visitEnd();
}