1c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver/*
2c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * Copyright 2012, Google Inc.
3c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * All rights reserved.
4c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *
5c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * Redistribution and use in source and binary forms, with or without
6c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * modification, are permitted provided that the following conditions are
7c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * met:
8c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *
9c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *     * Redistributions of source code must retain the above copyright
10c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * notice, this list of conditions and the following disclaimer.
11c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *     * Redistributions in binary form must reproduce the above
12c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * copyright notice, this list of conditions and the following disclaimer
13c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * in the documentation and/or other materials provided with the
14c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * distribution.
15c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *     * Neither the name of Google Inc. nor the names of its
16c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * contributors may be used to endorse or promote products derived from
17c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * this software without specific prior written permission.
18c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver *
19c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver */
31c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver
32c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruverpackage org.jf.dexlib2.iface;
33c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver
34a4e0efe9a58af342ed1772e3e1a23def02c55cc4Ben Gruverimport org.jf.dexlib2.iface.reference.TypeReference;
35a4e0efe9a58af342ed1772e3e1a23def02c55cc4Ben Gruver
3622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport javax.annotation.Nonnull;
37c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruverimport javax.annotation.Nullable;
38c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver
3922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver/**
4022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver * This class represents an individual exception handler entry, in a try block.
4122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver */
4222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverpublic interface ExceptionHandler extends Comparable<ExceptionHandler> {
4322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
4422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Gets the type of exception that is handled by this handler.
4522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
4622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return The type of exception that is handled by this handler, or null if this is a catch-all handler.
4722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
48c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver    @Nullable String getExceptionType();
4922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
5022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
51a4e0efe9a58af342ed1772e3e1a23def02c55cc4Ben Gruver     * Gets the type of exception that is handled by this handler.
52a4e0efe9a58af342ed1772e3e1a23def02c55cc4Ben Gruver     *
53a4e0efe9a58af342ed1772e3e1a23def02c55cc4Ben Gruver     * @return A TypeReference to the type of exception that is handled by this handler, or null if this is a
54a4e0efe9a58af342ed1772e3e1a23def02c55cc4Ben Gruver     * catch-all handler.
55a4e0efe9a58af342ed1772e3e1a23def02c55cc4Ben Gruver     */
56a4e0efe9a58af342ed1772e3e1a23def02c55cc4Ben Gruver    @Nullable TypeReference getExceptionTypeReference();
57a4e0efe9a58af342ed1772e3e1a23def02c55cc4Ben Gruver
58a4e0efe9a58af342ed1772e3e1a23def02c55cc4Ben Gruver    /**
5922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Gets the code offset of the handler.
6022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
6122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return The offset of the handler from the the beginning of the bytecode for the method. The offset will be in
6222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * terms of 16-bit code units
6322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
64bea9627ed75546d7df9e79c927b9329c70a29808Ben Gruver    int getHandlerCodeAddress();
6522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
6622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
6722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Returns a hashcode for this ExceptionHandler.
6822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
6922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * This hashCode is defined to be the following:
7022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
7122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * <pre>
7222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * {@code
7322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * String exceptionType = getExceptionType();
7422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * int hashCode = exceptionType==null?0:exceptionType.hashCode();
7522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * return hashCode*31 + getHandlerCodeAddress();
7622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * }</pre>
7722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
7822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return The hash code value for this ExceptionHandler
7922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
8022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Override int hashCode();
8122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
8222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
8322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Compares this ExceptionHandler to another ExceptionHandler for equality.
8422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
8522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * This ExceptionHandler is equal to another ExceptionHandler if all of it's "fields" are equal. That is, if
8622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * the return values of getExceptionType() and getHandlerCodeAddress() are both equal.
8722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
8822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @param o The object to be compared for equality with this ExceptionHandler
8922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return true if the specified object is equal to this ExceptionHandler
9022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
9122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Override boolean equals(@Nullable Object o);
9222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver
9322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    /**
9422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * Compare this ExceptionHandler to another ExceptionHandler.
9522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
9622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * The comparison is based on the comparison of the return values of getExceptionType() and
9722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * getHandlerCodeAddress() in that order. A null value for getExceptionType() compares after a non-null value.
9822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     *
9922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @param o The ExceptionHandler to compare with this ExceptionHandler
10022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     * @return An integer representing the result of the comparison
10122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver     */
10222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Override int compareTo(@Nonnull ExceptionHandler o);
103c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver}
104