Update mkstubs from ASM 3.1 to ASM 4.0

Change-Id: If43fcdba7070af8ae3d72e7e30a1dcbe11a217ec
diff --git a/tools/mkstubs/.classpath b/tools/mkstubs/.classpath
index 49a6d6c..1b7d34b 100644
--- a/tools/mkstubs/.classpath
+++ b/tools/mkstubs/.classpath
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<classpath>

-	<classpathentry kind="src" path="src"/>

-	<classpathentry kind="src" path="tests"/>

-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>

-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>

-	<classpathentry kind="var" path="ANDROID_SRC/prebuilt/common/asm/asm-3.1.jar"/>

-	<classpathentry kind="output" path="bin"/>

-</classpath>

+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="tests"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="var" path="ANDROID_SRC/prebuilt/common/asm/asm-4.0.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tools/mkstubs/Android.mk b/tools/mkstubs/Android.mk
index a12bf18..3e46a1d 100644
--- a/tools/mkstubs/Android.mk
+++ b/tools/mkstubs/Android.mk
@@ -20,7 +20,7 @@
 
 LOCAL_JAR_MANIFEST := manifest.txt
 LOCAL_STATIC_JAVA_LIBRARIES := \
-	asm-3.1
+	asm-4.0
 
 LOCAL_MODULE := mkstubs
 
diff --git a/tools/mkstubs/src/com/android/mkstubs/FilterClassAdapter.java b/tools/mkstubs/src/com/android/mkstubs/FilterClassAdapter.java
index 6f570c7..e875f10 100644
--- a/tools/mkstubs/src/com/android/mkstubs/FilterClassAdapter.java
+++ b/tools/mkstubs/src/com/android/mkstubs/FilterClassAdapter.java
@@ -20,7 +20,6 @@
 
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassAdapter;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.FieldVisitor;
 import org.objectweb.asm.MethodVisitor;
@@ -30,14 +29,14 @@
  * A class visitor that filters out all members (fields, methods and inner classes) that are
  * either private, default-access or rejected by the {@link Filter}.
  */
