|  | // Copyright (c) 2016, 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.conversion; | 
|  |  | 
|  | import com.android.tools.r8.code.FillArrayData; | 
|  | import com.android.tools.r8.code.FillArrayDataPayload; | 
|  | import java.util.HashMap; | 
|  | import java.util.Map; | 
|  |  | 
|  | /** | 
|  | * Helper class for resolving payload information during IR construction. | 
|  | */ | 
|  | public class ArrayFilledDataPayloadResolver { | 
|  |  | 
|  | private static class PayloadData { | 
|  | public int element_width; | 
|  | public long size; | 
|  | public short[] data; | 
|  | } | 
|  |  | 
|  | private final Map<Integer, FillArrayDataPayload> unresolvedPayload = new HashMap<>(); | 
|  | private final Map<Integer, PayloadData> payloadToData = new HashMap<>(); | 
|  |  | 
|  | public void addPayloadUser(FillArrayData dex) { | 
|  | int offset = dex.getOffset(); | 
|  | int payloadOffset = offset + dex.getPayloadOffset(); | 
|  | assert !payloadToData.containsKey(payloadOffset); | 
|  | payloadToData.put(payloadOffset, new PayloadData()); | 
|  | if (unresolvedPayload.containsKey(payloadOffset)) { | 
|  | FillArrayDataPayload payload = unresolvedPayload.remove(payloadOffset); | 
|  | resolve(payload); | 
|  | } | 
|  | } | 
|  |  | 
|  | public void resolve(FillArrayDataPayload payload) { | 
|  | int payloadOffset = payload.getOffset(); | 
|  | PayloadData data = payloadToData.get(payloadOffset); | 
|  | if (data == null) { | 
|  | unresolvedPayload.put(payloadOffset, payload); | 
|  | return; | 
|  | } | 
|  |  | 
|  | data.element_width = payload.element_width; | 
|  | data.size = payload.size; | 
|  | data.data = payload.data; | 
|  | } | 
|  |  | 
|  | public int getElementWidth(int payloadOffset) { | 
|  | return payloadToData.get(payloadOffset).element_width; | 
|  | } | 
|  |  | 
|  | public long getSize(int payloadOffset) { | 
|  | return payloadToData.get(payloadOffset).size; | 
|  | } | 
|  |  | 
|  | public short[] getData(int payloadOffset) { | 
|  | return payloadToData.get(payloadOffset).data; | 
|  | } | 
|  |  | 
|  | public void clear() { | 
|  | payloadToData.clear(); | 
|  | } | 
|  | } |