You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2008/02/22 20:53:03 UTC

svn commit: r630305 - /felix/sandbox/clement/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java

Author: clement
Date: Fri Feb 22 11:52:58 2008
New Revision: 630305

URL: http://svn.apache.org/viewvc?rev=630305&view=rev
Log:
Solve a bug in method header (which encapsulates POJO method invocation).
Indeed, the result and potential exception were not stored at the good place on stack if the argument list contains one or several double-size argument (long, double).

Modified:
    felix/sandbox/clement/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java

Modified: felix/sandbox/clement/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java
URL: http://svn.apache.org/viewvc/felix/sandbox/clement/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java?rev=630305&r1=630304&r2=630305&view=diff
==============================================================================
--- felix/sandbox/clement/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java (original)
+++ felix/sandbox/clement/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java Fri Feb 22 11:52:58 2008
@@ -1,3 +1,21 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.felix.ipojo.manipulation;
 
 import java.util.ArrayList;
@@ -15,68 +33,146 @@
 import org.objectweb.asm.Type;
 import org.objectweb.asm.commons.GeneratorAdapter;
 
+/**
+ * iPOJO Class Adapter.
+ * This class adapt the visited class to link the class with the container.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
 public class MethodCreator extends ClassAdapter implements Opcodes {
-    
-    private final static String PREFIX = "__";
 
-    private final static String POJO = "org/apache/felix/ipojo/Pojo";
-    
-    public final static String FIELD_FLAG_PREFIX = "__F";
-    
-    public final static String METHOD_FLAG_PREFIX = "__M";
-    
-    public final static String IM_FIELD = "__IM";
-    
-    private final static String ENTRY = "onEntry";
-    
-    private final static String EXIT = "onExit";
-    
-    private final static String ERROR = "onError";
-    
-    private final static String GET = "onGet";
-    
-    private final static String SET = "onSet";
-    
+    /**
+     * All POJO method will be renamed by using this prefix.
+     */
+    private static final String PREFIX = "__";
+
+    /**
+     * POJO class.
+     */
+    private static final  String POJO = "org/apache/felix/ipojo/Pojo";
+
+    /**
+     * Filed flag prefix.
+     */
+    private static final  String FIELD_FLAG_PREFIX = "__F";
+
+    /**
+     * MEthof flag prefix.
+     */
+    private static final  String METHOD_FLAG_PREFIX = "__M";
+
+    /**
+     * Instance Manager Field.
+     */
+    private static final  String IM_FIELD = "__IM";
+
+    /**
+     * onEntry method name.
+     */
+    private static final  String ENTRY = "onEntry";
+
+    /**
+     * onExit method name. 
+     */
+    private static final  String EXIT = "onExit";
+
+    /**
+     * on Error method name.
+     */
+    private static final  String ERROR = "onError";
+
+    /**
+     * onGet method name. 
+     */
+    private static final  String GET = "onGet";
+
+    /**
+     * onSet method name.
+     */
+    private static final  String SET = "onSet";
+
+    /**
+     * Name of the current manipulated class. 
+     */
     private String m_owner;
-    
+
+    /**
+     * Set of fields detected in the class.
+     * (this set is given by the previous analysis)
+     */
     private Set m_fields;
-    
+
+    /**
+     * List of methods contained in the class.
+     * This set contains method id.
+     */
     private List m_methods = new ArrayList(); // Contains method id.
 
+    /**
+     * Constructor.
+     * @param arg0 : class visitor.
+     * @param fields : fields map detected during the previous class analysis.
+     */
     public MethodCreator(ClassVisitor arg0, Map fields) {
         super(arg0);
         m_fields = fields.keySet();
     }
-    
+
+    /**
+     * Vist method.
+     * This method store the current class name.
+     * Moreover the POJO interface is added to the list of implemented interface.
+     * Then the Instance manager field is added.
+     * @param version : version
+     * @param access : access flag
+     * @param name : class name
+     * @param signature : signature
+     * @param superName : parent class
+     * @param interfaces : implemented interface
+     * @see org.objectweb.asm.ClassAdapter#visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
+     */
     public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
         m_owner = name;
         addPOJOInterface(version, access, name, signature, superName, interfaces);
-        addCMField();
+        addIMField();
     }