-class FilterClassAdapter extends ClassAdapter {
+class FilterClassAdapter extends ClassVisitor {
 
     private final Logger mLog;
     private final Filter mFilter;
     private String mClassName;
 
     public FilterClassAdapter(ClassVisitor writer, Filter filter, Logger log) {
-        super(writer);
+        super(Opcodes.ASM4, writer);
         mFilter = filter;
         mLog = log;
     }
diff --git a/tools/mkstubs/src/com/android/mkstubs/sourcer/AnnotationSourcer.java b/tools/mkstubs/src/com/android/mkstubs/sourcer/AnnotationSourcer.java
index d2843a8..ea3ca67 100644
--- a/tools/mkstubs/src/com/android/mkstubs/sourcer/AnnotationSourcer.java
+++ b/tools/mkstubs/src/com/android/mkstubs/sourcer/AnnotationSourcer.java
@@ -17,11 +17,12 @@
 package com.android.mkstubs.sourcer;
 
 import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Opcodes;
 
 /**
  * An annotation visitor that generates Java source for an annotation.
  */
-class AnnotationSourcer implements AnnotationVisitor {
+class AnnotationSourcer extends AnnotationVisitor {
 
     private final String mOpenChar;
     private final String mCloseChar;
@@ -33,11 +34,13 @@
     }
 
     public AnnotationSourcer(Output output, boolean isArray) {
+        super(Opcodes.ASM4);
         mOutput = output;
         mOpenChar = isArray ? "[" : "(";
         mCloseChar = isArray ? "]" : ")";
     }
 
+    @Override
     public void visit(String name, Object value) {
         startOpen();
 
@@ -56,6 +59,7 @@
         }
     }
 
+    @Override
     public void visitEnd() {
         if (mNeedClose) {
             mOutput.write(mCloseChar);
@@ -63,18 +67,21 @@
         mOutput.write("\n");
     }
 
+    @Override
     public AnnotationVisitor visitAnnotation(String name, String desc) {
         startOpen();
-        
+
         mOutput.write("@%s", name);
         return this;
     }
 
+    @Override
     public AnnotationVisitor visitArray(String name) {
         startOpen();
         return new AnnotationSourcer(mOutput, true /*isArray*/);
     }
 
+    @Override
     public void visitEnum(String name, String desc, String value) {
         mOutput.write("/* annotation enum not supported: %s */\n", name);
     }
diff --git a/tools/mkstubs/src/com/android/mkstubs/sourcer/ClassSourcer.java b/tools/mkstubs/src/com/android/mkstubs/sourcer/ClassSourcer.java
index 3d95039..c005b0c 100644
--- a/tools/mkstubs/src/com/android/mkstubs/sourcer/ClassSourcer.java
+++ b/tools/mkstubs/src/com/android/mkstubs/sourcer/ClassSourcer.java
@@ -27,23 +27,25 @@
 /**
  * A class visitor that writes a java source.
  */
-public class ClassSourcer implements ClassVisitor {
+public class ClassSourcer extends ClassVisitor {
 
     private final Output mOutput;
     private final AccessSourcer mAccessSourcer;
     private String mClassName;
 
     public ClassSourcer(Output output) {
+        super(Opcodes.ASM4);
         mOutput = output;
         mAccessSourcer = new AccessSourcer(mOutput);
     }
-    
+
     /* Examples:
      * name = com/foo/MyClass
      * signature = null (if not generic)
      * superName = java/lang/Object
      * interfaces = [ java/lang/Runnable ... ]
      */
+    @Override
     public void visit(int version, int access, String name, String signature,
             String superName, String[] interfaces) {
 
@@ -63,13 +65,13 @@
             SignatureReader sigReader = new SignatureReader(signature);
             SignatureSourcer sigSourcer = new SignatureSourcer();
             sigReader.accept(sigSourcer);
-            
+
             if (sigSourcer.hasFormalsContent()) {
                 mOutput.write(sigSourcer.formalsToString());
             }
 
             mOutput.write(" extends %s", sigSourcer.getSuperClass().toString());
-            
+
         } else {
             // write non-generic super type
             mOutput.write(" extends %s", superName.replace('/', '.'));
@@ -87,35 +89,40 @@
                 need_sep = true;
             }
         }
-        
+
         // open class body
         mOutput.write(" {\n");
     }
 
+    @Override
     public void visitEnd() {
         mOutput.write("}\n");
     }
 
+    @Override
     public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
         mOutput.write("@%s", desc);
         return new AnnotationSourcer(mOutput);
     }
 
+    @Override
     public void visitAttribute(Attribute attr) {
         mOutput.write("%s /* non-standard class attribute */ ", attr.type);
     }
 
 
+    @Override
     public FieldVisitor visitField(int access, String name, String desc, String signature,
             Object value) {
         // skip synthetic fields
         if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
             return null;
         }
-        
+
         return new FieldSourcer(mOutput, access, name, desc, signature);
     }
 
+    @Override
     public MethodVisitor visitMethod(int access, String name, String desc, String signature,
             String[] exceptions) {
 
@@ -123,15 +130,18 @@
         return new MethodSourcer(mOutput, mClassName, access, name, desc, signature, exceptions);
     }
 
+    @Override
     public void visitInnerClass(String name, String outerName, String innerName, int access) {
         // Skip inner classes. This just indicates there's an inner class definition but
         // they are visited at the top level as separate classes.
     }
 
+    @Override
     public void visitOuterClass(String owner, String name, String desc) {
         // Skip outer classes.
     }
 
+    @Override
     public void visitSource(String source, String debug) {
         // Skip source information.
     }
diff --git a/tools/mkstubs/src/com/android/mkstubs/sourcer/FieldSourcer.java b/tools/mkstubs/src/com/android/mkstubs/sourcer/FieldSourcer.java
index 7f30a24..68eae71 100644
--- a/tools/mkstubs/src/com/android/mkstubs/sourcer/FieldSourcer.java
+++ b/tools/mkstubs/src/com/android/mkstubs/sourcer/FieldSourcer.java
@@ -19,13 +19,14 @@
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Attribute;
 import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 import org.objectweb.asm.signature.SignatureReader;
 
 /**
- * A field visitor that generates Java source defining a field. 
+ * A field visitor that generates Java source defining a field.
  */
-class FieldSourcer implements FieldVisitor {
+class FieldSourcer extends FieldVisitor {
 
     private final Output mOutput;
     private final int mAccess;
@@ -34,6 +35,7 @@
     private final String mSignature;
 
     public FieldSourcer(Output output, int access, String name, String desc, String signature) {
+        super(Opcodes.ASM4);
         mOutput = output;
         mAccess = access;
         mName = name;
@@ -41,21 +43,24 @@
         mSignature = signature;
     }
 
+    @Override
     public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
         mOutput.write("@%s", desc);
         return new AnnotationSourcer(mOutput);
     }
 
+    @Override
     public void visitAttribute(Attribute attr) {
         mOutput.write("%s /* non-standard attribute */ ", attr.type);
     }
 
+    @Override
     public void visitEnd() {
         // Need to write type and field name after the annotations and attributes.
 
         AccessSourcer as = new AccessSourcer(mOutput);
         as.write(mAccess, AccessSourcer.IS_FIELD);
-        
+
         if (mSignature == null) {
             mOutput.write(" %s", Type.getType(mDesc).getClassName());
         } else {
diff --git a/tools/mkstubs/src/com/android/mkstubs/sourcer/MethodSourcer.java b/tools/mkstubs/src/com/android/mkstubs/sourcer/MethodSourcer.java
index f58de32..26e8870 100644
--- a/tools/mkstubs/src/com/android/mkstubs/sourcer/MethodSourcer.java
+++ b/tools/mkstubs/src/com/android/mkstubs/sourcer/MethodSourcer.java
@@ -20,15 +20,16 @@
 import org.objectweb.asm.Attribute;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 import org.objectweb.asm.signature.SignatureReader;
 
 import java.util.ArrayList;
 
 /**
- * A method visitor that generates the Java source for a whole method. 
+ * A method visitor that generates the Java source for a whole method.
  */
-class MethodSourcer implements MethodVisitor {
+class MethodSourcer extends MethodVisitor {
 
     private final Output mOutput;
     private final int mAccess;
@@ -42,6 +43,7 @@
 
     public MethodSourcer(Output output, String className, int access, String name,
             String desc, String signature, String[] exceptions) {
+        super(Opcodes.ASM4);
         mOutput = output;
         mClassName = className;
         mAccess = access;
@@ -49,16 +51,16 @@
         mDesc = desc;
         mSignature = signature;
         mExceptions = exceptions;
-        
+
         mNeedDeclaration = true;
         mIsConstructor = "<init>".equals(name);
     }
-    
-    private void writeHeader() {        
+
+    private void writeHeader() {
         if (!mNeedDeclaration) {
             return;
         }
-        
+
         AccessSourcer as = new AccessSourcer(mOutput);
         as.write(mAccess, AccessSourcer.IS_METHOD);
 
@@ -68,19 +70,19 @@
             SignatureReader sigReader = new SignatureReader(mSignature);
             sigSourcer = new SignatureSourcer();
             sigReader.accept(sigSourcer);
-            
+
             if (sigSourcer.hasFormalsContent()) {
                 // dump formal template parameter definitions
                 mOutput.write(" %s", sigSourcer.formalsToString());
             }
         }
-        
+
         // output return type (constructor have no return type)
         if (!mIsConstructor) {
             // The signature overrides desc, if present
             if (sigSourcer == null || sigSourcer.getReturnType() == null) {
                 mOutput.write(" %s", Type.getReturnType(mDesc).getClassName());
-                
+
             } else {
                 mOutput.write(" %s", sigSourcer.getReturnType().toString());
             }
@@ -88,11 +90,11 @@
 
         // output name
         mOutput.write(" %s(", mIsConstructor ? mClassName : mName);
-            
+
         // output arguments. The signature overrides desc, if present
         if (mSignature == null) {
             Type[] types = Type.getArgumentTypes(mDesc);
-            
+
             for(int i = 0; i < types.length; i++) {
                 if (i > 0) {
                     mOutput.write(", ");
@@ -101,7 +103,7 @@
             }
         } else {
             ArrayList<SignatureSourcer> params = sigSourcer.getParameters();
-            
+
             for(int i = 0; i < params.size(); i++) {
                 if (i > 0) {
                     mOutput.write(", ");
@@ -114,7 +116,7 @@
         // output throwable exceptions
         if (mExceptions != null && mExceptions.length > 0) {
             mOutput.write(" throws ");
-            
+
             for (int i = 0; i < mExceptions.length; i++) {
                 if (i > 0) {
                     mOutput.write(", ");
@@ -128,106 +130,130 @@
         mNeedDeclaration = false;
     }
 
+    @Override
     public void visitCode() {
         writeHeader();
-        
+
         // write the stub itself
         mOutput.write("throw new RuntimeException(\"Stub\");");
     }
 
+    @Override
     public void visitEnd() {
         writeHeader();
         mOutput.write("\n}\n");
     }
 
+    @Override
     public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
         mOutput.write("@%s", desc);
         return new AnnotationSourcer(mOutput);
     }
 
+    @Override
     public AnnotationVisitor visitAnnotationDefault() {
         // pass
         return null;
     }
 
+    @Override
     public void visitAttribute(Attribute attr) {
         mOutput.write("%s /* non-standard method attribute */ ", attr.type);
     }
 
+    @Override
     public void visitFieldInsn(int opcode, String owner, String name, String desc) {
         // pass
     }
 
+    @Override
     public void visitFrame(int type, int local, Object[] local2, int stack, Object[] stack2) {
         // pass
     }
 
+    @Override
     public void visitIincInsn(int var, int increment) {
         // pass
     }
 
+    @Override
     public void visitInsn(int opcode) {
         // pass
     }
 
+    @Override
     public void visitIntInsn(int opcode, int operand) {
         // pass
     }
 
+    @Override
     public void visitJumpInsn(int opcode, Label label) {
         // pass
     }
 
+    @Override
     public void visitLabel(Label label) {
         // pass
     }
 
+    @Override
     public void visitLdcInsn(Object cst) {
         // pass
     }
 
+    @Override
     public void visitLineNumber(int line, Label start) {
         // pass
     }
 
+    @Override
     public void visitLocalVariable(String name, String desc, String signature,
             Label start, Label end, int index) {
         // pass
     }
 
+    @Override
     public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
         // pass
     }
 
+    @Override
     public void visitMaxs(int maxStack, int maxLocals) {
         // pass
     }
 
+    @Override
     public void visitMethodInsn(int opcode, String owner, String name, String desc) {
         // pass
     }
 
+    @Override
     public void visitMultiANewArrayInsn(String desc, int dims) {
         // pass
     }
 
+    @Override
     public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
         // pass
         return null;
     }
 
+    @Override
     public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels) {
         // pass
     }
 
+    @Override
     public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
         // pass
     }
 
+    @Override
     public void visitTypeInsn(int opcode, String type) {
         // pass
     }
 
+    @Override
     public void visitVarInsn(int opcode, int var) {
         // pass
     }
diff --git a/tools/mkstubs/src/com/android/mkstubs/sourcer/SignatureSourcer.java b/tools/mkstubs/src/com/android/mkstubs/sourcer/SignatureSourcer.java
index 7805d7d..ab90945 100644
--- a/tools/mkstubs/src/com/android/mkstubs/sourcer/SignatureSourcer.java
+++ b/tools/mkstubs/src/com/android/mkstubs/sourcer/SignatureSourcer.java
@@ -16,6 +16,7 @@
 
 package com.android.mkstubs.sourcer;
 
+import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 import org.objectweb.asm.signature.SignatureReader;
 import org.objectweb.asm.signature.SignatureVisitor;
@@ -36,12 +37,12 @@
  * <p/>
  * Note: When processing a method's signature, the signature order is the reverse of the source
  * order, e.g. the signature is written as "(parameters)return-type" where we want to generate
- * "return-type method-name (parameters)". To hanlde this case, the return-type and parameters
+ * "return-type method-name (parameters)". To handle this case, the return-type and parameters
  * are <em>not</em> output directly but are instead accumulated in internal variables that you can
  * get later using {@link #getReturnType()}, {@link #getParameters()}, {@link #getSuperClass()}
  * and {@link #formalsToString()}.
  */
-class SignatureSourcer implements SignatureVisitor {
+class SignatureSourcer extends SignatureVisitor {
 
     /**
      * Buffer used to construct the signature.
@@ -85,13 +86,14 @@
     private ArrayList<SignatureSourcer> mParameters = new ArrayList<SignatureSourcer>();
 
 
-    
+
     /**
      * Constructs a new {@link SignatureWriter} object.
      */
     public SignatureSourcer() {
+        super(Opcodes.ASM4);
     }
-    
+
     private StringBuilder getBuf() {
         if (mWritingFormals) {
             return mFormalsBuf;
@@ -117,7 +119,7 @@
     public SignatureSourcer getReturnType() {
         return mReturnType;
     }
-    
+
     /**
      * Will be non-empty if a parameters were processed
      * by {@link SignatureReader#accept(SignatureVisitor)}
@@ -125,19 +127,19 @@
     public ArrayList<SignatureSourcer> getParameters() {
         return mParameters;
     }
-    
+
     /**
-     * True if the signature contains formal type parameters, which are available 
+     * True if the signature contains formal type parameters, which are available
      * via {@link #formalsToString()} after calling {@link SignatureReader#accept(SignatureVisitor)}
      */
     public boolean hasFormalsContent() {
         return mFormalsBuf.length() > 0;
     }
-    
+
     public String formalsToString() {
         return mFormalsBuf.toString();
     }
-    
+
     /**
      * Will be non-null if a super class was processed
      * by {@link SignatureReader#accept(SignatureVisitor)}
@@ -150,6 +152,7 @@
     // Implementation of the SignatureVisitor interface
     // ------------------------------------------------------------------------
 
+    @Override
     public void visitFormalTypeParameter(final String name) {
         if (!mWritingFormals) {
             mWritingFormals = true;
@@ -161,16 +164,19 @@
         getBuf().append(" extends ");
     }
 
+    @Override
     public SignatureVisitor visitClassBound() {
-        // we don't differentiate between visiting a sub class or interface type 
+        // we don't differentiate between visiting a sub class or interface type
         return this;
     }
 
+    @Override
     public SignatureVisitor visitInterfaceBound() {
-        // we don't differentiate between visiting a sub class or interface type 
+        // we don't differentiate between visiting a sub class or interface type
         return this;
     }
 
+    @Override
     public SignatureVisitor visitSuperclass() {
         endFormals();
         SignatureSourcer sourcer = new SignatureSourcer();
@@ -179,10 +185,12 @@
         return sourcer;
     }
 
+    @Override
     public SignatureVisitor visitInterface() {
         return this;
     }
 
+    @Override
     public SignatureVisitor visitParameterType() {
         endFormals();
         SignatureSourcer sourcer = new SignatureSourcer();
@@ -190,6 +198,7 @@
         return sourcer;
     }
 
+    @Override
     public SignatureVisitor visitReturnType() {
         endFormals();
         SignatureSourcer sourcer = new SignatureSourcer();
@@ -198,29 +207,35 @@
         return sourcer;
     }
 
+    @Override
     public SignatureVisitor visitExceptionType() {
         getBuf().append('^');
         return this;
     }
 
+    @Override
     public void visitBaseType(final char descriptor) {
         getBuf().append(Type.getType(Character.toString(descriptor)).getClassName());
     }
 
+    @Override
     public void visitTypeVariable(final String name) {
         getBuf().append(name.replace('/', '.'));
     }
 
+    @Override
     public SignatureVisitor visitArrayType() {
         getBuf().append('[');
         return this;
     }
 
+    @Override
     public void visitClassType(final String name) {
         getBuf().append(name.replace('/', '.'));
         mArgumentStack *= 2;
     }
 
+    @Override
     public void visitInnerClassType(final String name) {
         endArguments();
         getBuf().append('.');
@@ -228,6 +243,7 @@
         mArgumentStack *= 2;
     }
 
+    @Override
     public void visitTypeArgument() {
         if (mArgumentStack % 2 == 0) {
             ++mArgumentStack;
@@ -238,6 +254,7 @@
         getBuf().append('*');
     }
 
+    @Override
     public SignatureVisitor visitTypeArgument(final char wildcard) {
         if (mArgumentStack % 2 == 0) {
             ++mArgumentStack;
@@ -258,6 +275,7 @@
         return this;
     }
 
+    @Override
     public void visitEnd() {
         endArguments();
     }
diff --git a/tools/mkstubs/src/com/android/mkstubs/stubber/ClassStubber.java b/tools/mkstubs/src/com/android/mkstubs/stubber/ClassStubber.java
index 8f9ae11..f66c7a7 100644
--- a/tools/mkstubs/src/com/android/mkstubs/stubber/ClassStubber.java
+++ b/tools/mkstubs/src/com/android/mkstubs/stubber/ClassStubber.java
@@ -18,19 +18,19 @@
 
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassAdapter;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.FieldVisitor;
 import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
 
 /**
  * A class visitor that generates stubs for all methods of the visited class.
  * Everything else is passed as-is.
  */
-public class ClassStubber extends ClassAdapter {
+public class ClassStubber extends ClassVisitor {
 
     public ClassStubber(ClassVisitor cv) {
-        super(cv);
+        super(Opcodes.ASM4, cv);
     }
 
     @Override
@@ -41,45 +41,45 @@
             String[] interfaces) {
         super.visit(version, access, name, signature, superName, interfaces);
     }
-    
+
     @Override
     public void visitEnd() {
         super.visitEnd();
     }
-    
+
     @Override
     public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
         return super.visitAnnotation(desc, visible);
     }
-    
+
     @Override
     public void visitAttribute(Attribute attr) {
         super.visitAttribute(attr);
     }
-    
+
     @Override
     public MethodVisitor visitMethod(int access, String name, String desc, String signature,
             String[] exceptions) {
         MethodVisitor mw = super.visitMethod(access, name, desc, signature, exceptions);
         return new MethodStubber(mw, access, name, desc, signature, exceptions);
     }
-    
+
     @Override
     public FieldVisitor visitField(int access, String name, String desc, String signature,
             Object value) {
         return super.visitField(access, name, desc, signature, value);
     }
-    
+
     @Override
     public void visitInnerClass(String name, String outerName, String innerName, int access) {
         super.visitInnerClass(name, outerName, innerName, access);
     }
-    
+
     @Override
     public void visitOuterClass(String owner, String name, String desc) {
         super.visitOuterClass(owner, name, desc);
     }
-    
+
     @Override
     public void visitSource(String source, String debug) {
         super.visitSource(source, debug);
diff --git a/tools/mkstubs/src/com/android/mkstubs/stubber/MethodStubber.java b/tools/mkstubs/src/com/android/mkstubs/stubber/MethodStubber.java
index 1617809..89aa221 100644
--- a/tools/mkstubs/src/com/android/mkstubs/stubber/MethodStubber.java
+++ b/tools/mkstubs/src/com/android/mkstubs/stubber/MethodStubber.java
@@ -19,7 +19,6 @@
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Attribute;
 import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodAdapter;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 
@@ -32,13 +31,13 @@
  * Note that constructors rewritten this way will probably fail with the runtime bytecode
  * verifier since no call to <code>super</code> is generated.
  */
-public class MethodStubber extends MethodAdapter {
+public class MethodStubber extends MethodVisitor {
 
     public MethodStubber(MethodVisitor mw,
             int access, String name, String desc, String signature, String[] exceptions) {
-        super(mw);
+        super(Opcodes.ASM4, mw);
     }
-    
+
     @Override
     public void visitCode() {
         Label l0 = new Label();
@@ -64,7 +63,7 @@
                 0);                                             // index
         mv.visitMaxs(3, 1); // maxStack, maxLocals
     }
-    
+
     @Override
     public void visitEnd() {
         super.visitEnd();
@@ -74,110 +73,110 @@
     public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
         return super.visitAnnotation(desc, visible);
     }
-    
+
     @Override
     public AnnotationVisitor visitAnnotationDefault() {
         return super.visitAnnotationDefault();
     }
- 
+
     @Override
     public void visitAttribute(Attribute attr) {
         super.visitAttribute(attr);
     }
-    
+
     @Override
     public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
         return super.visitParameterAnnotation(parameter, desc, visible);
     }
 
     // -- stuff that gets skipped
-    
+
     @Override
     public void visitFieldInsn(int opcode, String owner, String name, String desc) {
         // skip
     }
-    
+
     @Override
     public void visitFrame(int type, int local, Object[] local2, int stack, Object[] stack2) {
         // skip
     }
-    
+
     @Override
     public void visitIincInsn(int var, int increment) {
         // skip
     }
-    
+
     @Override
     public void visitInsn(int opcode) {
         // skip
     }
-    
+
     @Override
     public void visitIntInsn(int opcode, int operand) {
         // skip
     }
-    
+
     @Override
     public void visitJumpInsn(int opcode, Label label) {
         // skip
     }
-    
+
     @Override
     public void visitLabel(Label label) {
         // skip
     }
-    
+
     @Override
     public void visitLdcInsn(Object cst) {
         // skip
     }
-    
+
     @Override
     public void visitLineNumber(int line, Label start) {
         // skip
     }
-    
+
     @Override
     public void visitLocalVariable(String name, String desc, String signature,
             Label start, Label end, int index) {
         // skip
     }
-    
+
     @Override
     public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
         // skip
     }
-    
+
     @Override
     public void visitMaxs(int maxStack, int maxLocals) {
         // skip
     }
-    
+
     @Override
     public void visitMethodInsn(int opcode, String owner, String name, String desc) {
         // skip
     }
-    
+
     @Override
     public void visitMultiANewArrayInsn(String desc, int dims) {
         // skip
     }
-    
+
     @Override
     public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels) {
         // skip
     }
-    
+
     @Override
     public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
         // skip
     }
-    
+
     @Override
     public void visitTypeInsn(int opcode, String type) {
         // skip
     }
-    
+
     @Override
     public void visitVarInsn(int opcode, int var) {
         // skip