List of usage examples for org.objectweb.asm MethodVisitor visitLdcInsn
public void visitLdcInsn(final Object value)
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(); }