1917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul/* 2917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Copyright (C) 2007 The Android Open Source Project 3917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 4917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Licensed under the Apache License, Version 2.0 (the "License"); 5917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * you may not use this file except in compliance with the License. 6917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * You may obtain a copy of the License at 7917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 8917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * http://www.apache.org/licenses/LICENSE-2.0 9917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 10917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Unless required by applicable law or agreed to in writing, software 11917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * distributed under the License is distributed on an "AS IS" BASIS, 12917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * See the License for the specific language governing permissions and 14917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * limitations under the License. 15917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 16917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 17917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulpackage com.android.dexgen.rop.cst; 18917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 19917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulimport com.android.dexgen.rop.type.Type; 20917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 21917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul/** 22917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Constants of type {@code CONSTANT_NameAndType_info}. 23917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 24917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulpublic final class CstNat extends Constant { 25917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 26917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * {@code non-null;} the instance for name {@code TYPE} and descriptor 27917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * {@code java.lang.Class}, which is useful when dealing with 28917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * wrapped primitives 29917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 30917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public static final CstNat PRIMITIVE_TYPE_NAT = 31917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul new CstNat(new CstUtf8("TYPE"), 32917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul new CstUtf8("Ljava/lang/Class;")); 33917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 34917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@code non-null;} the name */ 35917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul private final CstUtf8 name; 36917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 37917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@code non-null;} the descriptor (type) */ 38917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul private final CstUtf8 descriptor; 39917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 40917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 41917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Constructs an instance. 42917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 43917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param name {@code non-null;} the name 44917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param descriptor {@code non-null;} the descriptor 45917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 46917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public CstNat(CstUtf8 name, CstUtf8 descriptor) { 47917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul if (name == null) { 48917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul throw new NullPointerException("name == null"); 49917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 50917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 51917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul if (descriptor == null) { 52917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul throw new NullPointerException("descriptor == null"); 53917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 54917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 55917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul this.name = name; 56917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul this.descriptor = descriptor; 57917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 58917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 59917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 60917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 61917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public boolean equals(Object other) { 62917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul if (!(other instanceof CstNat)) { 63917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return false; 64917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 65917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 66917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul CstNat otherNat = (CstNat) other; 67917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return name.equals(otherNat.name) && 68917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul descriptor.equals(otherNat.descriptor); 69917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 70917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 71917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 72917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 73917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public int hashCode() { 74917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return (name.hashCode() * 31) ^ descriptor.hashCode(); 75917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 76917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 77917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 78917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 79917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul protected int compareTo0(Constant other) { 80917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul CstNat otherNat = (CstNat) other; 81917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul int cmp = name.compareTo(otherNat.name); 82917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 83917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul if (cmp != 0) { 84917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return cmp; 85917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 86917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 87917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return descriptor.compareTo(otherNat.descriptor); 88917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 89917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 90917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 91917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 92917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public String toString() { 93917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return "nat{" + toHuman() + '}'; 94917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 95917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 96917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 97917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 98917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public String typeName() { 99917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return "nat"; 100917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 101917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 102917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 103917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 104917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public boolean isCategory2() { 105917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return false; 106917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 107917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 108917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 109917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Gets the name. 110917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 111917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code non-null;} the name 112917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 113917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public CstUtf8 getName() { 114917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return name; 115917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 116917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 117917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 118917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Gets the descriptor. 119917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 120917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code non-null;} the descriptor 121917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 122917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public CstUtf8 getDescriptor() { 123917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return descriptor; 124917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 125917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 126917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 127917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Returns an unadorned but human-readable version of the name-and-type 128917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * value. 129917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 130917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code non-null;} the human form 131917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 132917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public String toHuman() { 133917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return name.toHuman() + ':' + descriptor.toHuman(); 134917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 135917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 136917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 137917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Gets the field type corresponding to this instance's descriptor. 138917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * This method is only valid to call if the descriptor in fact describes 139917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * a field (and not a method). 140917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 141917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code non-null;} the field type 142917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 143917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public Type getFieldType() { 144917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return Type.intern(descriptor.getString()); 145917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 146917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 147917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 148917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Gets whether this instance has the name of a standard instance 149917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * initialization method. This is just a convenient shorthand for 150917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * {@code getName().getString().equals("<init>")}. 151917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 152917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code true} iff this is a reference to an 153917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * instance initialization method 154917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 155917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public final boolean isInstanceInit() { 156917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return name.getString().equals("<init>"); 157917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 158917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 159917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 160917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Gets whether this instance has the name of a standard class 161917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * initialization method. This is just a convenient shorthand for 162917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * {@code getName().getString().equals("<clinit>")}. 163917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 164917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code true} iff this is a reference to an 165917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * instance initialization method 166917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 167917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public final boolean isClassInit() { 168917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return name.getString().equals("<clinit>"); 169917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 170917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul} 171