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.cf.code; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstType; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Prototype; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.TypeBearer; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Hex; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link Machine} which keeps track of known values but does not do 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * smart/realistic reference type calculations. 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class ValueAwareMachine extends BaseMachine { 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 33d24414a5d1780ce25179f3467b228f9a53863fb4Dan Bornstein * @param prototype {@code non-null;} the prototype for the associated 34d24414a5d1780ce25179f3467b228f9a53863fb4Dan Bornstein * method 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ValueAwareMachine(Prototype prototype) { 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(prototype); 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void run(Frame frame, int offset, int opcode) { 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (opcode) { 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.NOP: 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IASTORE: 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.POP: 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.POP2: 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IFEQ: 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IFNE: 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IFLT: 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IFGE: 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IFGT: 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IFLE: 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IF_ICMPEQ: 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IF_ICMPNE: 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IF_ICMPLT: 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IF_ICMPGE: 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IF_ICMPGT: 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IF_ICMPLE: 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IF_ACMPEQ: 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IF_ACMPNE: 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.GOTO: 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.RET: 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.LOOKUPSWITCH: 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IRETURN: 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.RETURN: 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.PUTSTATIC: 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.PUTFIELD: 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.ATHROW: 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.MONITORENTER: 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.MONITOREXIT: 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IFNULL: 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IFNONNULL: { 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Nothing to do for these ops in this class. 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clearResult(); 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.LDC: 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.LDC2_W: { 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setResult((TypeBearer) getAuxCst()); 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.ILOAD: 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.ISTORE: { 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setResult(arg(0)); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IALOAD: 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IADD: 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.ISUB: 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IMUL: 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IDIV: 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IREM: 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.INEG: 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.ISHL: 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.ISHR: 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IUSHR: 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IAND: 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IOR: 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IXOR: 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.IINC: 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.I2L: 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.I2F: 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.I2D: 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.L2I: 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.L2F: 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.L2D: 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.F2I: 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.F2L: 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.F2D: 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.D2I: 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.D2L: 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.D2F: 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.I2B: 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.I2C: 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.I2S: 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.LCMP: 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.FCMPL: 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.FCMPG: 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.DCMPL: 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.DCMPG: 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.ARRAYLENGTH: { 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setResult(getAuxType()); 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.DUP: 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.DUP_X1: 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.DUP_X2: 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.DUP2: 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.DUP2_X1: 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.DUP2_X2: 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.SWAP: { 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clearResult(); 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int pattern = getAuxInt(); pattern != 0; pattern >>= 4) { 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int which = (pattern & 0x0f) - 1; 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project addResult(arg(which)); 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.JSR: { 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setResult(new ReturnAddress(getAuxTarget())); 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.GETSTATIC: 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.GETFIELD: 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.INVOKEVIRTUAL: 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.INVOKESTATIC: 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.INVOKEINTERFACE: { 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Type type = ((TypeBearer) getAuxCst()).getType(); 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (type == Type.VOID) { 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clearResult(); 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setResult(type); 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.INVOKESPECIAL: { 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Type thisType = arg(0).getType(); 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (thisType.isUninitialized()) { 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project frame.makeInitialized(thisType); 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Type type = ((TypeBearer) getAuxCst()).getType(); 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (type == Type.VOID) { 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project clearResult(); 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setResult(type); 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.NEW: { 171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Type type = ((CstType) getAuxCst()).getClassType(); 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setResult(type.asUninitialized(offset)); 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.NEWARRAY: 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.CHECKCAST: 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.MULTIANEWARRAY: { 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Type type = ((CstType) getAuxCst()).getClassType(); 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setResult(type); 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.ANEWARRAY: { 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Type type = ((CstType) getAuxCst()).getClassType(); 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setResult(type.getArrayType()); 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case ByteOps.INSTANCEOF: { 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setResult(Type.INT); 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project break; 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: { 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("shouldn't happen: " + 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Hex.u1(opcode)); 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project storeResults(frame); 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 200