-    
+
+    /**
+     * A method is visited.
+     * This method does not manipulate clinit and class$ methods.
+     * In the case of a constructor, this method will generate a constructor with the instance manager 
+     * and will adapt the current constructor to call this constructor.
+     * For standard method, this method will create method header, rename the current method and adapt it.
+     * @param access : access flag.
+     * @param name : name of the method
+     * @param desc : method descriptor
+     * @param signature : signature
+     * @param exceptions : declared exceptions.
+     * @return the MethodVisitor wichi will visit the method code.
+     * @see org.objectweb.asm.ClassAdapter#visitMethod(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
+     */
     public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
         // Avoid manipulating special methods
         if (name.equals("<clinit>") || name.equals("class$")) { return super.visitMethod(access, name, desc, signature, exceptions); }
         // The constructor is manipulated separately
-        if (name.equals("<init>")) {      
+        if (name.equals("<init>")) {
             // 1) change the constructor descriptor (add a component manager arg as first argument)
             String newDesc = desc.substring(1);
             newDesc = "(Lorg/apache/felix/ipojo/InstanceManager;" + newDesc;
-                        
+
             Type[] args = Type.getArgumentTypes(desc);
             if (args.length == 0) {
                 generateEmptyConstructor(access, signature, exceptions);
             } else if (args.length == 1 && args[0].getClassName().equals("org.osgi.framework.BundleContext")) {
                 generateBCConstructor(access, signature, exceptions);
             }
-            
+
             // Insert the new constructor
             MethodVisitor mv = super.visitMethod(ACC_PRIVATE, "<init>", newDesc, signature, exceptions);
             return new ConstructorCodeAdapter(mv, m_owner, m_fields, ACC_PRIVATE, name, newDesc);
         }
-        
+
         if ((access & ACC_STATIC) == ACC_STATIC) { return super.visitMethod(access, name, desc, signature, exceptions); }
-        
+
         generateMethodHeader(access, name, desc, signature, exceptions);
         FieldVisitor flagField = cv.visitField(Opcodes.ACC_PRIVATE, generateMethodFlag(name, desc), "Z", null, null);
         flagField.visitEnd();
@@ -84,9 +180,11 @@
         MethodVisitor mv = super.visitMethod(ACC_PRIVATE, PREFIX + name, desc, signature, exceptions);
         return new MethodCodeAdapter(mv, m_owner, ACC_PRIVATE, PREFIX + name, desc, m_fields);
     }
-    
+
     /**
      * Visit a Field.
+     * This field access is replaced by an invocation to the getter method or to the setter method.
+     * (except for static field).
      * Inject the getter and the setter method for this field.
      * @see org.objectweb.asm.ClassVisitor#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object)
      * @param access : access modifier
@@ -100,7 +198,7 @@
         if ((access & ACC_STATIC) == 0) {
             FieldVisitor flag = cv.visitField(Opcodes.ACC_PRIVATE, FIELD_FLAG_PREFIX + name, "Z", null, null);
             flag.visitEnd();
-            
+
             Type type = Type.getType(desc);
 
             if (type.getSort() == Type.ARRAY) {
@@ -124,7 +222,15 @@
         }
         return cv.visitField(access, name, desc, signature, value);
     }
-    
+
+    /**
+     * Create a constructor to call the manipulated constructor.
+     * This constructor does not have any argument. It will call the manipulated
+     * constructor with a null instance manager.
+     * @param access : access flag
+     * @param signature : method signature
+     * @param exceptions : declared exception
+     */
     private void generateEmptyConstructor(int access, String signature, String[] exceptions) {
         MethodVisitor mv = cv.visitMethod(access, "<init>", "()V", signature, exceptions);
         mv.visitCode();
@@ -135,7 +241,15 @@
         mv.visitMaxs(0, 0);
         mv.visitEnd();
     }
-    
+
+    /**
+     * Create a constructor to call the manipulated constructor.
+     * This constructor has one argument (the bundle context). It will call the manipulated
+     * constructor with a null instance manager.
+     * @param access : access flag
+     * @param signature : method signature
+     * @param exceptions : declared exception
+     */
     private void generateBCConstructor(int access, String signature, String[] exceptions) {
         MethodVisitor mv = cv.visitMethod(access, "<init>", "(Lorg/osgi/framework/BundleContext;)V", signature, exceptions);
         mv.visitCode();
@@ -149,122 +263,163 @@
         mv.visitMaxs(0, 0);
         mv.visitEnd();
     }
