15ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver/* 25ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * Copyright 2013, Google Inc. 35ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * All rights reserved. 45ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * 55ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * Redistribution and use in source and binary forms, with or without 65ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * modification, are permitted provided that the following conditions are 75ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * met: 85ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * 95ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * * Redistributions of source code must retain the above copyright 105ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * notice, this list of conditions and the following disclaimer. 115ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * * Redistributions in binary form must reproduce the above 125ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * copyright notice, this list of conditions and the following disclaimer 135ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * in the documentation and/or other materials provided with the 145ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * distribution. 155ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * * Neither the name of Google Inc. nor the names of its 165ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * contributors may be used to endorse or promote products derived from 175ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * this software without specific prior written permission. 185ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * 195ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver */ 315ff4ee9a3fc898dbe9a67386e984f14c21338391Ben Gruver 32897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruverpackage org.jf.dexlib2.builder; 33897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver 34897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruverimport org.jf.dexlib2.base.BaseExceptionHandler; 35897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruverimport org.jf.dexlib2.iface.reference.TypeReference; 36897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver 37897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruverimport javax.annotation.Nonnull; 38897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruverimport javax.annotation.Nullable; 39897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver 40899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruverpublic abstract class BuilderExceptionHandler extends BaseExceptionHandler { 41899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver @Nonnull protected final Label handler; 42899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver 43899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver private BuilderExceptionHandler(@Nonnull Label handler) { 44899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver this.handler = handler; 45899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver } 46899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver 47899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver @Nonnull 48899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver public Label getHandler() { 49899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver return handler; 50899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver } 51899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver 52899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver static BuilderExceptionHandler newExceptionHandler(@Nullable final TypeReference exceptionType, 53899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver @Nonnull Label handler) { 54897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver if (exceptionType == null) { 55897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver return newExceptionHandler(handler); 56897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 57899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver return new BuilderExceptionHandler(handler) { 58897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver @Nullable @Override public String getExceptionType() { 59897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver return exceptionType.getType(); 60897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 61897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver 62897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver @Override public int getHandlerCodeAddress() { 63897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver return handler.getCodeAddress(); 64897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 65897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver 66897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver @Nullable @Override public TypeReference getExceptionTypeReference() { 67897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver return exceptionType; 68897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 69897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver }; 70897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 71897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver 72899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver static BuilderExceptionHandler newExceptionHandler(@Nonnull Label handler) { 73899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver return new BuilderExceptionHandler(handler) { 74897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver @Nullable @Override public String getExceptionType() { 75897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver return null; 76897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 77897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver 78897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver @Override public int getHandlerCodeAddress() { 79897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver return handler.getCodeAddress(); 80897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 81897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver }; 82897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 83897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver 84899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver static BuilderExceptionHandler newExceptionHandler(@Nullable final String exceptionType, 85899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver @Nonnull Label handler) { 86897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver if (exceptionType == null) { 87897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver return newExceptionHandler(handler); 88897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 89899b1e6611d260370aa81b9fb23684d2052e5f5fBen Gruver return new BuilderExceptionHandler(handler) { 90897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver @Nullable @Override public String getExceptionType() { 91897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver return exceptionType; 92897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 93897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver 94897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver @Override public int getHandlerCodeAddress() { 95897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver return handler.getCodeAddress(); 96897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 97897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver }; 98897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver } 99897832aa150cdf53ed7fa2f17dee132d2408e2f3Ben Gruver} 100