MethodIdItem.java revision 119ddb08056d3ac73123f889bfd576766cdb6cc1
1/*
2 * [The "BSD licence"]
3 * Copyright (c) 2009 Ben Gruver
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 *    derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29package org.jf.dexlib;
30
31public class MethodIdItem extends IndexedItem<MethodIdItem> {
32    private final IndexedItemReference<TypeIdItem> classTypeReferenceField;
33    private final IndexedItemReference<ProtoIdItem> prototypeReferenceField;
34    private final IndexedItemReference<StringIdItem> methodNameReferenceField;
35
36    public MethodIdItem(DexFile dexFile, int index) {
37        super(index);
38        fields = new Field[] {
39                classTypeReferenceField = new IndexedItemReference<TypeIdItem>(dexFile.TypeIdsSection,
40                        new ShortIntegerField(null), "class_idx"),
41                prototypeReferenceField = new IndexedItemReference<ProtoIdItem>(dexFile.ProtoIdsSection,
42                        new ShortIntegerField(null), "proto_idx"),
43                methodNameReferenceField = new IndexedItemReference<StringIdItem>(dexFile.StringIdsSection,
44                        new IntegerField(null), "name_idx")
45        };
46    }
47
48    public MethodIdItem(DexFile dexFile, TypeIdItem classType, StringIdItem methodName, ProtoIdItem prototype) {
49        this(dexFile, -1);
50        classTypeReferenceField.setReference(classType);
51        prototypeReferenceField.setReference(prototype);
52        methodNameReferenceField.setReference(methodName);
53    }
54
55    protected int getAlignment() {
56        return 4;
57    }
58
59    public ItemType getItemType() {
60        return ItemType.TYPE_METHOD_ID_ITEM;
61    }
62
63    public String getConciseIdentity() {
64        return "method_id_item: " + getMethodString();
65    }
66
67    private String cachedMethodString = null;
68    public String getMethodString() {
69        if (cachedMethodString == null) {
70            String parentClass = classTypeReferenceField.getReference().getTypeDescriptor();
71            //strip the leading L and trailing ;
72            parentClass = parentClass.substring(1, parentClass.length() - 1);
73
74            cachedMethodString = parentClass + methodNameReferenceField.getReference().getStringValue() +
75                    prototypeReferenceField.getReference().getPrototypeString();
76        }
77        return cachedMethodString;
78    }
79
80    public ProtoIdItem getPrototype() {
81        return prototypeReferenceField.getReference();
82    }
83
84    public String getMethodName() {
85        return methodNameReferenceField.getReference().getStringValue();
86    }
87
88    public int getParameterRegisterCount(boolean isStatic) {
89        return prototypeReferenceField.getReference().getParameterRegisterCount() + (isStatic?0:1);
90    }
91
92    public TypeIdItem getContainingClass() {
93        return classTypeReferenceField.getReference();
94    }
95
96    /**
97     * Return the number of parameters, not including the "this" parameter, if any
98     * @return The number of parameters, not including the "this" parameter, if any
99     */
100    public int getParameterCount() {
101        return prototypeReferenceField.getReference().getParameterCount();
102    }
103
104    public int compareTo(MethodIdItem o) {
105        int result = classTypeReferenceField.compareTo(o.classTypeReferenceField);
106        if (result != 0) {
107            return result;
108        }
109
110        result = methodNameReferenceField.compareTo(o.methodNameReferenceField);
111        if (result != 0) {
112            return result;
113        }
114
115        return prototypeReferenceField.compareTo(o.prototypeReferenceField);
116    }
117}
118