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