1e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver/*
2e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * Copyright 2012, Google Inc.
3e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * All rights reserved.
4e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *
5e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * Redistribution and use in source and binary forms, with or without
6e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * modification, are permitted provided that the following conditions are
7e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * met:
8e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *
9e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *     * Redistributions of source code must retain the above copyright
10e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * notice, this list of conditions and the following disclaimer.
11e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *     * Redistributions in binary form must reproduce the above
12e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * copyright notice, this list of conditions and the following disclaimer
13e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * in the documentation and/or other materials provided with the
14e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * distribution.
15e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *     * Neither the name of Google Inc. nor the names of its
16e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * contributors may be used to endorse or promote products derived from
17e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * this software without specific prior written permission.
18e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *
19e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver */
31e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
32e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverpackage org.jf.dexlib2.immutable;
33e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
34e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport com.google.common.collect.ImmutableList;
355916df99999ae58f707d829792ef3997546628fdBen Gruverimport org.jf.dexlib2.base.BaseTryBlock;
36e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.iface.ExceptionHandler;
37e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.iface.TryBlock;
3822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport org.jf.util.ImmutableConverter;
392d7e1111358e2b8cc951a46dc8b0217a7fa0deadBen Gruverimport org.jf.util.ImmutableUtils;
40e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
41e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport javax.annotation.Nonnull;
42e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport javax.annotation.Nullable;
43e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport java.util.List;
44e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
451bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverpublic class ImmutableTryBlock extends BaseTryBlock<ImmutableExceptionHandler> {
4622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    protected final int startCodeAddress;
4722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    protected final int codeUnitCount;
4856c7adde039ecccf074bc42258c22ae006a33d0aIzzat Bahadirov    @Nonnull protected final ImmutableList<? extends ImmutableExceptionHandler> exceptionHandlers;
49e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
50bea9627ed75546d7df9e79c927b9329c70a29808Ben Gruver    public ImmutableTryBlock(int startCodeAddress,
51ccc4c13ae6cf774126749a5ad8f45de0c08edbeeBen Gruver                             int codeUnitCount,
5256c7adde039ecccf074bc42258c22ae006a33d0aIzzat Bahadirov                             @Nullable List<? extends ExceptionHandler> exceptionHandlers) {
53bea9627ed75546d7df9e79c927b9329c70a29808Ben Gruver        this.startCodeAddress = startCodeAddress;
54ccc4c13ae6cf774126749a5ad8f45de0c08edbeeBen Gruver        this.codeUnitCount = codeUnitCount;
5556c7adde039ecccf074bc42258c22ae006a33d0aIzzat Bahadirov        this.exceptionHandlers = ImmutableExceptionHandler.immutableListOf(exceptionHandlers);
56e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
57e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
58bea9627ed75546d7df9e79c927b9329c70a29808Ben Gruver    public ImmutableTryBlock(int startCodeAddress,
59ccc4c13ae6cf774126749a5ad8f45de0c08edbeeBen Gruver                             int codeUnitCount,
6056c7adde039ecccf074bc42258c22ae006a33d0aIzzat Bahadirov                             @Nullable ImmutableList<? extends ImmutableExceptionHandler> exceptionHandlers) {
61bea9627ed75546d7df9e79c927b9329c70a29808Ben Gruver        this.startCodeAddress = startCodeAddress;
62ccc4c13ae6cf774126749a5ad8f45de0c08edbeeBen Gruver        this.codeUnitCount = codeUnitCount;
6356c7adde039ecccf074bc42258c22ae006a33d0aIzzat Bahadirov        this.exceptionHandlers = ImmutableUtils.nullToEmptyList(exceptionHandlers);
64e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
65e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
661bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public static ImmutableTryBlock of(TryBlock<? extends ExceptionHandler> tryBlock) {
67e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        if (tryBlock instanceof ImmutableTryBlock) {
68e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver            return (ImmutableTryBlock)tryBlock;
69e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        }
70e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        return new ImmutableTryBlock(
71bea9627ed75546d7df9e79c927b9329c70a29808Ben Gruver                tryBlock.getStartCodeAddress(),
72ccc4c13ae6cf774126749a5ad8f45de0c08edbeeBen Gruver                tryBlock.getCodeUnitCount(),
73e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                tryBlock.getExceptionHandlers());
74e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
75e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
76bea9627ed75546d7df9e79c927b9329c70a29808Ben Gruver    @Override public int getStartCodeAddress() { return startCodeAddress; }
77ccc4c13ae6cf774126749a5ad8f45de0c08edbeeBen Gruver    @Override public int getCodeUnitCount() { return codeUnitCount; }
78e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
7956c7adde039ecccf074bc42258c22ae006a33d0aIzzat Bahadirov    @Nonnull @Override public ImmutableList<? extends ImmutableExceptionHandler> getExceptionHandlers() {
80e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        return exceptionHandlers;
81e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
82e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
83e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    @Nonnull
841bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public static ImmutableList<ImmutableTryBlock> immutableListOf(
851bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            @Nullable List<? extends TryBlock<? extends ExceptionHandler>> list) {
8622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        return CONVERTER.toList(list);
87e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
88e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
891bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    private static final ImmutableConverter<ImmutableTryBlock, TryBlock<? extends ExceptionHandler>> CONVERTER =
901bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            new ImmutableConverter<ImmutableTryBlock, TryBlock<? extends ExceptionHandler>>() {
91e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                @Override
92ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver                protected boolean isImmutable(@Nonnull TryBlock item) {
93e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                    return item instanceof ImmutableTryBlock;
94e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                }
95e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
96ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver                @Nonnull
97e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                @Override
981bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                protected ImmutableTryBlock makeImmutable(@Nonnull TryBlock<? extends ExceptionHandler> item) {
99e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                    return ImmutableTryBlock.of(item);
100e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                }
101e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver            };
102e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver}
103