11bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver/*
21bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * Copyright 2013, Google Inc.
31bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * All rights reserved.
41bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *
51bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * Redistribution and use in source and binary forms, with or without
61bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * modification, are permitted provided that the following conditions are
71bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * met:
81bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *
91bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *     * Redistributions of source code must retain the above copyright
101bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * notice, this list of conditions and the following disclaimer.
111bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *     * Redistributions in binary form must reproduce the above
121bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * copyright notice, this list of conditions and the following disclaimer
131bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * in the documentation and/or other materials provided with the
141bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * distribution.
151bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *     * Neither the name of Google Inc. nor the names of its
161bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * contributors may be used to endorse or promote products derived from
171bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * this software without specific prior written permission.
181bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver *
191bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
201bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
211bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
221bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
231bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
241bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
251bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
261bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
271bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
281bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
291bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
301bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver */
311bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
321bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverpackage org.jf.dexlib2.writer.pool;
331bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
341bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.iface.reference.MethodReference;
351bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.writer.MethodSection;
361bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
371bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport javax.annotation.Nonnull;
381bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
391bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverpublic class MethodPool extends BaseIndexPool<MethodReference>
4042627b850c8f68a594f105e04b97c512b292b698Ben Gruver        implements MethodSection<CharSequence, CharSequence, ProtoPool.Key, MethodReference, PoolMethod> {
411bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Nonnull private final StringPool stringPool;
421bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Nonnull private final TypePool typePool;
431bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Nonnull private final ProtoPool protoPool;
441bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
451bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public MethodPool(@Nonnull StringPool stringPool, @Nonnull TypePool typePool,
461bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver                      @Nonnull ProtoPool protoPool) {
471bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        this.stringPool = stringPool;
481bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        this.typePool = typePool;
491bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        this.protoPool = protoPool;
501bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
511bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
521bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    public void intern(@Nonnull MethodReference method) {
531bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        Integer prev = internedItems.put(method, 0);
541bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        if (prev == null) {
551bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            typePool.intern(method.getDefiningClass());
561bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            protoPool.intern(method);
571bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver            stringPool.intern(method.getName());
581bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        }
591bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
601bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
611bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Nonnull @Override public CharSequence getDefiningClass(@Nonnull MethodReference methodReference) {
621bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        return methodReference.getDefiningClass();
631bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
641bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
651bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Nonnull @Override public ProtoPool.Key getPrototype(@Nonnull MethodReference methodReference) {
661bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        return new ProtoPool.Key(methodReference);
671bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
681bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver
6942627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Nonnull @Override public ProtoPool.Key getPrototype(@Nonnull PoolMethod poolMethod) {
7042627b850c8f68a594f105e04b97c512b292b698Ben Gruver        return new ProtoPool.Key(poolMethod);
7142627b850c8f68a594f105e04b97c512b292b698Ben Gruver    }
7242627b850c8f68a594f105e04b97c512b292b698Ben Gruver
731bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    @Nonnull @Override public CharSequence getName(@Nonnull MethodReference methodReference) {
741bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver        return methodReference.getName();
751bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver    }
7642627b850c8f68a594f105e04b97c512b292b698Ben Gruver
7742627b850c8f68a594f105e04b97c512b292b698Ben Gruver    @Override public int getMethodIndex(@Nonnull PoolMethod poolMethod) {
7842627b850c8f68a594f105e04b97c512b292b698Ben Gruver        return getItemIndex(poolMethod);
7942627b850c8f68a594f105e04b97c512b292b698Ben Gruver    }
801bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver}
81