1e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov/* 2e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * Copyright 2012, Google Inc. 3e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * All rights reserved. 4e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * 5e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * Redistribution and use in source and binary forms, with or without 6e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * modification, are permitted provided that the following conditions are 7e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * met: 8e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * 9e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * * Redistributions of source code must retain the above copyright 10e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * notice, this list of conditions and the following disclaimer. 11e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * * Redistributions in binary form must reproduce the above 12e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * copyright notice, this list of conditions and the following disclaimer 13e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * in the documentation and/or other materials provided with the 14e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * distribution. 15e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * * Neither the name of Google Inc. nor the names of its 16e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * contributors may be used to endorse or promote products derived from 17e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * this software without specific prior written permission. 18e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * 19e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov */ 31e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 32e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirovpackage org.jf.dexlib2.writer; 33e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 346762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport com.google.common.collect.ImmutableList; 356762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport com.google.common.collect.ImmutableSet; 366762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport com.google.common.collect.Iterables; 376762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport com.google.common.collect.Lists; 386762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.Opcode; 396762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.Opcodes; 409057764c22f050848748aac0ab31921d334c3e16Ben Gruverimport org.jf.dexlib2.ReferenceType; 416762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.builder.MethodImplementationBuilder; 426762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.builder.instruction.BuilderInstruction10x; 436762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.builder.instruction.BuilderInstruction21c; 446762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile; 456762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.iface.*; 466762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.iface.debug.DebugItem; 476762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.iface.instruction.Instruction; 486762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.iface.instruction.ReferenceInstruction; 496762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.iface.instruction.formats.Instruction21c; 506762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.iface.reference.Reference; 516762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.iface.reference.StringReference; 526762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.immutable.instruction.ImmutableInstruction10x; 536762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.writer.builder.DexBuilder; 546762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.jf.dexlib2.writer.io.MemoryDataStore; 556762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.junit.Assert; 566762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport org.junit.Test; 576762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 586762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport javax.annotation.Nonnull; 596762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport java.io.IOException; 606762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverimport java.util.List; 616762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 626762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruverpublic class JumboStringConversionTest { 636762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver @Test 646762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver public void testJumboStringConversion() throws IOException { 656762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver DexBuilder dexBuilder = DexBuilder.makeDexBuilder(15); 66e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 676762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver MethodImplementationBuilder methodBuilder = new MethodImplementationBuilder(1); 686762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver for (int i=0; i<66000; i++) { 696762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver methodBuilder.addInstruction(new BuilderInstruction21c(Opcode.CONST_STRING, 0, 706762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver dexBuilder.internStringReference(String.format("%08d", i)))); 711bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 726762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver methodBuilder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID)); 731bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 746762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver dexBuilder.internClassDef( 756762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver "Ltest;", 766762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 0, 776762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver "Ljava/lang/Object;", 786762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver null, 796762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver null, 806762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ImmutableSet.<Annotation>of(), 816762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver null, 826762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ImmutableList.of( 836762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver dexBuilder.internMethod( 846762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver "Ltest;", 856762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver "test", 866762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver null, 876762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver "V", 886762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 0, 896762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ImmutableSet.<Annotation>of(), 906762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver methodBuilder.getMethodImplementation()))); 91e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 926762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver MemoryDataStore dexStore = new MemoryDataStore(); 936762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver dexBuilder.writeTo(dexStore); 94e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 956762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver DexBackedDexFile dexFile = new DexBackedDexFile(new Opcodes(15), dexStore.getData()); 96e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 976762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null); 986762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertNotNull(classDef); 99e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 1006762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Method method = Iterables.getFirst(classDef.getMethods(), null); 1016762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertNotNull(method); 102e7ab4b681b456cb2b337ef8b31eb51746168f260Izzat Bahadirov 1036762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver MethodImplementation impl = method.getImplementation(); 1046762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertNotNull(impl); 105e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 1066762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver List<? extends Instruction> instructions = Lists.newArrayList(impl.getInstructions()); 1076762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(66001, instructions.size()); 108e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 1096762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver for (int i=0; i<65536; i++) { 1106762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(Opcode.CONST_STRING, instructions.get(i).getOpcode()); 1116762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(String.format("%08d", i), 1126762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ((StringReference)((ReferenceInstruction)instructions.get(i)).getReference()).getString()); 1138309057de3791e442a6323cde83e0b8855a0e5dbIzzat Bahadirov } 1146762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver for (int i=65536; i<66000; i++) { 1156762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(Opcode.CONST_STRING_JUMBO, instructions.get(i).getOpcode()); 1166762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(String.format("%08d", i), 1176762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ((StringReference)((ReferenceInstruction)instructions.get(i)).getReference()).getString()); 1188309057de3791e442a6323cde83e0b8855a0e5dbIzzat Bahadirov } 1196762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(Opcode.RETURN_VOID, instructions.get(66000).getOpcode()); 120e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov } 121e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 122e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 123e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov @Test 1246762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver public void testJumboStringConversion_NonMethodBuilder() throws IOException { 1256762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver DexBuilder dexBuilder = DexBuilder.makeDexBuilder(15); 126e05e01eee08cb78748a657e73f2444884f3a1663Izzat Bahadirov 1276762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver final List<Instruction> instructions = Lists.newArrayList(); 1286762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver for (int i=0; i<66000; i++) { 1296762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver final StringReference ref = dexBuilder.internStringReference(String.format("%08d", i)); 130e7ab4b681b456cb2b337ef8b31eb51746168f260Izzat Bahadirov 1316762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver instructions.add(new Instruction21c() { 1326762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver @Override public int getRegisterA() { 1336762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver return 0; 134e7ab4b681b456cb2b337ef8b31eb51746168f260Izzat Bahadirov } 135e7ab4b681b456cb2b337ef8b31eb51746168f260Izzat Bahadirov 1366762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver @Nonnull @Override public Reference getReference() { 1376762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver return ref; 138e7ab4b681b456cb2b337ef8b31eb51746168f260Izzat Bahadirov } 139add494945d9879944a2eaa6db7bcf322bae9e27eIzzat Bahadirov 1409057764c22f050848748aac0ab31921d334c3e16Ben Gruver @Override public int getReferenceType() { return ReferenceType.STRING; } 1419057764c22f050848748aac0ab31921d334c3e16Ben Gruver 1426762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver @Override public Opcode getOpcode() { 1436762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver return Opcode.CONST_STRING; 1446762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver } 145add494945d9879944a2eaa6db7bcf322bae9e27eIzzat Bahadirov 1466762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver @Override public int getCodeUnits() { 1476762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver return getOpcode().format.size / 2; 1486762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver } 1496762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver }); 150add494945d9879944a2eaa6db7bcf322bae9e27eIzzat Bahadirov } 1516762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver instructions.add(new ImmutableInstruction10x(Opcode.RETURN_VOID)); 152add494945d9879944a2eaa6db7bcf322bae9e27eIzzat Bahadirov 1536762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver MethodImplementation methodImpl = new MethodImplementation() { 1546762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver @Override public int getRegisterCount() { 1556762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver return 1; 156add494945d9879944a2eaa6db7bcf322bae9e27eIzzat Bahadirov } 1573d721348c55b6b7b68d48dafb9829adb5f1829d2Izzat Bahadirov 1586762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver @Nonnull @Override public Iterable<? extends Instruction> getInstructions() { 1596762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver return instructions; 1606762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver } 1613d721348c55b6b7b68d48dafb9829adb5f1829d2Izzat Bahadirov 1626762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver @Nonnull @Override public List<? extends TryBlock<? extends ExceptionHandler>> getTryBlocks() { 1636762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver return ImmutableList.of(); 1646762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver } 1653d721348c55b6b7b68d48dafb9829adb5f1829d2Izzat Bahadirov 1666762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver @Nonnull @Override public Iterable<? extends DebugItem> getDebugItems() { 1676762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver return ImmutableList.of(); 1683d721348c55b6b7b68d48dafb9829adb5f1829d2Izzat Bahadirov } 1696762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver }; 1706762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 1716762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver dexBuilder.internClassDef( 1726762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver "Ltest;", 1736762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 0, 1746762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver "Ljava/lang/Object;", 1756762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver null, 1766762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver null, 1776762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ImmutableSet.<Annotation>of(), 1786762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver null, 1796762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ImmutableList.of( 1806762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver dexBuilder.internMethod( 1816762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver "Ltest;", 1826762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver "test", 1836762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver null, 1846762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver "V", 1856762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 0, 1866762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ImmutableSet.<Annotation>of(), 1876762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver methodImpl))); 1886762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 1896762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver MemoryDataStore dexStore = new MemoryDataStore(); 1906762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver dexBuilder.writeTo(dexStore); 1916762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 1926762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver DexBackedDexFile dexFile = new DexBackedDexFile(new Opcodes(15), dexStore.getData()); 1936762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 1946762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null); 1956762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertNotNull(classDef); 1966762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 1976762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Method method = Iterables.getFirst(classDef.getMethods(), null); 1986762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertNotNull(method); 1996762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 2006762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver MethodImplementation impl = method.getImplementation(); 2016762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertNotNull(impl); 2026762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 2036762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver List<? extends Instruction> actualInstructions = Lists.newArrayList(impl.getInstructions()); 2046762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(66001, actualInstructions.size()); 2056762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver 2066762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver for (int i=0; i<65536; i++) { 2076762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(Opcode.CONST_STRING, actualInstructions.get(i).getOpcode()); 2086762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(String.format("%08d", i), 2096762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ((StringReference)((ReferenceInstruction)actualInstructions.get(i)).getReference()).getString()); 2106762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver } 2116762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver for (int i=65536; i<66000; i++) { 2126762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(Opcode.CONST_STRING_JUMBO, actualInstructions.get(i).getOpcode()); 2136762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(String.format("%08d", i), 2146762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver ((StringReference)((ReferenceInstruction)actualInstructions.get(i)).getReference()).getString()); 2156762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver } 2166762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver Assert.assertEquals(Opcode.RETURN_VOID, actualInstructions.get(66000).getOpcode()); 2176762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver } 2186762350ca0e11ca69ecb2c7bcf78cbafa2103ad6Ben Gruver} 219