1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/* 2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project 3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License. 6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at 7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and 14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License. 15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.rop.cst; 18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.type.Type; 20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/** 22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Constants of type {@code CONSTANT_NameAndType_info}. 23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic final class CstNat extends Constant { 25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * {@code non-null;} the instance for name {@code TYPE} and descriptor 27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * {@code java.lang.Class}, which is useful when dealing with 28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * wrapped primitives 29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final CstNat PRIMITIVE_TYPE_NAT = 31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson new CstNat(new CstString("TYPE"), 32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson new CstString("Ljava/lang/Class;")); 33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the name */ 35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private final CstString name; 36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the descriptor (type) */ 38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson private final CstString descriptor; 39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Constructs an instance. 42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param name {@code non-null;} the name 44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param descriptor {@code non-null;} the descriptor 45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public CstNat(CstString name, CstString descriptor) { 47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (name == null) { 48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new NullPointerException("name == null"); 49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (descriptor == null) { 52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson throw new NullPointerException("descriptor == null"); 53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson this.name = name; 56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson this.descriptor = descriptor; 57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public boolean equals(Object other) { 62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (!(other instanceof CstNat)) { 63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return false; 64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson CstNat otherNat = (CstNat) other; 67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return name.equals(otherNat.name) && 68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson descriptor.equals(otherNat.descriptor); 69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 73579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public int hashCode() { 74579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return (name.hashCode() * 31) ^ descriptor.hashCode(); 75579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 76579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 77579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 78579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 79579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson protected int compareTo0(Constant other) { 80579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson CstNat otherNat = (CstNat) other; 81579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int cmp = name.compareTo(otherNat.name); 82579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 83579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (cmp != 0) { 84579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return cmp; 85579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 86579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 87579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return descriptor.compareTo(otherNat.descriptor); 88579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 89579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 90579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 91579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 92579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public String toString() { 93579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return "nat{" + toHuman() + '}'; 94579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 95579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 96579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 97579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 98579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public String typeName() { 99579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return "nat"; 100579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 101579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 102579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 103579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson @Override 104579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public boolean isCategory2() { 105579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return false; 106579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 107579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 108579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 109579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets the name. 110579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 111579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} the name 112579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 113579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public CstString getName() { 114579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return name; 115579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 116579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 117579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 118579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets the descriptor. 119579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 120579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} the descriptor 121579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 122579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public CstString getDescriptor() { 123579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return descriptor; 124579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 125579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 126579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 127579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Returns an unadorned but human-readable version of the name-and-type 128579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * value. 129579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 130579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} the human form 131579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 132579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public String toHuman() { 133579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return name.toHuman() + ':' + descriptor.toHuman(); 134579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 135579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 136579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 137579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets the field type corresponding to this instance's descriptor. 138579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * This method is only valid to call if the descriptor in fact describes 139579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * a field (and not a method). 140579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 141579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} the field type 142579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 143579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public Type getFieldType() { 144579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return Type.intern(descriptor.getString()); 145579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 146579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 147579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 148579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets whether this instance has the name of a standard instance 149579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * initialization method. This is just a convenient shorthand for 150579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * {@code getName().getString().equals("<init>")}. 151579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 152579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code true} iff this is a reference to an 153579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * instance initialization method 154579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 155579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public final boolean isInstanceInit() { 156579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return name.getString().equals("<init>"); 157579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 158579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 159579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 160579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets whether this instance has the name of a standard class 161579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * initialization method. This is just a convenient shorthand for 162579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * {@code getName().getString().equals("<clinit>")}. 163579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 164579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code true} iff this is a reference to an 165579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * instance initialization method 166579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 167579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public final boolean isClassInit() { 168579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return name.getString().equals("<clinit>"); 169579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 170579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 171