19b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver/*
29b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * Copyright 2015, Google Inc.
39b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * All rights reserved.
49b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver *
59b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * Redistribution and use in source and binary forms, with or without
69b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * modification, are permitted provided that the following conditions are
79b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * met:
89b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver *
99b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver *     * Redistributions of source code must retain the above copyright
109b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * notice, this list of conditions and the following disclaimer.
119b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver *     * Redistributions in binary form must reproduce the above
129b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * copyright notice, this list of conditions and the following disclaimer
139b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * in the documentation and/or other materials provided with the
149b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * distribution.
159b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver *     * Neither the name of Google Inc. nor the names of its
169b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * contributors may be used to endorse or promote products derived from
179b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * this software without specific prior written permission.
189b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver *
199b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
209b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
219b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
229b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
239b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
249b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
259b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
269b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
279b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
289b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
299b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
309b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver */
319b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver
329b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruverpackage org.jf.smalidea.dexlib;
339b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver
349b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruverimport org.jf.dexlib2.base.BaseTryBlock;
359b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruverimport org.jf.smalidea.psi.impl.SmaliCatchStatement;
369b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver
379b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruverimport javax.annotation.Nonnull;
389b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruverimport java.util.Arrays;
399b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruverimport java.util.List;
409b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver
419b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruverpublic class SmalideaTryBlock extends BaseTryBlock<SmalideaExceptionHandler> {
429b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver    @Nonnull private final SmaliCatchStatement catchStatement;
439b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver
449b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver    public SmalideaTryBlock(@Nonnull SmaliCatchStatement catchStatement) {
459b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver        this.catchStatement = catchStatement;
469b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver    }
479b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver
489b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver    @Override public int getCodeUnitCount() {
499b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver        int endOffset = catchStatement.getEndLabel().resolve().getOffset() / 2;
509b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver        return endOffset - getStartCodeAddress();
519b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver    }
529b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver
539b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver    @Override public int getStartCodeAddress() {
549b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver        // TODO: how to handle references to non-existent labels?
559b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver        return catchStatement.getStartLabel().resolve().getOffset() / 2;
569b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver    }
579b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver
589b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver    @Nonnull @Override public List<? extends SmalideaExceptionHandler> getExceptionHandlers() {
599b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver        return Arrays.asList(new SmalideaExceptionHandler(catchStatement));
609b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver    }
619b97cfdf4882d4e306e3f81709be4649031cd799Ben Gruver}
62