| // Copyright (c) 2018, 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.errors.Unreachable; | |
| import com.android.tools.r8.ir.analysis.type.TypeElement; | |
| /** | |
| * {@link StackValues} allow us to represent stack operations that produces two or more elements on | |
| * the stack while using the same logic for instructions. | |
| */ | |
| public class StackValues extends Value { | |
| private final StackValue[] stackValues; | |
| public StackValues(StackValue... stackValues) { | |
| super(Value.UNDEFINED_NUMBER, TypeElement.getBottom(), null); | |
| this.stackValues = stackValues; | |
| assert stackValues.length >= 2; | |
| } | |
| public StackValue[] getStackValues() { | |
| return stackValues; | |
| } | |
| @Override | |
| public boolean needsRegister() { | |
| return false; | |
| } | |
| @Override | |
| public void setNeedsRegister(boolean value) { | |
| assert !value; | |
| } | |
| @Override | |
| public String toString() { | |
| StringBuilder sb = new StringBuilder(); | |
| sb.append('['); | |
| for (StackValue value : stackValues) { | |
| if (sb.length() > 1) { | |
| sb.append(", "); | |
| } | |
| sb.append(value); | |
| } | |
| sb.append(']'); | |
| return sb.toString(); | |
| } | |
| @Override | |
| public boolean isValueOnStack() { | |
| return true; | |
| } | |
| @Override | |
| public TypeElement getType() { | |
| throw new Unreachable(); | |
| } | |
| } |