javap/src/main/java/org/apidesign/javap/ClassData.java
branchmodel
changeset 878 ecbd252fd3a7
parent 877 3392f250c784
parent 871 6168fb585ab4
child 879 af170d42b5b3
     1.1 --- a/javap/src/main/java/org/apidesign/javap/ClassData.java	Fri Mar 22 16:59:47 2013 +0100
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,713 +0,0 @@
     1.4 -/*
     1.5 - * Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
     1.6 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.7 - *
     1.8 - * This code is free software; you can redistribute it and/or modify it
     1.9 - * under the terms of the GNU General Public License version 2 only, as
    1.10 - * published by the Free Software Foundation.  Oracle designates this
    1.11 - * particular file as subject to the "Classpath" exception as provided
    1.12 - * by Oracle in the LICENSE file that accompanied this code.
    1.13 - *
    1.14 - * This code is distributed in the hope that it will be useful, but WITHOUT
    1.15 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    1.16 - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    1.17 - * version 2 for more details (a copy is included in the LICENSE file that
    1.18 - * accompanied this code).
    1.19 - *
    1.20 - * You should have received a copy of the GNU General Public License version
    1.21 - * 2 along with this work; if not, write to the Free Software Foundation,
    1.22 - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    1.23 - *
    1.24 - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    1.25 - * or visit www.oracle.com if you need additional information or have any
    1.26 - * questions.
    1.27 - */
    1.28 -
    1.29 -
    1.30 -package org.apidesign.javap;
    1.31 -
    1.32 -import java.io.*;
    1.33 -
    1.34 -/**
    1.35 - * Central data repository of the Java Disassembler.
    1.36 - * Stores all the information in java class file.
    1.37 - *
    1.38 - * @author  Sucheta Dambalkar (Adopted code from jdis)
    1.39 - */
    1.40 -public final class ClassData implements RuntimeConstants {
    1.41 -
    1.42 -    private int magic;
    1.43 -    private int minor_version;
    1.44 -    private int major_version;
    1.45 -    private int cpool_count;
    1.46 -    private Object cpool[];
    1.47 -    private int access;
    1.48 -    private int this_class = 0;;
    1.49 -    private int super_class;
    1.50 -    private int interfaces_count;
    1.51 -    private int[] interfaces = new int[0];;
    1.52 -    private int fields_count;
    1.53 -    private FieldData[] fields;
    1.54 -    private int methods_count;
    1.55 -    private MethodData[] methods;
    1.56 -    private InnerClassData[] innerClasses;
    1.57 -    private int attributes_count;
    1.58 -    private AttrData[] attrs;
    1.59 -    private String classname;
    1.60 -    private String superclassname;
    1.61 -    private int source_cpx=0;
    1.62 -    private byte tags[];
    1.63 -    private Hashtable indexHashAscii = new Hashtable();
    1.64 -    private String pkgPrefix="";
    1.65 -    private int pkgPrefixLen=0;
    1.66 -
    1.67 -    /**
    1.68 -     * Read classfile to disassemble.
    1.69 -     */
    1.70 -    public ClassData(InputStream infile) throws IOException {
    1.71 -        this.read(new DataInputStream(infile));
    1.72 -    }
    1.73 -
    1.74 -    /**
    1.75 -     * Reads and stores class file information.
    1.76 -     */
    1.77 -    public void read(DataInputStream in) throws IOException {
    1.78 -        // Read the header
    1.79 -        magic = in.readInt();
    1.80 -        if (magic != JAVA_MAGIC) {
    1.81 -            throw new ClassFormatError("wrong magic: " +
    1.82 -                                       toHex(magic) + ", expected " +
    1.83 -                                       toHex(JAVA_MAGIC));
    1.84 -        }
    1.85 -        minor_version = in.readShort();
    1.86 -        major_version = in.readShort();
    1.87 -        if (major_version != JAVA_VERSION) {
    1.88 -        }
    1.89 -
    1.90 -        // Read the constant pool
    1.91 -        readCP(in);
    1.92 -        access = in.readUnsignedShort();
    1.93 -        this_class = in.readUnsignedShort();
    1.94 -        super_class = in.readUnsignedShort();
    1.95 -
    1.96 -        //Read interfaces.
    1.97 -        interfaces_count = in.readUnsignedShort();
    1.98 -        if(interfaces_count > 0){
    1.99 -            interfaces = new int[interfaces_count];
   1.100 -        }
   1.101 -        for (int i = 0; i < interfaces_count; i++) {
   1.102 -            interfaces[i]=in.readShort();
   1.103 -        }
   1.104 -
   1.105 -        // Read the fields
   1.106 -        readFields(in);
   1.107 -
   1.108 -        // Read the methods
   1.109 -        readMethods(in);
   1.110 -
   1.111 -        // Read the attributes
   1.112 -        attributes_count = in.readUnsignedShort();
   1.113 -        attrs=new AttrData[attributes_count];
   1.114 -        for (int k = 0; k < attributes_count; k++) {
   1.115 -            int name_cpx=in.readUnsignedShort();
   1.116 -            if (getTag(name_cpx)==CONSTANT_UTF8
   1.117 -                && getString(name_cpx).equals("SourceFile")
   1.118 -                ){      if (in.readInt()!=2)
   1.119 -                    throw new ClassFormatError("invalid attr length");
   1.120 -                source_cpx=in.readUnsignedShort();
   1.121 -                AttrData attr=new AttrData(this);
   1.122 -                attr.read(name_cpx);
   1.123 -                attrs[k]=attr;
   1.124 -
   1.125 -            } else if (getTag(name_cpx)==CONSTANT_UTF8
   1.126 -                       && getString(name_cpx).equals("InnerClasses")
   1.127 -                       ){       int length=in.readInt();
   1.128 -                       int num=in.readUnsignedShort();
   1.129 -                       if (2+num*8 != length)
   1.130 -                           throw new ClassFormatError("invalid attr length");
   1.131 -                       innerClasses=new InnerClassData[num];
   1.132 -                       for (int j = 0; j < num; j++) {
   1.133 -                           InnerClassData innerClass=new InnerClassData(this);
   1.134 -                           innerClass.read(in);
   1.135 -                           innerClasses[j]=innerClass;
   1.136 -                       }
   1.137 -                       AttrData attr=new AttrData(this);
   1.138 -                       attr.read(name_cpx);
   1.139 -                       attrs[k]=attr;
   1.140 -            } else {
   1.141 -                AttrData attr=new AttrData(this);
   1.142 -                attr.read(name_cpx, in);
   1.143 -                attrs[k]=attr;
   1.144 -            }
   1.145 -        }
   1.146 -        in.close();
   1.147 -    } // end ClassData.read()
   1.148 -
   1.149 -    /**
   1.150 -     * Reads and stores constant pool info.
   1.151 -     */
   1.152 -    void readCP(DataInputStream in) throws IOException {
   1.153 -        cpool_count = in.readUnsignedShort();
   1.154 -        tags = new byte[cpool_count];
   1.155 -        cpool = new Object[cpool_count];
   1.156 -        for (int i = 1; i < cpool_count; i++) {
   1.157 -            byte tag = in.readByte();
   1.158 -
   1.159 -            switch(tags[i] = tag) {
   1.160 -            case CONSTANT_UTF8:
   1.161 -                String str=in.readUTF();
   1.162 -                indexHashAscii.put(cpool[i] = str, new Integer(i));
   1.163 -                break;
   1.164 -            case CONSTANT_INTEGER:
   1.165 -                cpool[i] = new Integer(in.readInt());
   1.166 -                break;
   1.167 -            case CONSTANT_FLOAT:
   1.168 -                cpool[i] = new Float(in.readFloat());
   1.169 -                break;
   1.170 -            case CONSTANT_LONG:
   1.171 -                cpool[i++] = new Long(in.readLong());
   1.172 -                break;
   1.173 -            case CONSTANT_DOUBLE:
   1.174 -                cpool[i++] = new Double(in.readDouble());
   1.175 -                break;
   1.176 -            case CONSTANT_CLASS:
   1.177 -            case CONSTANT_STRING:
   1.178 -                cpool[i] = new CPX(in.readUnsignedShort());
   1.179 -                break;
   1.180 -
   1.181 -            case CONSTANT_FIELD:
   1.182 -            case CONSTANT_METHOD:
   1.183 -            case CONSTANT_INTERFACEMETHOD:
   1.184 -            case CONSTANT_NAMEANDTYPE:
   1.185 -                cpool[i] = new CPX2(in.readUnsignedShort(), in.readUnsignedShort());
   1.186 -                break;
   1.187 -
   1.188 -            case 0:
   1.189 -            default:
   1.190 -                throw new ClassFormatError("invalid constant type: " + (int)tags[i]);
   1.191 -            }
   1.192 -        }
   1.193 -    }
   1.194 -
   1.195 -    /**
   1.196 -     * Reads and strores field info.
   1.197 -     */
   1.198 -    protected void readFields(DataInputStream in) throws IOException {
   1.199 -        int fields_count = in.readUnsignedShort();
   1.200 -        fields=new FieldData[fields_count];
   1.201 -        for (int k = 0; k < fields_count; k++) {
   1.202 -            FieldData field=new FieldData(this);
   1.203 -            field.read(in);
   1.204 -            fields[k]=field;
   1.205 -        }
   1.206 -    }
   1.207 -
   1.208 -    /**
   1.209 -     * Reads and strores Method info.
   1.210 -     */
   1.211 -    protected void readMethods(DataInputStream in) throws IOException {
   1.212 -        int methods_count = in.readUnsignedShort();
   1.213 -        methods=new MethodData[methods_count];
   1.214 -        for (int k = 0; k < methods_count ; k++) {
   1.215 -            MethodData method=new MethodData(this);
   1.216 -            method.read(in);
   1.217 -            methods[k]=method;
   1.218 -        }
   1.219 -    }
   1.220 -
   1.221 -    /**
   1.222 -     * get a string
   1.223 -     */
   1.224 -    public String getString(int n) {
   1.225 -        if (n == 0) {
   1.226 -            return null; 
   1.227 -        } else {
   1.228 -            return (String)cpool[n];
   1.229 -        }
   1.230 -    }
   1.231 -
   1.232 -    /**
   1.233 -     * get the type of constant given an index
   1.234 -     */
   1.235 -    public byte getTag(int n) {
   1.236 -        try{
   1.237 -            return tags[n];
   1.238 -        } catch (ArrayIndexOutOfBoundsException e) {
   1.239 -            return (byte)100;
   1.240 -        }
   1.241 -    }
   1.242 -
   1.243 -    static final String hexString="0123456789ABCDEF";
   1.244 -
   1.245 -    public static char hexTable[]=hexString.toCharArray();
   1.246 -
   1.247 -    static String toHex(long val, int width) {
   1.248 -        StringBuffer s = new StringBuffer();
   1.249 -        for (int i=width-1; i>=0; i--)
   1.250 -            s.append(hexTable[((int)(val>>(4*i)))&0xF]);
   1.251 -        return "0x"+s.toString();
   1.252 -    }
   1.253 -
   1.254 -    static String toHex(long val) {
   1.255 -        int width;
   1.256 -        for (width=16; width>0; width--) {
   1.257 -            if ((val>>(width-1)*4)!=0) break;
   1.258 -        }
   1.259 -        return toHex(val, width);
   1.260 -    }
   1.261 -
   1.262 -    static String toHex(int val) {
   1.263 -        int width;
   1.264 -        for (width=8; width>0; width--) {
   1.265 -            if ((val>>(width-1)*4)!=0) break;
   1.266 -        }
   1.267 -        return toHex(val, width);
   1.268 -    }
   1.269 -
   1.270 -    /**
   1.271 -     * Returns the name of this class.
   1.272 -     */
   1.273 -    public String getClassName() {
   1.274 -        String res=null;
   1.275 -        if (this_class==0) {
   1.276 -            return res;
   1.277 -        }
   1.278 -        int tcpx;
   1.279 -        try {
   1.280 -            if (tags[this_class]!=CONSTANT_CLASS) {
   1.281 -                return res; //"<CP["+cpx+"] is not a Class> ";
   1.282 -            }
   1.283 -            tcpx=((CPX)cpool[this_class]).cpx;
   1.284 -        } catch (ArrayIndexOutOfBoundsException e) {
   1.285 -            return res; // "#"+cpx+"// invalid constant pool index";
   1.286 -        } catch (Throwable e) {
   1.287 -            return res; // "#"+cpx+"// ERROR IN DISASSEMBLER";
   1.288 -        }
   1.289 -
   1.290 -        try {
   1.291 -            return (String)(cpool[tcpx]);
   1.292 -        } catch (ArrayIndexOutOfBoundsException e) {
   1.293 -            return  res; // "class #"+scpx+"// invalid constant pool index";
   1.294 -        } catch (ClassCastException e) {
   1.295 -            return  res; // "class #"+scpx+"// invalid constant pool reference";
   1.296 -        } catch (Throwable e) {
   1.297 -            return res; // "#"+cpx+"// ERROR IN DISASSEMBLER";
   1.298 -        }
   1.299 -
   1.300 -    }
   1.301 -
   1.302 -    /**
   1.303 -     * Returns the name of class at perticular index.
   1.304 -     */
   1.305 -    public String getClassName(int cpx) {
   1.306 -        String res="#"+cpx;
   1.307 -        if (cpx==0) {
   1.308 -            return res;
   1.309 -        }
   1.310 -        int scpx;
   1.311 -        try {
   1.312 -            if (tags[cpx]!=CONSTANT_CLASS) {
   1.313 -                return res; //"<CP["+cpx+"] is not a Class> ";
   1.314 -            }
   1.315 -            scpx=((CPX)cpool[cpx]).cpx;
   1.316 -        } catch (ArrayIndexOutOfBoundsException e) {
   1.317 -            return res; // "#"+cpx+"// invalid constant pool index";
   1.318 -        } catch (Throwable e) {
   1.319 -            return res; // "#"+cpx+"// ERROR IN DISASSEMBLER";
   1.320 -        }
   1.321 -        res="#"+scpx;
   1.322 -        try {
   1.323 -            return (String)(cpool[scpx]);
   1.324 -        } catch (ArrayIndexOutOfBoundsException e) {
   1.325 -            return  res; // "class #"+scpx+"// invalid constant pool index";
   1.326 -        } catch (ClassCastException e) {
   1.327 -            return  res; // "class #"+scpx+"// invalid constant pool reference";
   1.328 -        } catch (Throwable e) {
   1.329 -            return res; // "#"+cpx+"// ERROR IN DISASSEMBLER";
   1.330 -        }
   1.331 -    }
   1.332 -    
   1.333 -    public int getAccessFlags() {
   1.334 -        return access;
   1.335 -    }
   1.336 -
   1.337 -    /**
   1.338 -     * Returns true if it is a class
   1.339 -     */
   1.340 -    public boolean isClass() {
   1.341 -        if((access & ACC_INTERFACE) == 0) return true;
   1.342 -        return false;
   1.343 -    }
   1.344 -
   1.345 -    /**
   1.346 -     * Returns true if it is a interface.
   1.347 -     */
   1.348 -    public boolean isInterface(){
   1.349 -        if((access & ACC_INTERFACE) != 0) return true;
   1.350 -        return false;
   1.351 -    }
   1.352 -
   1.353 -    /**
   1.354 -     * Returns true if this member is public, false otherwise.
   1.355 -     */
   1.356 -    public boolean isPublic(){
   1.357 -        return (access & ACC_PUBLIC) != 0;
   1.358 -    }
   1.359 -
   1.360 -    /**
   1.361 -     * Returns the access of this class or interface.
   1.362 -     */
   1.363 -    public String[] getAccess(){
   1.364 -        Vector v = new Vector();
   1.365 -        if ((access & ACC_PUBLIC)   !=0) v.addElement("public");
   1.366 -        if ((access & ACC_FINAL)    !=0) v.addElement("final");
   1.367 -        if ((access & ACC_ABSTRACT) !=0) v.addElement("abstract");
   1.368 -        String[] accflags = new String[v.size()];
   1.369 -        v.copyInto(accflags);
   1.370 -        return accflags;
   1.371 -    }
   1.372 -
   1.373 -    /**
   1.374 -     * Returns list of innerclasses.
   1.375 -     */
   1.376 -    public InnerClassData[] getInnerClasses(){
   1.377 -        return innerClasses;
   1.378 -    }
   1.379 -
   1.380 -    /**
   1.381 -     * Returns list of attributes.
   1.382 -     */
   1.383 -    final AttrData[] getAttributes(){
   1.384 -        return attrs;
   1.385 -    }
   1.386 -    
   1.387 -    public byte[] findAnnotationData(boolean classRetention) {
   1.388 -        String n = classRetention ?
   1.389 -            "RuntimeInvisibleAnnotations" : // NOI18N
   1.390 -            "RuntimeVisibleAnnotations"; // NOI18N
   1.391 -        return findAttr(n, attrs);
   1.392 -    }
   1.393 -
   1.394 -    /**
   1.395 -     * Returns true if superbit is set.
   1.396 -     */
   1.397 -    public boolean isSuperSet(){
   1.398 -        if ((access & ACC_SUPER)   !=0) return true;
   1.399 -        return false;
   1.400 -    }
   1.401 -
   1.402 -    /**
   1.403 -     * Returns super class name.
   1.404 -     */
   1.405 -    public String getSuperClassName(){
   1.406 -        String res=null;
   1.407 -        if (super_class==0) {
   1.408 -            return res;
   1.409 -        }
   1.410 -        int scpx;
   1.411 -        try {
   1.412 -            if (tags[super_class]!=CONSTANT_CLASS) {
   1.413 -                return res; //"<CP["+cpx+"] is not a Class> ";
   1.414 -            }
   1.415 -            scpx=((CPX)cpool[super_class]).cpx;
   1.416 -        } catch (ArrayIndexOutOfBoundsException e) {
   1.417 -            return res; // "#"+cpx+"// invalid constant pool index";
   1.418 -        } catch (Throwable e) {
   1.419 -            return res; // "#"+cpx+"// ERROR IN DISASSEMBLER";
   1.420 -        }
   1.421 -
   1.422 -        try {
   1.423 -            return (String)(cpool[scpx]);
   1.424 -        } catch (ArrayIndexOutOfBoundsException e) {
   1.425 -            return  res; // "class #"+scpx+"// invalid constant pool index";
   1.426 -        } catch (ClassCastException e) {
   1.427 -            return  res; // "class #"+scpx+"// invalid constant pool reference";
   1.428 -        } catch (Throwable e) {
   1.429 -            return res; // "#"+cpx+"// ERROR IN DISASSEMBLER";
   1.430 -        }
   1.431 -    }
   1.432 -
   1.433 -    /**
   1.434 -     * Returns list of super interfaces.
   1.435 -     */
   1.436 -    public String[] getSuperInterfaces(){
   1.437 -        String interfacenames[] = new String[interfaces.length];
   1.438 -        int interfacecpx = -1;
   1.439 -        for(int i = 0; i < interfaces.length; i++){
   1.440 -            interfacecpx=((CPX)cpool[interfaces[i]]).cpx;
   1.441 -            interfacenames[i] = (String)(cpool[interfacecpx]);
   1.442 -        }
   1.443 -        return interfacenames;
   1.444 -    }
   1.445 -
   1.446 -    /**
   1.447 -     * Returns string at prticular constant pool index.
   1.448 -     */
   1.449 -    public String getStringValue(int cpoolx) {
   1.450 -        try {
   1.451 -            return ((String)cpool[cpoolx]);
   1.452 -        } catch (ArrayIndexOutOfBoundsException e) {
   1.453 -            return "//invalid constant pool index:"+cpoolx;
   1.454 -        } catch (ClassCastException e) {
   1.455 -            return "//invalid constant pool ref:"+cpoolx;
   1.456 -        }
   1.457 -    }
   1.458 -
   1.459 -    /**
   1.460 -     * Returns list of field info.
   1.461 -     */
   1.462 -    public  FieldData[] getFields(){
   1.463 -        return fields;
   1.464 -    }
   1.465 -
   1.466 -    /**
   1.467 -     * Returns list of method info.
   1.468 -     */
   1.469 -    public  MethodData[] getMethods(){
   1.470 -        return methods;
   1.471 -    }
   1.472 -
   1.473 -    /**
   1.474 -     * Returns constant pool entry at that index.
   1.475 -     */
   1.476 -    public CPX2 getCpoolEntry(int cpx){
   1.477 -        return ((CPX2)(cpool[cpx]));
   1.478 -    }
   1.479 -
   1.480 -    public Object getCpoolEntryobj(int cpx){
   1.481 -        return (cpool[cpx]);
   1.482 -    }
   1.483 -
   1.484 -    /**
   1.485 -     * Returns index of this class.
   1.486 -     */
   1.487 -    public int getthis_cpx(){
   1.488 -        return this_class;
   1.489 -    }
   1.490 -
   1.491 -    /**
   1.492 -     * Returns string at that index.
   1.493 -     */
   1.494 -    public String StringValue(int cpx) {
   1.495 -        return stringValue(cpx, false);
   1.496 -    }
   1.497 -    public String stringValue(int cpx, boolean textual) {
   1.498 -        return stringValue(cpx, textual, null);
   1.499 -    }
   1.500 -    public String stringValue(int cpx, String[] classRefs) {
   1.501 -        return stringValue(cpx, true, classRefs);
   1.502 -    }
   1.503 -    private String stringValue(int cpx, boolean textual, String[] refs) {
   1.504 -        if (cpx==0) return "#0";
   1.505 -        int tag;
   1.506 -        Object x;
   1.507 -        String suffix="";
   1.508 -        try {
   1.509 -            tag=tags[cpx];
   1.510 -            x=cpool[cpx];
   1.511 -        } catch (IndexOutOfBoundsException e) {
   1.512 -            return "<Incorrect CP index:"+cpx+">";
   1.513 -        }
   1.514 -
   1.515 -        if (x==null) return "<NULL>";
   1.516 -        switch (tag) {
   1.517 -        case CONSTANT_UTF8: {
   1.518 -            if (!textual) {
   1.519 -                return (String)x;
   1.520 -            }
   1.521 -            StringBuilder sb=new StringBuilder();
   1.522 -            String s=(String)x;
   1.523 -            for (int k=0; k<s.length(); k++) {
   1.524 -                char c=s.charAt(k);
   1.525 -                switch (c) {
   1.526 -                case '\\': sb.append('\\').append('\\'); break;
   1.527 -                case '\t': sb.append('\\').append('t'); break;
   1.528 -                case '\n': sb.append('\\').append('n'); break;
   1.529 -                case '\r': sb.append('\\').append('r'); break;
   1.530 -                case '\"': sb.append('\\').append('\"'); break;
   1.531 -                default: sb.append(c);
   1.532 -                }
   1.533 -            }
   1.534 -            return sb.toString();
   1.535 -        }
   1.536 -        case CONSTANT_DOUBLE: {
   1.537 -            Double d=(Double)x;
   1.538 -            String sd=d.toString();
   1.539 -            if (textual) {
   1.540 -                return sd;
   1.541 -            }
   1.542 -            return sd+"d";
   1.543 -        }
   1.544 -        case CONSTANT_FLOAT: {
   1.545 -            Float f=(Float)x;
   1.546 -            String sf=(f).toString();
   1.547 -            if (textual) {
   1.548 -                return sf;
   1.549 -            }
   1.550 -            return sf+"f";
   1.551 -        }
   1.552 -        case CONSTANT_LONG: {
   1.553 -            Long ln = (Long)x;
   1.554 -            if (textual) {
   1.555 -                return ln.toString();
   1.556 -            }
   1.557 -            return ln.toString()+'l';
   1.558 -        }
   1.559 -        case CONSTANT_INTEGER: {
   1.560 -            Integer in = (Integer)x;
   1.561 -            return in.toString();
   1.562 -        }
   1.563 -        case CONSTANT_CLASS:
   1.564 -            String jn = getClassName(cpx);
   1.565 -            if (textual) {
   1.566 -                if (refs != null) {
   1.567 -                    refs[0] = jn;
   1.568 -                }
   1.569 -                return jn;
   1.570 -            }
   1.571 -            return javaName(jn);
   1.572 -        case CONSTANT_STRING:
   1.573 -            String sv = stringValue(((CPX)x).cpx, textual);
   1.574 -            if (textual) {
   1.575 -                return '"' + sv + '"';
   1.576 -            } else {
   1.577 -                return sv;
   1.578 -            }
   1.579 -        case CONSTANT_FIELD:
   1.580 -        case CONSTANT_METHOD:
   1.581 -        case CONSTANT_INTERFACEMETHOD:
   1.582 -            //return getShortClassName(((CPX2)x).cpx1)+"."+StringValue(((CPX2)x).cpx2);
   1.583 -             return javaName(getClassName(((CPX2)x).cpx1))+"."+StringValue(((CPX2)x).cpx2);
   1.584 -
   1.585 -        case CONSTANT_NAMEANDTYPE:
   1.586 -            return getName(((CPX2)x).cpx1)+":"+StringValue(((CPX2)x).cpx2);
   1.587 -        default:
   1.588 -            return "UnknownTag"; //TBD
   1.589 -        }
   1.590 -    }
   1.591 -
   1.592 -    /**
   1.593 -     * Returns resolved java type name.
   1.594 -     */
   1.595 -    public String javaName(String name) {
   1.596 -        if( name==null) return "null";
   1.597 -        int len=name.length();
   1.598 -        if (len==0) return "\"\"";
   1.599 -        int cc='/';
   1.600 -    fullname: { // xxx/yyy/zzz
   1.601 -            int cp;
   1.602 -            for (int k=0; k<len; k += Character.charCount(cp)) {
   1.603 -                cp=name.codePointAt(k);
   1.604 -                if (cc=='/') {
   1.605 -                    if (!isJavaIdentifierStart(cp)) break fullname;
   1.606 -                } else if (cp!='/') {
   1.607 -                    if (!isJavaIdentifierPart(cp)) break fullname;
   1.608 -                }
   1.609 -                cc=cp;
   1.610 -            }
   1.611 -            return name;
   1.612 -        }
   1.613 -        return "\""+name+"\"";
   1.614 -    }
   1.615 -
   1.616 -    public String getName(int cpx) {
   1.617 -        String res;
   1.618 -        try {
   1.619 -            return javaName((String)cpool[cpx]); //.replace('/','.');
   1.620 -        } catch (ArrayIndexOutOfBoundsException e) {
   1.621 -            return "<invalid constant pool index:"+cpx+">";
   1.622 -        } catch (ClassCastException e) {
   1.623 -            return "<invalid constant pool ref:"+cpx+">";
   1.624 -        }
   1.625 -    }
   1.626 -
   1.627 -    /**
   1.628 -     * Returns unqualified class name.
   1.629 -     */
   1.630 -    public String getShortClassName(int cpx) {
   1.631 -        String classname=javaName(getClassName(cpx));
   1.632 -        pkgPrefixLen=classname.lastIndexOf("/")+1;
   1.633 -        if (pkgPrefixLen!=0) {
   1.634 -            pkgPrefix=classname.substring(0,pkgPrefixLen);
   1.635 -            if (classname.startsWith(pkgPrefix)) {
   1.636 -                return classname.substring(pkgPrefixLen);
   1.637 -            }
   1.638 -        }
   1.639 -        return classname;
   1.640 -    }
   1.641 -
   1.642 -    /**
   1.643 -     * Returns source file name.
   1.644 -     */
   1.645 -    public String getSourceName(){
   1.646 -        return getName(source_cpx);
   1.647 -    }
   1.648 -
   1.649 -    /**
   1.650 -     * Returns package name.
   1.651 -     */
   1.652 -    public String getPkgName(){
   1.653 -        String classname=getClassName(this_class);
   1.654 -        pkgPrefixLen=classname.lastIndexOf("/")+1;
   1.655 -        if (pkgPrefixLen!=0) {
   1.656 -            pkgPrefix=classname.substring(0,pkgPrefixLen);
   1.657 -            return("package  "+pkgPrefix.substring(0,pkgPrefixLen-1)+";\n");
   1.658 -        }else return null;
   1.659 -    }
   1.660 -
   1.661 -    /**
   1.662 -     * Returns total constant pool entry count.
   1.663 -     */
   1.664 -    public int getCpoolCount(){
   1.665 -        return cpool_count;
   1.666 -    }
   1.667 -
   1.668 -    /**
   1.669 -     * Returns minor version of class file.
   1.670 -     */
   1.671 -    public int getMinor_version(){
   1.672 -        return minor_version;
   1.673 -    }
   1.674 -
   1.675 -    /**
   1.676 -     * Returns major version of class file.
   1.677 -     */
   1.678 -    public int getMajor_version(){
   1.679 -        return major_version;
   1.680 -    }
   1.681 -
   1.682 -    private boolean isJavaIdentifierStart(int cp) {
   1.683 -        return ('a' <= cp && cp <= 'z') || ('A' <= cp && cp <= 'Z');
   1.684 -    }
   1.685 -
   1.686 -    private boolean isJavaIdentifierPart(int cp) {
   1.687 -        return isJavaIdentifierStart(cp) || ('0' <= cp && cp <= '9');
   1.688 -    }
   1.689 -
   1.690 -    public String[] getNameAndType(int indx) {
   1.691 -        return getNameAndType(indx, 0, new String[2]);
   1.692 -    }
   1.693 -    
   1.694 -    private String[] getNameAndType(int indx, int at, String[] arr) {
   1.695 -        CPX2 c2 = getCpoolEntry(indx);
   1.696 -        arr[at] = StringValue(c2.cpx1);
   1.697 -        arr[at + 1] = StringValue(c2.cpx2);
   1.698 -        return arr;
   1.699 -    }
   1.700 -
   1.701 -    public String[] getFieldInfoName(int indx) {
   1.702 -        CPX2 c2 = getCpoolEntry(indx);
   1.703 -        String[] arr = new String[3];
   1.704 -        arr[0] = getClassName(c2.cpx1);
   1.705 -        return getNameAndType(c2.cpx2, 1, arr);
   1.706 -    }
   1.707 -
   1.708 -    static byte[] findAttr(String n, AttrData[] attrs) {
   1.709 -        for (AttrData ad : attrs) {
   1.710 -            if (n.equals(ad.getAttrName())) {
   1.711 -                return ad.getData();
   1.712 -            }
   1.713 -        }
   1.714 -        return null;
   1.715 -    }
   1.716 -}