| // Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| package com.android.tools.r8.ir.code; | |
| import com.android.tools.r8.graph.DexDefinitionSupplier; | |
| import com.android.tools.r8.graph.DexReference; | |
| import com.android.tools.r8.graph.DexType; | |
| import com.android.tools.r8.naming.IdentifierNameStringUtils; | |
| public class ConstantValueUtils { | |
| /** | |
| * If the given value is a constant class, then returns the corresponding {@link DexType}. | |
| * Otherwise returns null. This should only be used for tracing. | |
| */ | |
| public static DexType getDexTypeRepresentedByValueForTracing( | |
| Value value, DexDefinitionSupplier definitions) { | |
| Value alias = | |
| value.getAliasedValue(IgnoreDebugLocalWriteAliasedValueConfiguration.getInstance()); | |
| if (alias.isPhi()) { | |
| return null; | |
| } | |
| if (alias.definition.isConstClass()) { | |
| return alias.definition.asConstClass().getValue(); | |
| } | |
| if (alias.definition.isInvokeStatic()) { | |
| InvokeStatic invoke = alias.definition.asInvokeStatic(); | |
| if (definitions.dexItemFactory().classMethods | |
| .isReflectiveClassLookup(invoke.getInvokedMethod())) { | |
| return getDexTypeFromClassForName(invoke, definitions); | |
| } | |
| } | |
| return null; | |
| } | |
| public static DexType getDexTypeFromClassForName( | |
| InvokeStatic invoke, DexDefinitionSupplier definitions) { | |
| assert definitions.dexItemFactory().classMethods | |
| .isReflectiveClassLookup(invoke.getInvokedMethod()); | |
| if (invoke.arguments().size() == 1 || invoke.arguments().size() == 3) { | |
| Value argument = invoke.arguments().get(0); | |
| if (argument.isConstString()) { | |
| ConstString constStringInstruction = argument.getConstInstruction().asConstString(); | |
| return IdentifierNameStringUtils.inferTypeFromNameString( | |
| definitions, constStringInstruction.getValue()); | |
| } | |
| if (argument.isDexItemBasedConstString()) { | |
| DexItemBasedConstString constStringInstruction = | |
| argument.getConstInstruction().asDexItemBasedConstString(); | |
| DexReference item = constStringInstruction.getItem(); | |
| if (item.isDexType()) { | |
| return item.asDexType(); | |
| } | |
| } | |
| } | |
| return null; | |
| } | |
| } |