-    
+
+    /**
+     * Generate the method header of a POJO method.
+     * This method header encapsulate the POJO method call to
+     * signal entry exit and error to the container.
+     * @param access : access flag.
+     * @param name : method name.
+     * @param desc : method descriptor.
+     * @param signature : method signature.
+     * @param exceptions : declared exceptions.
+     */
     private void generateMethodHeader(int access, String name, String desc, String signature, String[] exceptions) {
         MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
         mv.visitCode();
         Type returnType = Type.getReturnType(desc);
         Type[] args = Type.getArgumentTypes(desc);
+
+        // Compute result and exception stack location
         int result = -1;
-        int exception = args.length + 1 ;
-        
-        if(returnType.getSort() != Type.VOID) {
-            result = args.length + 1;
-            exception = args.length + 2;
+        int exception = -1;
+
+        int argLength = 0;
+        for (int i = 0; i < args.length; i++) {
+            argLength += args[i].getSize(); // Use getSize to shift in case of J, F and D.
+        }
+
+        if (returnType.getSort() != Type.VOID) {
+            // The method returns something 
+            result = argLength + 1; //  The result will to be store after the arguments 
+            exception = argLength + returnType.getSize() + 1; // The exception (if occurs) will be stored after the arguments and the result.
+        } else {
+            exception = argLength + 1;  //  The exception will be stored after the arguments
         }
 
         Label l0 = new Label();
         Label l1 = new Label();
         Label l2 = new Label();
-        
+
         mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
-        
+
         mv.visitVarInsn(ALOAD, 0);
         mv.visitFieldInsn(GETFIELD, m_owner, generateMethodFlag(name, desc), "Z");
         mv.visitJumpInsn(IFNE, l0);
 
         mv.visitVarInsn(ALOAD, 0);
-        for(int i = 0; i < args.length; i++) {
-            mv.visitVarInsn(args[i].getOpcode(ILOAD), i+1);
+        // Put every arguments on stack.
+        int j = 1;
+        for (int i = 0; i < args.length; i++) {
+            mv.visitVarInsn(args[i].getOpcode(ILOAD), j);
+            j += args[i].getSize();
         }
-        mv.visitMethodInsn(INVOKESPECIAL, m_owner, PREFIX+name, desc);
+        mv.visitMethodInsn(INVOKESPECIAL, m_owner, PREFIX + name, desc);
         mv.visitInsn(returnType.getOpcode(IRETURN));
-        
+
         mv.visitLabel(l0);
-        
+
         mv.visitVarInsn(ALOAD, 0);
         mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
         mv.visitVarInsn(ALOAD, 0);
         mv.visitLdcInsn(generateMethodId(name, desc));
         mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", ENTRY, "(Ljava/lang/Object;Ljava/lang/String;)V");
-        
+
         mv.visitVarInsn(ALOAD, 0);
-        for(int i = 0; i < args.length; i++) {
-            mv.visitVarInsn(args[i].getOpcode(ILOAD), i+1);
+        // Put every arguments on stack.
+        j = 1;
+        for (int i = 0; i < args.length; i++) {
+            mv.visitVarInsn(args[i].getOpcode(ILOAD), j);
+            j += args[i].getSize();
         }
-        mv.visitMethodInsn(INVOKESPECIAL, m_owner, PREFIX+name, desc);
-        
-        
-        if(returnType.getSort() != Type.VOID) {
+        mv.visitMethodInsn(INVOKESPECIAL, m_owner, PREFIX + name, desc);
+
+        if (returnType.getSort() != Type.VOID) {
             mv.visitVarInsn(returnType.getOpcode(ISTORE), result);
         }
-        
-            mv.visitVarInsn(ALOAD, 0);
-            mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
-            mv.visitVarInsn(ALOAD, 0);
-            mv.visitLdcInsn(generateMethodId(name, desc));
-            if(returnType.getSort() != Type.VOID) {
-                GeneratorAdapter gen = new GeneratorAdapter(mv,access, name, desc);
-                mv.visitVarInsn(returnType.getOpcode(ILOAD), result);
-                gen.box(returnType);
-            } else {
-                mv.visitInsn(ACONST_NULL);
-            }
-            mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", EXIT, "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V");
-            
-            mv.visitLabel(l1);
-            Label l7 = new Label();
-            mv.visitJumpInsn(GOTO, l7);
-            mv.visitLabel(l2);
-            
-            mv.visitVarInsn(ASTORE, exception);
-            mv.visitVarInsn(ALOAD, 0);
-            mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
-            mv.visitVarInsn(ALOAD, 0);
-            mv.visitLdcInsn(generateMethodId(name, desc));
-            mv.visitVarInsn(ALOAD, exception);
-            mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", ERROR, "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Throwable;)V");
-            mv.visitVarInsn(ALOAD, exception);
-            mv.visitInsn(ATHROW);
-        
+
+        mv.visitVarInsn(ALOAD, 0);
+        mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+        mv.visitVarInsn(ALOAD, 0);
+        mv.visitLdcInsn(generateMethodId(name, desc));
+        if (returnType.getSort() != Type.VOID) {
+            GeneratorAdapter gen = new GeneratorAdapter(mv, access, name, desc);
+            mv.visitVarInsn(returnType.getOpcode(ILOAD), result);
+            gen.box(returnType);
+        } else {
+            mv.visitInsn(ACONST_NULL);
+        }
+        mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", EXIT, "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V");
+
+        mv.visitLabel(l1);
+        Label l7 = new Label();
+        mv.visitJumpInsn(GOTO, l7);
+        mv.visitLabel(l2);
+
+        mv.visitVarInsn(ASTORE, exception);
+        mv.visitVarInsn(ALOAD, 0);
+        mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+        mv.visitVarInsn(ALOAD, 0);
+        mv.visitLdcInsn(generateMethodId(name, desc));
+        mv.visitVarInsn(ALOAD, exception);
+        mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", ERROR, "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Throwable;)V");
+        mv.visitVarInsn(ALOAD, exception);
+        mv.visitInsn(ATHROW);
+
         mv.visitLabel(l7);
-        if(returnType.getSort() != Type.VOID) {
+        if (returnType.getSort() != Type.VOID) {
             mv.visitVarInsn(returnType.getOpcode(ILOAD), result);
         }
         mv.visitInsn(returnType.getOpcode(IRETURN));
-        
+
         mv.visitMaxs(0, 0);
         mv.visitEnd();
     }
 
+    /**
+     * Generate a method flag name.
+     * @param name : method name.
+     * @param desc : method descriptor.
+     * @return the method flag name.
+     */
     private String generateMethodFlag(String name, String desc) {
-       return METHOD_FLAG_PREFIX + generateMethodId(name, desc);
+        return METHOD_FLAG_PREFIX + generateMethodId(name, desc);
     }
-    
+
+    /**
+     * Generate the method id based on the given method name and method descriptor.
+     * The method Id is unique for this method and serves to create the flag field (so
+     * must follow field name Java restrictions).
+     * @param name : method name
+     * @param desc : method descriptor
+     * @return  method ID
+     */
     private String generateMethodId(String name, String desc) {
-       String id = name;
-       Type[] args = Type.getArgumentTypes(desc);
-       for (int i =0; i < args.length; i++) {
-           String arg = args[i].getClassName();
-           if (arg.endsWith("[]")) {
-               arg = arg.substring(0, arg.length() - 2);
-               id+= "$" + arg.replace('.', '_') + "__";
-           } else {
-               id+= "$" + arg.replace('.', '_');
-           }
-       }
-       if (! m_methods.contains(id)) { m_methods.add(id); }
-       return id;
+        String id = name;
+        Type[] args = Type.getArgumentTypes(desc);
+        for (int i = 0; i < args.length; i++) {
+            String arg = args[i].getClassName();
+            if (arg.endsWith("[]")) {
+                arg = arg.substring(0, arg.length() - 2);
+                id += "$" + arg.replace('.', '_') + "__";
+            } else {
+                id += "$" + arg.replace('.', '_');
+            }
+        }
+        if (!m_methods.contains(id)) {
+            m_methods.add(id);
+        }
+        return id;
     }
-    
+
     /**
      * Add the instance manager field (__im).
      */
-    private void addCMField() {
+    private void addIMField() {
         FieldVisitor fv = super.visitField(ACC_PRIVATE, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;", null, null);
         fv.visitEnd();
     }
-    
+
     /**
      * Add the POJO interface to the visited class.
      * @param version : class version
@@ -302,7 +457,7 @@
 
         cv.visit(version, access, name, signature, superName, itfs);
     }
-    
+
     /**
      * Visit end.
      * Create helper methods.
@@ -319,21 +474,21 @@
 
         cv.visitEnd();
     }
-    
+
     /**
      * Create the setter method for the __cm field.
      */
     private void createSetInstanceManagerMethod() {
         MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "_setInstanceManager", "(Lorg/apache/felix/ipojo/InstanceManager;)V", null, null);
         mv.visitCode();
-        
+
         // If the given instance manager is null, just returns.
         mv.visitVarInsn(ALOAD, 1);
         Label l1 = new Label();
         mv.visitJumpInsn(IFNONNULL, l1);
         mv.visitInsn(RETURN);
         mv.visitLabel(l1);
-        
+
         mv.visitVarInsn(ALOAD, 0);
         mv.visitVarInsn(ALOAD, 1);
         mv.visitFieldInsn(PUTFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
@@ -360,19 +515,19 @@
             mv.visitLabel(l3);
         }
         mv.visitLabel(endif);
-        
+
         mv.visitVarInsn(ALOAD, 0);
         mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
         mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getRegistredMethods", "()Ljava/util/Set;");
         mv.visitVarInsn(ASTORE, 2);
-        
+
         mv.visitVarInsn(ALOAD, 2);
         Label endif2 = new Label();
         mv.visitJumpInsn(IFNULL, endif2);
 
         for (int i = 0; i < m_methods.size(); i++) {
             String methodId = (String) m_methods.get(i);
-            if(! methodId.equals("<init>")) {
+            if (!methodId.equals("<init>")) {
                 mv.visitVarInsn(ALOAD, 2);
                 mv.visitLdcInsn(methodId);
                 mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "contains", "(Ljava/lang/Object;)Z");
@@ -384,7 +539,7 @@
                 mv.visitLabel(l3);
             }
         }
-        
+
         mv.visitLabel(endif2);
 
         mv.visitInsn(RETURN);
@@ -405,7 +560,7 @@
         mv.visitMaxs(0, 0);
         mv.visitEnd();
     }
-    
+
     /**
      * Create a getter method for an array.
      * @param name : field name
@@ -415,11 +570,10 @@
     private void createArraySetter(String name, String desc, Type type) {
         MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "__set" + name, desc, null, null);
         mv.visitCode();
-        
+
         String internalType = desc.substring(1);
         internalType = internalType.substring(0, internalType.length() - 2);
 
-        
         Label l1 = new Label();
         mv.visitLabel(l1);
         mv.visitVarInsn(ALOAD, 0);
@@ -457,7 +611,7 @@
         String methodName = "__get" + name;
         MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, methodName, desc, null, null);
         mv.visitCode();
-        
+
         String internalType = desc.substring(2);
 
         mv.visitVarInsn(ALOAD, 0);
@@ -492,7 +646,7 @@
         String methodName = "__get" + name;
         MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, methodName, desc, null, null);
         mv.visitCode();
-        
+
         switch (type.getSort()) {
             case Type.BOOLEAN:
             case Type.CHAR:
@@ -672,7 +826,7 @@
     private void createSimpleSetter(String name, String desc, Type type) {
         MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "__set" + name, desc, null, null);
         mv.visitCode();
-        
+
         switch (type.getSort()) {
             case Type.BOOLEAN:
             case Type.CHAR:
@@ -690,7 +844,7 @@
                 mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
                 Label l22 = new Label();
                 mv.visitJumpInsn(IFNE, l22);
-                
+
                 mv.visitVarInsn(ALOAD, 0);
                 mv.visitVarInsn(type.getOpcode(ILOAD), 1);
                 mv.visitFieldInsn(PUTFIELD, m_owner, name, internalName);
@@ -729,7 +883,7 @@
                 mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
                 Label l23 = new Label();
                 mv.visitJumpInsn(IFNE, l23);
-           
+
                 mv.visitVarInsn(ALOAD, 0);
                 mv.visitVarInsn(type.getOpcode(ILOAD), 1);
                 mv.visitFieldInsn(PUTFIELD, m_owner, name, internalName);
@@ -761,7 +915,7 @@
                 mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
                 Label l24 = new Label();
                 mv.visitJumpInsn(IFNE, l24);
-           
+
                 mv.visitVarInsn(ALOAD, 0);
                 mv.visitVarInsn(ALOAD, 1);
                 mv.visitFieldInsn(PUTFIELD, m_owner, name, "L" + type.getInternalName() + ";");
@@ -785,6 +939,5 @@
         mv.visitMaxs(0, 0);
         mv.visitEnd();
     }
-
 
 }