1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.rop.cst; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 2299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Constants of type {@code CONSTANT_NameAndType_info}. 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class CstNat extends Constant { 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 2699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code non-null;} the instance for name {@code TYPE} and descriptor 2799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code java.lang.Class}, which is useful when dealing with 28de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * wrapped primitives 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final CstNat PRIMITIVE_TYPE_NAT = 31333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson new CstNat(new CstString("TYPE"), 32333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson new CstString("Ljava/lang/Class;")); 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} the name */ 35333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson private final CstString name; 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} the descriptor (type) */ 38333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson private final CstString descriptor; 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. 42de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 4399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param name {@code non-null;} the name 4499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param descriptor {@code non-null;} the descriptor 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 46333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson public CstNat(CstString name, CstString descriptor) { 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (name == null) { 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("name == null"); 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (descriptor == null) { 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("descriptor == null"); 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.name = name; 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.descriptor = descriptor; 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean equals(Object other) { 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!(other instanceof CstNat)) { 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstNat otherNat = (CstNat) other; 67de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro return name.equals(otherNat.name) && 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project descriptor.equals(otherNat.descriptor); 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int hashCode() { 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (name.hashCode() * 31) ^ descriptor.hashCode(); 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected int compareTo0(Constant other) { 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstNat otherNat = (CstNat) other; 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int cmp = name.compareTo(otherNat.name); 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (cmp != 0) { 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return cmp; 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return descriptor.compareTo(otherNat.descriptor); 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toString() { 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "nat{" + toHuman() + '}'; 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String typeName() { 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "nat"; 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean isCategory2() { 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the name. 110de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 11199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the name 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 113333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson public CstString getName() { 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return name; 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the descriptor. 119de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 12099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the descriptor 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 122333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson public CstString getDescriptor() { 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return descriptor; 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns an unadorned but human-readable version of the name-and-type 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * value. 129de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 13099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the human form 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toHuman() { 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return name.toHuman() + ':' + descriptor.toHuman(); 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the field type corresponding to this instance's descriptor. 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This method is only valid to call if the descriptor in fact describes 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a field (and not a method). 140de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 14199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the field type 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Type getFieldType() { 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Type.intern(descriptor.getString()); 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets whether this instance has the name of a standard instance 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * initialization method. This is just a convenient shorthand for 15099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code getName().getString().equals("<init>")}. 151de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 15299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff this is a reference to an 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instance initialization method 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final boolean isInstanceInit() { 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return name.getString().equals("<init>"); 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets whether this instance has the name of a standard class 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * initialization method. This is just a convenient shorthand for 16299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code getName().getString().equals("<clinit>")}. 163de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 16499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code true} iff this is a reference to an 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instance initialization method 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public final boolean isClassInit() { 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return name.getString().equals("<clinit>"); 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 171