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