Home | History | Annotate | Download | only in stubber
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.mkstubs.stubber;
     18 
     19 import org.objectweb.asm.AnnotationVisitor;
     20 import org.objectweb.asm.Attribute;
     21 import org.objectweb.asm.Label;
     22 import org.objectweb.asm.MethodVisitor;
     23 import org.objectweb.asm.Opcodes;
     24 
     25 /**
     26  * A method visitor that generates a code stub for the visited method.
     27  * <p/>
     28  * Annotations and parameters are passed as-is.
     29  * All other code is replaced by the following:
     30  * <pre>throw new RuntimeException("stub");</pre>
     31  * Note that constructors rewritten this way will probably fail with the runtime bytecode
     32  * verifier since no call to <code>super</code> is generated.
     33  */
     34 public class MethodStubber extends MethodVisitor {
     35 
     36     public MethodStubber(MethodVisitor mw,
     37             int access, String name, String desc, String signature, String[] exceptions) {
     38         super(Opcodes.ASM4, mw);
     39     }
     40 
     41     @Override
     42     public void visitCode() {
     43         Label l0 = new Label();
     44         mv.visitLabel(l0);
     45         mv.visitLineNumber(36, l0);
     46         mv.visitTypeInsn(Opcodes.NEW, "java/lang/RuntimeException");
     47         mv.visitInsn(Opcodes.DUP);
     48         mv.visitLdcInsn("stub");
     49         mv.visitMethodInsn(
     50                 Opcodes.INVOKESPECIAL,          // opcode
     51                 "java/lang/RuntimeException",   // owner
     52                 "<init>",                       // name
     53                 "(Ljava/lang/String;)V");       // desc
     54         mv.visitInsn(Opcodes.ATHROW);
     55         Label l1 = new Label();
     56         mv.visitLabel(l1);
     57         mv.visitLocalVariable(
     58                 "this",                                         // name
     59                 "Lcom/android/mkstubs/stubber/MethodStubber;",  // desc
     60                 null,                                           // signature
     61                 l0,                                             // label start
     62                 l1,                                             // label end
     63                 0);                                             // index
     64         mv.visitMaxs(3, 1); // maxStack, maxLocals
     65     }
     66 
     67     @Override
     68     public void visitEnd() {
     69         super.visitEnd();
     70     }
     71 
     72     @Override
     73     public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
     74         return super.visitAnnotation(desc, visible);
     75     }
     76 
     77     @Override
     78     public AnnotationVisitor visitAnnotationDefault() {
     79         return super.visitAnnotationDefault();
     80     }
     81 
     82     @Override
     83     public void visitAttribute(Attribute attr) {
     84         super.visitAttribute(attr);
     85     }
     86 
     87     @Override
     88     public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
     89         return super.visitParameterAnnotation(parameter, desc, visible);
     90     }
     91 
     92     // -- stuff that gets skipped
     93 
     94     @Override
     95     public void visitFieldInsn(int opcode, String owner, String name, String desc) {
     96         // skip
     97     }
     98 
     99     @Override
    100     public void visitFrame(int type, int local, Object[] local2, int stack, Object[] stack2) {
    101         // skip
    102     }
    103 
    104     @Override
    105     public void visitIincInsn(int var, int increment) {
    106         // skip
    107     }
    108 
    109     @Override
    110     public void visitInsn(int opcode) {
    111         // skip
    112     }
    113 
    114     @Override
    115     public void visitIntInsn(int opcode, int operand) {
    116         // skip
    117     }
    118 
    119     @Override
    120     public void visitJumpInsn(int opcode, Label label) {
    121         // skip
    122     }
    123 
    124     @Override
    125     public void visitLabel(Label label) {
    126         // skip
    127     }
    128 
    129     @Override
    130     public void visitLdcInsn(Object cst) {
    131         // skip
    132     }
    133 
    134     @Override
    135     public void visitLineNumber(int line, Label start) {
    136         // skip
    137     }
    138 
    139     @Override
    140     public void visitLocalVariable(String name, String desc, String signature,
    141             Label start, Label end, int index) {
    142         // skip
    143     }
    144 
    145     @Override
    146     public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
    147         // skip
    148     }
    149 
    150     @Override
    151     public void visitMaxs(int maxStack, int maxLocals) {
    152         // skip
    153     }
    154 
    155     @Override
    156     public void visitMethodInsn(int opcode, String owner, String name, String desc) {
    157         // skip
    158     }
    159 
    160     @Override
    161     public void visitMultiANewArrayInsn(String desc, int dims) {
    162         // skip
    163     }
    164 
    165     @Override
    166     public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels) {
    167         // skip
    168     }
    169 
    170     @Override
    171     public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
    172         // skip
    173     }
    174 
    175     @Override
    176     public void visitTypeInsn(int opcode, String type) {
    177         // skip
    178     }
    179 
    180     @Override
    181     public void visitVarInsn(int opcode, int var) {
    182         // skip
    183     }
    184 }
    185