| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.dexgen.rop; |
| |
| import com.android.dexgen.util.Hex; |
| import com.android.dexgen.util.IntList; |
| import com.android.dexgen.util.LabeledItem; |
| |
| /** |
| * Representation of a basic block in a bytecode array. |
| */ |
| public final class ByteBlock implements LabeledItem { |
| /** {@code >= 0;} label for this block */ |
| private final int label; |
| |
| /** {@code >= 0;} bytecode offset (inclusive) of the start of the block */ |
| private final int start; |
| |
| /** {@code > start;} bytecode offset (exclusive) of the end of the block */ |
| private final int end; |
| |
| /** {@code non-null;} list of successors that this block may branch to */ |
| private final IntList successors; |
| |
| /** {@code non-null;} list of exceptions caught and their handler targets */ |
| private final ByteCatchList catches; |
| |
| /** |
| * Constructs an instance. |
| * |
| * @param label {@code >= 0;} target label for this block |
| * @param start {@code >= 0;} bytecode offset (inclusive) of the start |
| * of the block |
| * @param end {@code > start;} bytecode offset (exclusive) of the end |
| * of the block |
| * @param successors {@code non-null;} list of successors that this block may |
| * branch to |
| * @param catches {@code non-null;} list of exceptions caught and their |
| * handler targets |
| */ |
| public ByteBlock(int label, int start, int end, IntList successors, |
| ByteCatchList catches) { |
| if (label < 0) { |
| throw new IllegalArgumentException("label < 0"); |
| } |
| |
| if (start < 0) { |
| throw new IllegalArgumentException("start < 0"); |
| } |
| |
| if (end <= start) { |
| throw new IllegalArgumentException("end <= start"); |
| } |
| |
| if (successors == null) { |
| throw new NullPointerException("targets == null"); |
| } |
| |
| int sz = successors.size(); |
| for (int i = 0; i < sz; i++) { |
| if (successors.get(i) < 0) { |
| throw new IllegalArgumentException("successors[" + i + |
| "] == " + |
| successors.get(i)); |
| } |
| } |
| |
| if (catches == null) { |
| throw new NullPointerException("catches == null"); |
| } |
| |
| this.label = label; |
| this.start = start; |
| this.end = end; |
| this.successors = successors; |
| this.catches = catches; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public String toString() { |
| return '{' + Hex.u2(label) + ": " + Hex.u2(start) + ".." + |
| Hex.u2(end) + '}'; |
| } |
| |
| /** |
| * Gets the label of this block. |
| * |
| * @return {@code >= 0;} the label |
| */ |
| public int getLabel() { |
| return label; |
| } |
| |
| /** |
| * Gets the bytecode offset (inclusive) of the start of this block. |
| * |
| * @return {@code >= 0;} the start offset |
| */ |
| public int getStart() { |
| return start; |
| } |
| |
| /** |
| * Gets the bytecode offset (exclusive) of the end of this block. |
| * |
| * @return {@code > getStart();} the end offset |
| */ |
| public int getEnd() { |
| return end; |
| } |
| |
| /** |
| * Gets the list of successors that this block may branch to |
| * non-exceptionally. |
| * |
| * @return {@code non-null;} the successor list |
| */ |
| public IntList getSuccessors() { |
| return successors; |
| } |
| |
| /** |
| * Gets the list of exceptions caught and their handler targets. |
| * |
| * @return {@code non-null;} the catch list |
| */ |
| public ByteCatchList getCatches() { |
| return catches; |
| } |
| } |