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