From 57d03126b86e4583d0a152300b5d1c0da2607d58 Mon Sep 17 00:00:00 2001 From: Mark Hindess Date: Mon, 22 Mar 2010 20:24:33 +0000 Subject: [PATCH] Copy classlib to federated build. git-svn-id: https://svn.apache.org/repos/asf/harmony/enhanced/trunk@926318 13f79535-47bb-0310-9956-ffa450edef68 --- .classpath | 10 + .project | 28 + .settings/org.eclipse.jdt.core.prefs | 12 + .settings/org.eclipse.jdt.ui.prefs | 50 + META-INF/MANIFEST.MF | 25 + README.txt | 5 + build.xml | 200 +++ .../manifests/asm-3.1/META-INF/MANIFEST.MF | 10 + make/depends.properties | 21 + make/exclude.common | 0 make/exclude.linux.x86.drl | 0 make/exclude.linux.x86.ibm | 0 make/exclude.linux.x86_64.drl | 0 make/exclude.linux.x86_64.ibm | 0 make/exclude.windows.x86.drl | 0 make/exclude.windows.x86.ibm | 0 make/exclude.windows.x86_64.drl | 0 make/findbugs-exclude-filter.xml | 46 + make/run-test.xml | 43 + .../org/apache/harmony/pack200/Archive.java | 328 ++++ .../pack200/AttributeDefinitionBands.java | 258 +++ .../org/apache/harmony/pack200/BHSDCodec.java | 516 ++++++ .../org/apache/harmony/pack200/BandSet.java | 808 +++++++++ .../org/apache/harmony/pack200/BcBands.java | 582 ++++++ .../org/apache/harmony/pack200/CPClass.java | 57 + .../apache/harmony/pack200/CPConstant.java | 26 + .../org/apache/harmony/pack200/CPDouble.java | 37 + .../org/apache/harmony/pack200/CPFloat.java | 37 + .../org/apache/harmony/pack200/CPInt.java | 43 + .../org/apache/harmony/pack200/CPLong.java | 48 + .../harmony/pack200/CPMethodOrField.java | 95 + .../apache/harmony/pack200/CPNameAndType.java | 73 + .../apache/harmony/pack200/CPSignature.java | 86 + .../org/apache/harmony/pack200/CPString.java | 44 + .../org/apache/harmony/pack200/CPUTF8.java | 42 + .../pack200/CanonicalCodecFamilies.java | 210 +++ .../apache/harmony/pack200/ClassBands.java | 1553 +++++++++++++++++ .../org/apache/harmony/pack200/Codec.java | 246 +++ .../apache/harmony/pack200/CodecEncoding.java | 346 ++++ .../harmony/pack200/ConstantPoolEntry.java | 34 + .../org/apache/harmony/pack200/CpBands.java | 694 ++++++++ .../org/apache/harmony/pack200/FileBands.java | 170 ++ .../org/apache/harmony/pack200/IcBands.java | 203 +++ .../org/apache/harmony/pack200/IntList.java | 253 +++ .../harmony/pack200/MetadataBandGroup.java | 375 ++++ .../apache/harmony/pack200/NewAttribute.java | 145 ++ .../harmony/pack200/NewAttributeBands.java | 968 ++++++++++ .../harmony/pack200/Pack200ClassReader.java | 110 ++ .../harmony/pack200/Pack200Exception.java | 58 + .../harmony/pack200/PackingOptions.java | 369 ++++ .../apache/harmony/pack200/PackingUtils.java | 250 +++ .../harmony/pack200/PopulationCodec.java | 169 ++ .../org/apache/harmony/pack200/RunCodec.java | 158 ++ .../org/apache/harmony/pack200/Segment.java | 676 +++++++ .../apache/harmony/pack200/SegmentHeader.java | 392 +++++ .../org/apache/harmony/unpack200/Archive.java | 245 +++ .../unpack200/AttrDefinitionBands.java | 121 ++ .../harmony/unpack200/AttributeLayout.java | 286 +++ .../harmony/unpack200/AttributeLayoutMap.java | 284 +++ .../org/apache/harmony/unpack200/BandSet.java | 551 ++++++ .../org/apache/harmony/unpack200/BcBands.java | 606 +++++++ .../apache/harmony/unpack200/ClassBands.java | 1418 +++++++++++++++ .../org/apache/harmony/unpack200/CpBands.java | 724 ++++++++ .../apache/harmony/unpack200/FileBands.java | 127 ++ .../apache/harmony/unpack200/IMatcher.java | 26 + .../org/apache/harmony/unpack200/IcBands.java | 249 +++ .../org/apache/harmony/unpack200/IcTuple.java | 370 ++++ .../harmony/unpack200/MetadataBandGroup.java | 252 +++ .../harmony/unpack200/NewAttributeBands.java | 995 +++++++++++ .../org/apache/harmony/unpack200/Segment.java | 640 +++++++ .../unpack200/SegmentConstantPool.java | 317 ++++ .../SegmentConstantPoolArrayCache.java | 182 ++ .../harmony/unpack200/SegmentHeader.java | 450 +++++ .../harmony/unpack200/SegmentOptions.java | 126 ++ .../harmony/unpack200/SegmentUtils.java | 164 ++ .../bytecode/AnnotationDefaultAttribute.java | 73 + .../bytecode/AnnotationsAttribute.java | 190 ++ .../harmony/unpack200/bytecode/Attribute.java | 115 ++ .../bytecode/BCIRenumberedAttribute.java | 78 + .../harmony/unpack200/bytecode/ByteCode.java | 383 ++++ .../harmony/unpack200/bytecode/CPClass.java | 96 + .../unpack200/bytecode/CPConstant.java | 71 + .../unpack200/bytecode/CPConstantNumber.java | 32 + .../harmony/unpack200/bytecode/CPDouble.java | 39 + .../harmony/unpack200/bytecode/CPField.java | 34 + .../unpack200/bytecode/CPFieldRef.java | 98 ++ .../harmony/unpack200/bytecode/CPFloat.java | 39 + .../harmony/unpack200/bytecode/CPInteger.java | 39 + .../bytecode/CPInterfaceMethodRef.java | 54 + .../harmony/unpack200/bytecode/CPLong.java | 39 + .../harmony/unpack200/bytecode/CPMember.java | 123 ++ .../harmony/unpack200/bytecode/CPMethod.java | 52 + .../unpack200/bytecode/CPMethodRef.java | 51 + .../unpack200/bytecode/CPNameAndType.java | 123 ++ .../harmony/unpack200/bytecode/CPRef.java | 114 ++ .../harmony/unpack200/bytecode/CPString.java | 73 + .../harmony/unpack200/bytecode/CPUTF8.java | 90 + .../unpack200/bytecode/ClassConstantPool.java | 277 +++ .../harmony/unpack200/bytecode/ClassFile.java | 73 + .../unpack200/bytecode/ClassFileEntry.java | 65 + .../unpack200/bytecode/CodeAttribute.java | 199 +++ .../unpack200/bytecode/ConstantPoolEntry.java | 83 + .../bytecode/ConstantValueAttribute.java | 90 + .../bytecode/DeprecatedAttribute.java | 68 + .../bytecode/EnclosingMethodAttribute.java | 95 + .../bytecode/ExceptionTableEntry.java | 96 + .../bytecode/ExceptionsAttribute.java | 114 ++ .../bytecode/InnerClassesAttribute.java | 185 ++ .../bytecode/LineNumberTableAttribute.java | 91 + .../bytecode/LocalVariableTableAttribute.java | 171 ++ .../LocalVariableTypeTableAttribute.java | 172 ++ .../unpack200/bytecode/NewAttribute.java | 276 +++ .../unpack200/bytecode/OperandManager.java | 242 +++ ...isibleorInvisibleAnnotationsAttribute.java | 84 + ...nvisibleParameterAnnotationsAttribute.java | 130 ++ .../bytecode/SignatureAttribute.java | 83 + .../bytecode/SourceFileAttribute.java | 92 + .../bytecode/forms/ByteCodeForm.java | 684 ++++++++ .../unpack200/bytecode/forms/ByteForm.java | 50 + .../bytecode/forms/ClassRefForm.java | 79 + .../forms/ClassSpecificReferenceForm.java | 55 + .../unpack200/bytecode/forms/DoubleForm.java | 47 + .../bytecode/forms/FieldRefForm.java | 47 + .../bytecode/forms/FloatRefForm.java | 51 + .../bytecode/forms/IMethodRefForm.java | 64 + .../unpack200/bytecode/forms/IincForm.java | 53 + .../forms/InitMethodReferenceForm.java | 60 + .../unpack200/bytecode/forms/IntRefForm.java | 52 + .../unpack200/bytecode/forms/LabelForm.java | 88 + .../unpack200/bytecode/forms/LocalForm.java | 56 + .../unpack200/bytecode/forms/LongForm.java | 47 + .../bytecode/forms/LookupSwitchForm.java | 114 ++ .../bytecode/forms/MethodRefForm.java | 49 + .../bytecode/forms/MultiANewArrayForm.java | 63 + .../bytecode/forms/NarrowClassRefForm.java | 49 + .../bytecode/forms/NewClassRefForm.java | 69 + .../bytecode/forms/NewInitMethodRefForm.java | 58 + .../bytecode/forms/NoArgumentForm.java | 52 + .../bytecode/forms/ReferenceForm.java | 69 + .../unpack200/bytecode/forms/ShortForm.java | 50 + .../forms/SingleByteReferenceForm.java | 52 + .../bytecode/forms/StringRefForm.java | 71 + .../bytecode/forms/SuperFieldRefForm.java | 53 + .../forms/SuperInitMethodRefForm.java | 41 + .../bytecode/forms/SuperMethodRefForm.java | 53 + .../unpack200/bytecode/forms/SwitchForm.java | 81 + .../bytecode/forms/TableSwitchForm.java | 117 ++ .../bytecode/forms/ThisFieldRefForm.java | 53 + .../bytecode/forms/ThisInitMethodRefForm.java | 42 + .../bytecode/forms/ThisMethodRefForm.java | 53 + .../forms/VariableInstructionForm.java | 162 ++ .../unpack200/bytecode/forms/WideForm.java | 160 ++ .../harmony/pack200/Pack200Adapter.java | 59 + .../harmony/pack200/Pack200PackerAdapter.java | 102 ++ .../unpack200/Pack200UnpackerAdapter.java | 74 + .../harmony/pack200/tests/ArchiveTest.java | 456 +++++ .../harmony/pack200/tests/BHSDCodecTest.java | 82 + .../pack200/tests/CodecEncodingTest.java | 311 ++++ .../harmony/pack200/tests/CodecTest.java | 253 +++ .../harmony/pack200/tests/HelloWorld.java | 36 + .../pack200/tests/NewAttributeBandsTest.java | 263 +++ .../pack200/tests/PopulationCodecTest.java | 67 + .../tests/AbstractBandsTestCase.java | 83 + .../harmony/unpack200/tests/ArchiveTest.java | 199 +++ .../tests/AttributeLayoutMapTest.java | 53 + .../unpack200/tests/AttributeLayoutTest.java | 142 ++ .../harmony/unpack200/tests/BandSetTest.java | 82 + .../harmony/unpack200/tests/BcBandsTest.java | 672 +++++++ .../harmony/unpack200/tests/CPUTF8Test.java | 37 + .../unpack200/tests/ClassBandsTest.java | 179 ++ .../unpack200/tests/ClassVersionTest.java | 70 + .../unpack200/tests/CodeAttributeTest.java | 203 +++ .../harmony/unpack200/tests/ICTupleTest.java | 64 + .../SegmentConstantPoolArrayCacheTest.java | 78 + .../tests/SegmentConstantPoolTest.java | 121 ++ .../unpack200/tests/SegmentOptionsTest.java | 43 + .../harmony/unpack200/tests/SegmentTest.java | 119 ++ .../unpack200/tests/SegmentUtilsTest.java | 82 + .../tests/bytecode/ByteCodeTest.java | 30 + .../tests/bytecode/ClassFileEntryTest.java | 108 ++ .../tests/bytecode/ConstantPoolTest.java | 69 + .../harmony/pack200/tests/HelloWorld.pack | Bin 0 -> 530 bytes .../harmony/pack200/tests/InterfaceOnly.pack | Bin 0 -> 137 bytes .../harmony/pack200/tests/JustResources.pack | Bin 0 -> 51 bytes .../pack200/tests/JustResources.pack.gz | Bin 0 -> 82 bytes .../harmony/pack200/tests/LargeClass.pack.gz | Bin 0 -> 752 bytes .../harmony/pack200/tests/annotations.pack.gz | Bin 0 -> 712 bytes .../pack200/tests/annotationsUnpacked.jar | Bin 0 -> 2267 bytes .../org/apache/harmony/pack200/tests/hw.jar | Bin 0 -> 842 bytes .../apache/harmony/pack200/tests/jars/ant.jar | Bin 0 -> 958858 bytes .../harmony/pack200/tests/jndi-e1.pack.gz | Bin 0 -> 75058 bytes .../org/apache/harmony/pack200/tests/jndi.jar | Bin 0 -> 236738 bytes .../harmony/pack200/tests/jndiUnpacked.jar | Bin 0 -> 232433 bytes .../pack200/tests/largeClassUnpacked.jar | Bin 0 -> 10793 bytes .../harmony/pack200/tests/pack200-e1.pack.gz | Bin 0 -> 14751 bytes .../harmony/pack200/tests/pack200.pack.gz | Bin 0 -> 10438 bytes .../harmony/pack200/tests/simple-E0.pack.gz | Bin 0 -> 598 bytes .../harmony/pack200/tests/sql-e1.pack.gz | Bin 0 -> 50618 bytes .../apache/harmony/pack200/tests/sql.pack.gz | Bin 0 -> 44351 bytes .../harmony/pack200/tests/sqlUnpacked.jar | Bin 0 -> 335442 bytes .../pack200/tests/sqlUnpackedNoDebug.jar | Bin 0 -> 243185 bytes 201 files changed, 30815 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.jdt.ui.prefs create mode 100644 META-INF/MANIFEST.MF create mode 100644 README.txt create mode 100644 build.xml create mode 100644 depends/manifests/asm-3.1/META-INF/MANIFEST.MF create mode 100644 make/depends.properties create mode 100644 make/exclude.common create mode 100644 make/exclude.linux.x86.drl create mode 100644 make/exclude.linux.x86.ibm create mode 100644 make/exclude.linux.x86_64.drl create mode 100644 make/exclude.linux.x86_64.ibm create mode 100644 make/exclude.windows.x86.drl create mode 100644 make/exclude.windows.x86.ibm create mode 100644 make/exclude.windows.x86_64.drl create mode 100644 make/findbugs-exclude-filter.xml create mode 100644 make/run-test.xml create mode 100644 src/main/java/org/apache/harmony/pack200/Archive.java create mode 100644 src/main/java/org/apache/harmony/pack200/AttributeDefinitionBands.java create mode 100644 src/main/java/org/apache/harmony/pack200/BHSDCodec.java create mode 100644 src/main/java/org/apache/harmony/pack200/BandSet.java create mode 100644 src/main/java/org/apache/harmony/pack200/BcBands.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPClass.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPConstant.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPDouble.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPFloat.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPInt.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPLong.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPMethodOrField.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPNameAndType.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPSignature.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPString.java create mode 100644 src/main/java/org/apache/harmony/pack200/CPUTF8.java create mode 100644 src/main/java/org/apache/harmony/pack200/CanonicalCodecFamilies.java create mode 100644 src/main/java/org/apache/harmony/pack200/ClassBands.java create mode 100644 src/main/java/org/apache/harmony/pack200/Codec.java create mode 100644 src/main/java/org/apache/harmony/pack200/CodecEncoding.java create mode 100644 src/main/java/org/apache/harmony/pack200/ConstantPoolEntry.java create mode 100644 src/main/java/org/apache/harmony/pack200/CpBands.java create mode 100644 src/main/java/org/apache/harmony/pack200/FileBands.java create mode 100644 src/main/java/org/apache/harmony/pack200/IcBands.java create mode 100644 src/main/java/org/apache/harmony/pack200/IntList.java create mode 100644 src/main/java/org/apache/harmony/pack200/MetadataBandGroup.java create mode 100644 src/main/java/org/apache/harmony/pack200/NewAttribute.java create mode 100644 src/main/java/org/apache/harmony/pack200/NewAttributeBands.java create mode 100644 src/main/java/org/apache/harmony/pack200/Pack200ClassReader.java create mode 100644 src/main/java/org/apache/harmony/pack200/Pack200Exception.java create mode 100644 src/main/java/org/apache/harmony/pack200/PackingOptions.java create mode 100644 src/main/java/org/apache/harmony/pack200/PackingUtils.java create mode 100644 src/main/java/org/apache/harmony/pack200/PopulationCodec.java create mode 100644 src/main/java/org/apache/harmony/pack200/RunCodec.java create mode 100644 src/main/java/org/apache/harmony/pack200/Segment.java create mode 100644 src/main/java/org/apache/harmony/pack200/SegmentHeader.java create mode 100644 src/main/java/org/apache/harmony/unpack200/Archive.java create mode 100644 src/main/java/org/apache/harmony/unpack200/AttrDefinitionBands.java create mode 100644 src/main/java/org/apache/harmony/unpack200/AttributeLayout.java create mode 100644 src/main/java/org/apache/harmony/unpack200/AttributeLayoutMap.java create mode 100644 src/main/java/org/apache/harmony/unpack200/BandSet.java create mode 100644 src/main/java/org/apache/harmony/unpack200/BcBands.java create mode 100644 src/main/java/org/apache/harmony/unpack200/ClassBands.java create mode 100644 src/main/java/org/apache/harmony/unpack200/CpBands.java create mode 100644 src/main/java/org/apache/harmony/unpack200/FileBands.java create mode 100644 src/main/java/org/apache/harmony/unpack200/IMatcher.java create mode 100644 src/main/java/org/apache/harmony/unpack200/IcBands.java create mode 100644 src/main/java/org/apache/harmony/unpack200/IcTuple.java create mode 100644 src/main/java/org/apache/harmony/unpack200/MetadataBandGroup.java create mode 100644 src/main/java/org/apache/harmony/unpack200/NewAttributeBands.java create mode 100644 src/main/java/org/apache/harmony/unpack200/Segment.java create mode 100644 src/main/java/org/apache/harmony/unpack200/SegmentConstantPool.java create mode 100644 src/main/java/org/apache/harmony/unpack200/SegmentConstantPoolArrayCache.java create mode 100644 src/main/java/org/apache/harmony/unpack200/SegmentHeader.java create mode 100644 src/main/java/org/apache/harmony/unpack200/SegmentOptions.java create mode 100644 src/main/java/org/apache/harmony/unpack200/SegmentUtils.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/AnnotationDefaultAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/AnnotationsAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/Attribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/BCIRenumberedAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/ByteCode.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPClass.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPConstant.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPConstantNumber.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPDouble.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPField.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPFieldRef.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPFloat.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPInteger.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPInterfaceMethodRef.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPLong.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPMember.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPMethod.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPMethodRef.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPNameAndType.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPRef.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPString.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CPUTF8.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/ClassConstantPool.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/ClassFile.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/ClassFileEntry.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/CodeAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/ConstantPoolEntry.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/ConstantValueAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/DeprecatedAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/EnclosingMethodAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/ExceptionTableEntry.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/ExceptionsAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/InnerClassesAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/LineNumberTableAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/LocalVariableTableAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/LocalVariableTypeTableAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/NewAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/OperandManager.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/RuntimeVisibleorInvisibleAnnotationsAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/RuntimeVisibleorInvisibleParameterAnnotationsAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/SignatureAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/SourceFileAttribute.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/ByteCodeForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/ByteForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/ClassRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/ClassSpecificReferenceForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/DoubleForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/FieldRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/FloatRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/IMethodRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/IincForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/InitMethodReferenceForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/IntRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/LabelForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/LocalForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/LongForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/LookupSwitchForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/MethodRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/MultiANewArrayForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/NarrowClassRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/NewClassRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/NewInitMethodRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/NoArgumentForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/ReferenceForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/ShortForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/SingleByteReferenceForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/StringRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperFieldRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperInitMethodRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperMethodRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/SwitchForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/TableSwitchForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisFieldRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisInitMethodRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisMethodRefForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/VariableInstructionForm.java create mode 100644 src/main/java/org/apache/harmony/unpack200/bytecode/forms/WideForm.java create mode 100644 src/main/java5/org/apache/harmony/pack200/Pack200Adapter.java create mode 100644 src/main/java5/org/apache/harmony/pack200/Pack200PackerAdapter.java create mode 100644 src/main/java5/org/apache/harmony/unpack200/Pack200UnpackerAdapter.java create mode 100644 src/test/java/org/apache/harmony/pack200/tests/ArchiveTest.java create mode 100644 src/test/java/org/apache/harmony/pack200/tests/BHSDCodecTest.java create mode 100644 src/test/java/org/apache/harmony/pack200/tests/CodecEncodingTest.java create mode 100644 src/test/java/org/apache/harmony/pack200/tests/CodecTest.java create mode 100644 src/test/java/org/apache/harmony/pack200/tests/HelloWorld.java create mode 100644 src/test/java/org/apache/harmony/pack200/tests/NewAttributeBandsTest.java create mode 100644 src/test/java/org/apache/harmony/pack200/tests/PopulationCodecTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/AbstractBandsTestCase.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/AttributeLayoutMapTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/AttributeLayoutTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/BandSetTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/BcBandsTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/CPUTF8Test.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/ClassBandsTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/ClassVersionTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/CodeAttributeTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/ICTupleTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/SegmentConstantPoolArrayCacheTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/SegmentConstantPoolTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/SegmentOptionsTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/SegmentTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/SegmentUtilsTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/bytecode/ByteCodeTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/bytecode/ClassFileEntryTest.java create mode 100644 src/test/java/org/apache/harmony/unpack200/tests/bytecode/ConstantPoolTest.java create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/HelloWorld.pack create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/InterfaceOnly.pack create mode 100755 src/test/resources/org/apache/harmony/pack200/tests/JustResources.pack create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/JustResources.pack.gz create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/LargeClass.pack.gz create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/annotations.pack.gz create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/annotationsUnpacked.jar create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/hw.jar create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/jars/ant.jar create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/jndi-e1.pack.gz create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/jndi.jar create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/jndiUnpacked.jar create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/largeClassUnpacked.jar create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/pack200-e1.pack.gz create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/pack200.pack.gz create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/simple-E0.pack.gz create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/sql-e1.pack.gz create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/sql.pack.gz create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/sqlUnpacked.jar create mode 100644 src/test/resources/org/apache/harmony/pack200/tests/sqlUnpackedNoDebug.jar diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..7e9a2ed --- /dev/null +++ b/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..3fdb7ac --- /dev/null +++ b/.project @@ -0,0 +1,28 @@ + + + pack200 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..8aa4423 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Tue Jan 09 09:46:02 GMT 2007 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.4 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning +org.eclipse.jdt.core.compiler.source=1.3 diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..5ddd4ac --- /dev/null +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,50 @@ +#Sun Feb 11 23:16:33 GMT 2007 +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=false +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.format_source_code=true +sp_cleanup.make_local_variable_final=false +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_variable_declarations_final=true +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=true +sp_cleanup.organize_imports=true +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=false +sp_cleanup.remove_trailing_whitespaces_ignore_empty=true +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=true +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=true +sp_cleanup.sort_members_all=true +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000..ad8383f --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,25 @@ +Manifest-Version: 1.0 +Specification-Title: Java Platform API Specification +Specification-Version: 1.5 +Implementation-Title: Apache Harmony +Implementation-Vendor: The Apache Software Foundation +Implementation-Vendor-Id: org.apache.harmony +Implementation-URL: http://harmony.apache.org +Bundle-ManifestVersion: 2 +Bundle-Name: Harmony Pack200 +Bundle-SymbolicName: org.apache.harmony.pack200 +Bundle-Version: 1.0.0 +Bundle-ClassPath: . +Eclipse-JREBundle: true +Import-Package: java.io;resolution:=optional, + java.lang;resolution:=optional, + java.util;resolution:=optional, + java.util.jar;resolution:=optional, + org.objectweb.asm +Export-Package: org.apache.harmony.pack200, + org.apache.harmony.unpack200, + org.apache.harmony.unpack200.bytecode, + org.apache.harmony.unpack200.bytecode.forms +Bundle-RequiredExecutionEnvironment: J2SE-1.4, + J2SE-1.5 + diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..c405e15 --- /dev/null +++ b/README.txt @@ -0,0 +1,5 @@ +The java5 source directory are files that need to be compiled under Java 5. +Currently, they're not visible in the Eclipse project. +At build time, the contents of the src/main/java5 project are be added to the +build (with a 1.5 target) and the src/main/java should be compiled with a +1.4 target. diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..898d80e --- /dev/null +++ b/build.xml @@ -0,0 +1,200 @@ + + + + + Build for PACK200 component + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/depends/manifests/asm-3.1/META-INF/MANIFEST.MF b/depends/manifests/asm-3.1/META-INF/MANIFEST.MF new file mode 100644 index 0000000..e10a573 --- /dev/null +++ b/depends/manifests/asm-3.1/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: ASM +Bundle-SymbolicName: org.objectweb.asm;singleton:=true +Bundle-Version: 3.1 +Bundle-ClassPath: asm-3.1.jar +Eclipse-JREBundle: true +Import-Package: java.io, + java.lang +Export-Package: org.objectweb.asm, org.objectweb.asm.signature diff --git a/make/depends.properties b/make/depends.properties new file mode 100644 index 0000000..636c440 --- /dev/null +++ b/make/depends.properties @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +depends.jars=${depends.dir}/jars +asm.ver=asm-3.1 +asm.dir=${depends.jars}/${asm.ver} +asm.jar=${asm.dir}/${asm.ver}.jar +asm.url=http://download.forge.objectweb.org/asm/${asm.ver}.jar +asm.md5=4fbe0fd975ecc71480846ce272b483b0 diff --git a/make/exclude.common b/make/exclude.common new file mode 100644 index 0000000..e69de29 diff --git a/make/exclude.linux.x86.drl b/make/exclude.linux.x86.drl new file mode 100644 index 0000000..e69de29 diff --git a/make/exclude.linux.x86.ibm b/make/exclude.linux.x86.ibm new file mode 100644 index 0000000..e69de29 diff --git a/make/exclude.linux.x86_64.drl b/make/exclude.linux.x86_64.drl new file mode 100644 index 0000000..e69de29 diff --git a/make/exclude.linux.x86_64.ibm b/make/exclude.linux.x86_64.ibm new file mode 100644 index 0000000..e69de29 diff --git a/make/exclude.windows.x86.drl b/make/exclude.windows.x86.drl new file mode 100644 index 0000000..e69de29 diff --git a/make/exclude.windows.x86.ibm b/make/exclude.windows.x86.ibm new file mode 100644 index 0000000..e69de29 diff --git a/make/exclude.windows.x86_64.drl b/make/exclude.windows.x86_64.drl new file mode 100644 index 0000000..e69de29 diff --git a/make/findbugs-exclude-filter.xml b/make/findbugs-exclude-filter.xml new file mode 100644 index 0000000..e192978 --- /dev/null +++ b/make/findbugs-exclude-filter.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/make/run-test.xml b/make/run-test.xml new file mode 100644 index 0000000..8268be3 --- /dev/null +++ b/make/run-test.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/apache/harmony/pack200/Archive.java b/src/main/java/org/apache/harmony/pack200/Archive.java new file mode 100644 index 0000000..89b996e --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/Archive.java @@ -0,0 +1,328 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarInputStream; +import java.util.zip.GZIPOutputStream; + +/** + * Archive is the main entry point to pack200 and represents a packed archive. + * An archive is constructed with either a JarInputStream and an output stream + * or a JarFile as input and an OutputStream. Options can be set, then + * pack() is called, to pack the Jar file into a pack200 archive. + */ +public class Archive { + + private final JarInputStream jarInputStream; + private final OutputStream outputStream; + private JarFile jarFile; + private long currentSegmentSize; + private final PackingOptions options; + + /** + * Creates an Archive with streams for the input and output. + * + * @param inputStream + * @param outputStream + * @param options - packing options (if null then defaults are used) + * @throws IOException + */ + public Archive(JarInputStream inputStream, OutputStream outputStream, + PackingOptions options) throws IOException { + jarInputStream = inputStream; + if(options == null) { + // use all defaults + options = new PackingOptions(); + } + this.options = options; + if (options.isGzip()) { + outputStream = new GZIPOutputStream(outputStream); + } + this.outputStream = new BufferedOutputStream(outputStream); + PackingUtils.config(options); + } + + /** + * Creates an Archive with the given input file and a stream for the output + * + * @param jarFile - the input file + * @param outputStream + * @param options - packing options (if null then defaults are used) + * @throws IOException + */ + public Archive(JarFile jarFile, OutputStream outputStream, + PackingOptions options) throws IOException { + if(options == null) { // use all defaults + options = new PackingOptions(); + } + this.options = options; + if (options.isGzip()) { + outputStream = new GZIPOutputStream(outputStream); + } + this.outputStream = new BufferedOutputStream(outputStream); + this.jarFile = jarFile; + jarInputStream = null; + PackingUtils.config(options); + } + + /** + * Pack the archive + * @throws Pack200Exception + * @throws IOException + */ + public void pack() throws Pack200Exception, IOException { + if (0 == options.getEffort()) { + doZeroEffortPack(); + } else { + doNormalPack(); + } + } + + private void doZeroEffortPack() throws IOException, Pack200Exception { + PackingUtils.log("Start to perform a zero-effort packing"); + if (jarInputStream != null) { + PackingUtils.copyThroughJar(jarInputStream, outputStream); + } else { + PackingUtils.copyThroughJar(jarFile, outputStream); + } + } + + private void doNormalPack() throws IOException, Pack200Exception { + PackingUtils.log("Start to perform a normal packing"); + List packingFileList; + if (jarInputStream != null) { + packingFileList = PackingUtils.getPackingFileListFromJar( + jarInputStream, options.isKeepFileOrder()); + } else { + packingFileList = PackingUtils.getPackingFileListFromJar(jarFile, + options.isKeepFileOrder()); + } + + List segmentUnitList = splitIntoSegments(packingFileList); + int previousByteAmount = 0; + int packedByteAmount = 0; + + int segmentSize = segmentUnitList.size(); + SegmentUnit segmentUnit; + for (int index = 0; index < segmentSize; index++) { + segmentUnit = (SegmentUnit) segmentUnitList.get(index); + new Segment().pack(segmentUnit, outputStream, options); + previousByteAmount += segmentUnit.getByteAmount(); + packedByteAmount += segmentUnit.getPackedByteAmount(); + } + + PackingUtils.log("Total: Packed " + previousByteAmount + + " input bytes of " + packingFileList.size() + " files into " + + packedByteAmount + " bytes in " + segmentSize + " segments"); + + outputStream.close(); + } + + private List splitIntoSegments(List packingFileList) throws IOException, + Pack200Exception { + List segmentUnitList = new ArrayList(); + List classes = new ArrayList(); + List files = new ArrayList(); + long segmentLimit = options.getSegmentLimit(); + + int size = packingFileList.size(); + PackingFile packingFile; + for (int index = 0; index < size; index++) { + packingFile = (PackingFile) packingFileList.get(index); + if (!addJarEntry(packingFile, classes, files)) { + // not added because segment has reached maximum size + segmentUnitList.add(new SegmentUnit(classes, files)); + classes = new ArrayList(); + files = new ArrayList(); + currentSegmentSize = 0; + // add the jar to a new segment + addJarEntry(packingFile, classes, files); + // ignore the size of first entry for compatibility with RI + currentSegmentSize = 0; + } else if (segmentLimit == 0 && estimateSize(packingFile) > 0) { + // create a new segment for each class unless size is 0 + segmentUnitList.add(new SegmentUnit(classes, files)); + classes = new ArrayList(); + files = new ArrayList(); + } + } + if (classes.size() > 0 && files.size() > 0) { + segmentUnitList.add(new SegmentUnit(classes, files)); + } + return segmentUnitList; + } + + private boolean addJarEntry(PackingFile packingFile, List javaClasses, + List files) throws IOException, Pack200Exception { + long segmentLimit = options.getSegmentLimit(); + if (segmentLimit != -1 && segmentLimit != 0) { + // -1 is a special case where only one segment is created and + // 0 is a special case where one segment is created for each file + // except for files in "META-INF" + long packedSize = estimateSize(packingFile); + if (packedSize + currentSegmentSize > segmentLimit + && currentSegmentSize > 0) { + // don't add this JarEntry to the current segment + return false; + } else { + // do add this JarEntry + currentSegmentSize += packedSize; + } + } + + String name = packingFile.getName(); + if (name.endsWith(".class") && !options.isPassFile(name)) { + Pack200ClassReader classParser = new Pack200ClassReader( + packingFile.contents); + classParser.setFileName(name); + javaClasses.add(classParser); + packingFile.contents = new byte[0]; + } + files.add(packingFile); + return true; + } + + private long estimateSize(PackingFile packingFile) { + // The heuristic used here is for compatibility with the RI and should + // not be changed + String name = packingFile.getName(); + if (name.startsWith("META-INF") || name.startsWith("/META-INF")) { + return 0; + } else { + long fileSize = packingFile.contents.length; + if (fileSize < 0) { + fileSize = 0; + } + return name.length() + fileSize + 5; + } + } + + static class SegmentUnit { + + private List classList; + + private List fileList; + + private int byteAmount = 0; + + private int packedByteAmount = 0; + + public SegmentUnit(List classes, List files) { + classList = classes; + fileList = files; + + // Calculate the amount of bytes in classes and files before packing + Pack200ClassReader classReader; + for (Iterator iterator = classList.iterator(); iterator.hasNext();) { + classReader = (Pack200ClassReader) iterator.next(); + byteAmount += classReader.b.length; + } + + PackingFile file; + for (Iterator iterator = fileList.iterator(); iterator.hasNext();) { + file = (PackingFile) iterator.next(); + byteAmount += file.contents.length; + } + } + + public List getClassList() { + return classList; + } + + public int classListSize() { + return classList.size(); + } + + public int fileListSize() { + return fileList.size(); + } + + public List getFileList() { + return fileList; + } + + public int getByteAmount() { + return byteAmount; + } + + public int getPackedByteAmount() { + return packedByteAmount; + } + + public void addPackedByteAmount(int amount) { + packedByteAmount += amount; + } + } + + static class PackingFile { + + private final String name; + private byte[] contents; + private final long modtime; + private final boolean deflateHint; + private final boolean isDirectory; + + public PackingFile(String name, byte[] contents, long modtime) { + this.name = name; + this.contents = contents; + this.modtime = modtime; + deflateHint = false; + isDirectory = false; + } + + public PackingFile(byte[] bytes, JarEntry jarEntry) { + name = jarEntry.getName(); + contents = bytes; + modtime = jarEntry.getTime(); + deflateHint = jarEntry.getMethod() == JarEntry.DEFLATED; + isDirectory = jarEntry.isDirectory(); + } + + public byte[] getContents() { + return contents; + } + + public String getName() { + return name; + } + + public long getModtime() { + return modtime; + } + + public void setContents(byte[] contents) { + this.contents = contents; + } + + public boolean isDefalteHint() { + return deflateHint; + } + + public boolean isDirectory(){ + return isDirectory; + } + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/AttributeDefinitionBands.java b/src/main/java/org/apache/harmony/pack200/AttributeDefinitionBands.java new file mode 100644 index 0000000..ca30d03 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/AttributeDefinitionBands.java @@ -0,0 +1,258 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.objectweb.asm.Attribute; + +/** + * Attribute Definition bands define how any unknown attributes should be read + * by the decompressor. + */ +public class AttributeDefinitionBands extends BandSet { + + public static final int CONTEXT_CLASS = 0; + public static final int CONTEXT_CODE = 3; + public static final int CONTEXT_FIELD = 1; + public static final int CONTEXT_METHOD = 2; + + private final List classAttributeLayouts = new ArrayList(); + private final List methodAttributeLayouts = new ArrayList(); + private final List fieldAttributeLayouts = new ArrayList(); + private final List codeAttributeLayouts = new ArrayList(); + + private final List attributeDefinitions = new ArrayList(); + + private final CpBands cpBands; + private final Segment segment; + + public AttributeDefinitionBands(Segment segment, int effort, + Attribute[] attributePrototypes) { + super(effort, segment.getSegmentHeader()); + this.cpBands = segment.getCpBands(); + this.segment = segment; + Map classLayouts = new HashMap(); + Map methodLayouts = new HashMap(); + Map fieldLayouts = new HashMap(); + Map codeLayouts = new HashMap(); + + for (int i = 0; i < attributePrototypes.length; i++) { + NewAttribute newAttribute = (NewAttribute) attributePrototypes[i]; + if (newAttribute.isContextClass()) { + classLayouts.put(newAttribute.type, newAttribute.getLayout()); + } + if (newAttribute.isContextMethod()) { + methodLayouts.put(newAttribute.type, newAttribute.getLayout()); + } + if (newAttribute.isContextField()) { + fieldLayouts.put(newAttribute.type, newAttribute.getLayout()); + } + if (newAttribute.isContextCode()) { + codeLayouts.put(newAttribute.type, newAttribute.getLayout()); + } + } + if (classLayouts.keySet().size() > 7) { + segmentHeader.setHave_class_flags_hi(true); + } + if (methodLayouts.keySet().size() > 6) { + segmentHeader.setHave_method_flags_hi(true); + } + if (fieldLayouts.keySet().size() > 10) { + segmentHeader.setHave_field_flags_hi(true); + } + if (codeLayouts.keySet().size() > 15) { + segmentHeader.setHave_code_flags_hi(true); + } + int[] availableClassIndices = new int[] { 25, 26, 27, 28, 29, 30, 31 }; + if (classLayouts.size() > 7) { + availableClassIndices = addHighIndices(availableClassIndices); + } + addAttributeDefinitions(classLayouts, availableClassIndices, + CONTEXT_CLASS); + int[] availableMethodIndices = new int[] { 26, 27, 28, 29, 30, 31 }; + if (methodAttributeLayouts.size() > 6) { + availableMethodIndices = addHighIndices(availableMethodIndices); + } + addAttributeDefinitions(methodLayouts, availableMethodIndices, + CONTEXT_METHOD); + int[] availableFieldIndices = new int[] { 18, 23, 24, 25, 26, 27, 28, + 29, 30, 31 }; + if (fieldAttributeLayouts.size() > 10) { + availableFieldIndices = addHighIndices(availableFieldIndices); + } + addAttributeDefinitions(fieldLayouts, availableFieldIndices, + CONTEXT_FIELD); + int[] availableCodeIndices = new int[] { 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31 }; + if (codeAttributeLayouts.size() > 15) { + availableCodeIndices = addHighIndices(availableCodeIndices); + } + addAttributeDefinitions(codeLayouts, availableCodeIndices, CONTEXT_CODE); + } + + /** + * All input classes for the segment have now been read in, so this method + * is called so that this class can calculate/complete anything it could not + * do while classes were being read. + */ + public void finaliseBands() { + addSyntheticDefinitions(); + segmentHeader.setAttribute_definition_count(attributeDefinitions.size()); + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + PackingUtils.log("Writing attribute definition bands..."); + int[] attributeDefinitionHeader = new int[attributeDefinitions.size()]; + int[] attributeDefinitionName = new int[attributeDefinitions.size()]; + int[] attributeDefinitionLayout = new int[attributeDefinitions.size()]; + for (int i = 0; i < attributeDefinitionLayout.length; i++) { + AttributeDefinition def = (AttributeDefinition) attributeDefinitions + .get(i); + attributeDefinitionHeader[i] = def.contextType + | (def.index + 1 << 2); + attributeDefinitionName[i] = def.name.getIndex(); + attributeDefinitionLayout[i] = def.layout.getIndex(); + } + + byte[] encodedBand = encodeBandInt("attributeDefinitionHeader", + attributeDefinitionHeader, Codec.BYTE1); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from attributeDefinitionHeader[" + + attributeDefinitionHeader.length + "]"); + + encodedBand = encodeBandInt("attributeDefinitionName", + attributeDefinitionName, Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from attributeDefinitionName[" + + attributeDefinitionName.length + "]"); + + encodedBand = encodeBandInt("attributeDefinitionLayout", + attributeDefinitionLayout, Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from attributeDefinitionLayout[" + + attributeDefinitionLayout.length + "]"); + } + + private void addSyntheticDefinitions() { + boolean anySytheticClasses = segment.getClassBands() + .isAnySyntheticClasses(); + boolean anySyntheticMethods = segment.getClassBands() + .isAnySyntheticMethods(); + boolean anySyntheticFields = segment.getClassBands() + .isAnySyntheticFields(); + if (anySytheticClasses || anySyntheticMethods || anySyntheticFields) { + CPUTF8 syntheticUTF = cpBands.getCPUtf8("Synthetic"); + CPUTF8 emptyUTF = cpBands.getCPUtf8(""); + if (anySytheticClasses) { + attributeDefinitions.add(new AttributeDefinition(12, + CONTEXT_CLASS, syntheticUTF, emptyUTF)); + } + if (anySyntheticMethods) { + attributeDefinitions.add(new AttributeDefinition(12, + CONTEXT_METHOD, syntheticUTF, emptyUTF)); + } + if (anySyntheticFields) { + attributeDefinitions.add(new AttributeDefinition(12, + CONTEXT_FIELD, syntheticUTF, emptyUTF)); + } + } + } + + private int[] addHighIndices(int[] availableIndices) { + int[] temp = new int[availableIndices.length + 32]; + for (int i = 0; i < availableIndices.length; i++) { + temp[i] = availableIndices[i]; + } + int j = 32; + for (int i = availableIndices.length; i < temp.length; i++) { + temp[i] = j; + j++; + } + return temp; + } + + private void addAttributeDefinitions(Map layouts, int[] availableIndices, + int contextType) { + int i = 0; + for (Iterator iterator = layouts.keySet().iterator(); iterator + .hasNext();) { + String name = (String) iterator.next(); + String layout = (String) layouts.get(name); + int index = availableIndices[i]; + AttributeDefinition definition = new AttributeDefinition(index, + contextType, cpBands.getCPUtf8(name), cpBands + .getCPUtf8(layout)); + attributeDefinitions.add(definition); + switch (contextType) { + case CONTEXT_CLASS: + classAttributeLayouts.add(definition); + break; + case CONTEXT_METHOD: + methodAttributeLayouts.add(definition); + break; + case CONTEXT_FIELD: + fieldAttributeLayouts.add(definition); + break; + case CONTEXT_CODE: + codeAttributeLayouts.add(definition); + } + } + } + + public List getClassAttributeLayouts() { + return classAttributeLayouts; + } + + public List getMethodAttributeLayouts() { + return methodAttributeLayouts; + } + + public List getFieldAttributeLayouts() { + return fieldAttributeLayouts; + } + + public List getCodeAttributeLayouts() { + return codeAttributeLayouts; + } + + public static class AttributeDefinition { + + public int index; + public int contextType; + public CPUTF8 name; + public CPUTF8 layout; + + public AttributeDefinition(int index, int contextType, CPUTF8 name, + CPUTF8 layout) { + this.index = index; + this.contextType = contextType; + this.name = name; + this.layout = layout; + } + + } +} diff --git a/src/main/java/org/apache/harmony/pack200/BHSDCodec.java b/src/main/java/org/apache/harmony/pack200/BHSDCodec.java new file mode 100644 index 0000000..8836098 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/BHSDCodec.java @@ -0,0 +1,516 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + + +/** + * A BHSD codec is a means of encoding integer values as a sequence of bytes or + * vice versa using a specified "BHSD" encoding mechanism. It uses a + * variable-length encoding and a modified sign representation such that small + * numbers are represented as a single byte, whilst larger numbers take more + * bytes to encode. The number may be signed or unsigned; if it is unsigned, it + * can be weighted towards positive numbers or equally distributed using a one's + * complement. The Codec also supports delta coding, where a sequence of numbers + * is represented as a series of first-order differences. So a delta encoding of + * the integers [1..10] would be represented as a sequence of 10x1s. This allows + * the absolute value of a coded integer to fall outside of the 'small number' + * range, whilst still being encoded as a single byte. + * + * A BHSD codec is configured with four parameters: + *
+ *
B
+ *
The maximum number of bytes that each value is encoded as. B must be a + * value between [1..5]. For a pass-through coding (where each byte is encoded + * as itself, aka {@link #BYTE1}, B is 1 (each byte takes a maximum of 1 byte).
+ *
H
+ *
The radix of the integer. Values are defined as a sequence of values, + * where value n is multiplied by H^n. + * So the number 1234 may be represented as the sequence 4 3 2 1 with a radix + * (H) of 10. Note that other permutations are also possible; 43 2 1 will also + * encode 1234. The co-parameter L is defined as 256-H. This is important + * because only the last value in a sequence may be < L; all prior values + * must be > L.
+ *
S
+ *
Whether the codec represents signed values (or not). This may have 3 + * values; 0 (unsigned), 1 (signed, one's complement) or 2 (signed, two's + * complement)
+ *
D
+ *
Whether the codec represents a delta encoding. This may be 0 (no delta) + * or 1 (delta encoding). A delta encoding of 1 indicates that values are + * cumulative; a sequence of 1 1 1 1 1 will represent the + * sequence 1 2 3 4 5. For this reason, the codec supports two + * variants of decode; one {@link #decode(InputStream, long) with} and one + * {@link #decode(InputStream) without} a last parameter. If the + * codec is a non-delta encoding, then the value is ignored if passed. If the + * codec is a delta encoding, it is a run-time error to call the value without + * the extra parameter, and the previous value should be returned. (It was + * designed this way to support multi-threaded access without requiring a new + * instance of the Codec to be cloned for each use.) + *
+ *
+ * + * Codecs are notated as (B,H,S,D) and either D or S,D may be omitted if zero. + * Thus {@link #BYTE1} is denoted (1,256,0,0) or (1,256). The + * {@link #toString()} method prints out the condensed form of the encoding. + * Often, the last character in the name ({@link #BYTE1}, {@link #UNSIGNED5}) + * gives a clue as to the B value. Those that start with U ({@link #UDELTA5}, + * {@link #UNSIGNED5}) are unsigned; otherwise, in most cases, they are signed. + * The presence of the word Delta ({@link #DELTA5}, {@link #UDELTA5}) + * indicates a delta encoding is used. + * + */ +public final class BHSDCodec extends Codec { + + /** + * The maximum number of bytes in each coding word + */ + private final int b; + + /** + * Whether delta encoding is used (0=false,1=true) + */ + private final int d; + + /** + * The radix of the encoding + */ + private final int h; + + /** + * The co-parameter of h; 256-h + */ + private final int l; + + /** + * Represents signed numbers or not (0=unsigned,1/2=signed) + */ + private final int s; + + private long cardinality; + + private final long smallest; + + private final long largest; + + /** + * radix^i powers + */ + private final long[] powers; + + /** + * Constructs an unsigned, non-delta Codec with the given B and H values. + * + * @param b + * the maximum number of bytes that a value can be encoded as + * [1..5] + * @param h + * the radix of the encoding [1..256] + */ + public BHSDCodec(int b, int h) { + this(b, h, 0, 0); + } + + /** + * Constructs a non-delta Codec with the given B, H and S values. + * + * @param b + * the maximum number of bytes that a value can be encoded as + * [1..5] + * @param h + * the radix of the encoding [1..256] + * @param s + * whether the encoding represents signed numbers (s=0 is + * unsigned; s=1 is signed with 1s complement; s=2 is signed with ?) + */ + public BHSDCodec(int b, int h, int s) { + this(b, h, s, 0); + } + + /** + * Constructs a Codec with the given B, H, S and D values. + * + * @param b + * the maximum number of bytes that a value can be encoded as + * [1..5] + * @param h + * the radix of the encoding [1..256] + * @param s + * whether the encoding represents signed numbers (s=0 is + * unsigned; s=1 is signed with 1s complement; s=2 is signed with ?) + * @param d + * whether this is a delta encoding (d=0 is non-delta; d=1 is + * delta) + */ + public BHSDCodec(int b, int h, int s, int d) { + if (b < 1 || b > 5) { + throw new IllegalArgumentException("1<=b<=5"); + } + if (h < 1 || h > 256) { + throw new IllegalArgumentException("1<=h<=256"); + } + if (s < 0 || s > 2) { + throw new IllegalArgumentException("0<=s<=2"); + } + if (d < 0 || d > 1) { + throw new IllegalArgumentException("0<=d<=1"); + } + if (b == 1 && h != 256) { + throw new IllegalArgumentException("b=1 -> h=256"); + } + if (h == 256 && b == 5) { + throw new IllegalArgumentException("h=256 -> b!=5"); + } + this.b = b; + this.h = h; + this.s = s; + this.d = d; + this.l = 256 - h; + if (h == 1) { + cardinality = b * 255 + 1; + } else { + cardinality = (long) ((long) (l * (1 - Math.pow(h, b)) / (1 - h)) + Math + .pow(h, b)); + } + smallest = calculateSmallest(); + largest = calculateLargest(); + + powers = new long[b]; + for(int c = 0; c < b; c++) { + powers[c] = (long)Math.pow(h, c); + } + } + + /** + * Returns the cardinality of this codec; that is, the number of distinct + * values that it can contain. + * + * @return the cardinality of this codec + */ + public long cardinality() { + return cardinality; + } + + public int decode(InputStream in) throws IOException, Pack200Exception { + if (d != 0) { + throw new Pack200Exception( + "Delta encoding used without passing in last value; this is a coding error"); + } + return decode(in, 0); + } + + public int decode(InputStream in, long last) throws IOException, + Pack200Exception { + int n = 0; + long z = 0; + long x = 0; + + do { + x = in.read(); + lastBandLength ++; + z += x * powers[n]; + n++; + } while (x >= l && n < b); + + if (x == -1) { + throw new EOFException("End of stream reached whilst decoding"); + } + + if (isSigned()) { + int u = ((1 << s) - 1); + if ((z & u) == u) { + z = z >>> s ^ -1L; + } else { + z = z - (z >>> s); + } + } + // This algorithm does the same thing, but is probably slower. Leaving + // in for now for readability + // if(isSigned()) { + // long u = z; + // long twoPowS = (long)Math.pow(2, s); + // double twoPowSMinusOne = twoPowS-1; + // if(u % twoPowS < twoPowSMinusOne) { + // if(cardinality < Math.pow(2, 32)) { + // z = (long) (u - (Math.floor(u/ twoPowS))); + // } else { + // z = cast32((long) (u - (Math.floor(u/ twoPowS)))); + // } + // } else { + // z = (long) (-Math.floor(u/ twoPowS) - 1); + // } + // } + if (isDelta()) { + z += last; + } + return (int)z; + } + + public int[] decodeInts(int n, InputStream in) throws IOException, + Pack200Exception { + int[] band = super.decodeInts(n, in); + if (isDelta()) { + for (int i = 0; i < band.length; i++) { + while (band[i] > largest) { + band[i] -= cardinality; + } + while (band[i] < smallest) { + band[i] += cardinality; + } + } + } + return band; + } + + public int[] decodeInts(int n, InputStream in, int firstValue) + throws IOException, Pack200Exception { + int[] band = super.decodeInts(n, in, firstValue); + if (isDelta()) { + for (int i = 0; i < band.length; i++) { + while (band[i] > largest) { + band[i] -= cardinality; + } + while (band[i] < smallest) { + band[i] += cardinality; + } + } + } + return band; + } + + // private long cast32(long u) { + // u = (long) ((long) ((u + Math.pow(2, 31)) % Math.pow(2, 32)) - + // Math.pow(2, 31)); + // return u; + // } + + /** + * True if this encoding can code the given value + * + * @param value + * the value to check + * @return true if the encoding can encode this value + */ + public boolean encodes(long value) { + return value >= smallest && value <= largest; + } + + public byte[] encode(int value, int last) throws Pack200Exception { + if(!encodes(value)) { + throw new Pack200Exception("The codec " + toString() + + " does not encode the value " + value); + } + + long z = value; + if (isDelta()) { + z -= last; + } + if (isSigned()) { + if(z < Integer.MIN_VALUE) { + z += 4294967296L; + } else if (z > Integer.MAX_VALUE) { + z -= 4294967296L; + } + if (z < 0) { + z = (-z << s) - 1; + } else { + if (s == 1) { + z = z << s; + } else { + z += (z - z % 3) / 3; + } + } + } else { + if (z < 0) { + // Need to use integer overflow here to represent negatives. + if (cardinality < 4294967296L) { + z += cardinality; + } else { + z += 4294967296L; // this value is equal to (1 << 32). + } + } + } + if (z < 0) { + throw new Pack200Exception("unable to encode"); + } + + List byteList = new ArrayList(); + for (int n = 0; n < b; n++) { + long byteN; + if (z < l) { + byteN = z; + } else { + byteN = z % h; + while (byteN < l) { + byteN += h; + } + } + byteList.add(new Byte((byte) byteN)); + if (byteN < l) { + break; + } + z -= byteN; + z /= h; + } + byte[] bytes = new byte[byteList.size()]; + for (int i = 0; i < bytes.length; i++) { + bytes[i] = ((Byte) byteList.get(i)).byteValue(); + } + return bytes; + } + + public byte[] encode(int value) throws Pack200Exception { + return encode(value, 0); + } + + /** + * Returns true if this codec is a delta codec + * + * @return true if this codec is a delta codec + */ + public boolean isDelta() { + return d != 0; + } + + /** + * Returns true if this codec is a signed codec + * + * @return true if this codec is a signed codec + */ + public boolean isSigned() { + return s != 0; + } + + /** + * Returns the largest value that this codec can represent. + * + * @return the largest value that this codec can represent. + */ + public long largest() { + return largest; + } + + private long calculateLargest() { + long result; + // TODO This can probably be optimized into a better mathematical + // statement + if (d == 1) { + BHSDCodec bh0 = new BHSDCodec(b, h); + return bh0.largest(); + } else if (s == 0) { + result = cardinality() - 1; + } else if (s == 1) { + result = cardinality() / 2 - 1; + } else if (s == 2) { + result = (3L * cardinality()) / 4 - 1; + } else { + throw new Error("Unknown s value"); + } + return Math.min((s == 0 ? ((long) Integer.MAX_VALUE) << 1 + : Integer.MAX_VALUE) - 1, result); + } + + /** + * Returns the smallest value that this codec can represent. + * + * @return the smallest value that this codec can represent. + */ + public long smallest() { + return smallest; + } + + private long calculateSmallest() { + long result; + if (d == 1 || !isSigned()) { + if (cardinality >= 4294967296L) { // 2^32 + result = Integer.MIN_VALUE; + } else { + result = 0; + } + } else { + result = Math.max(Integer.MIN_VALUE, -cardinality() / (1 << s)); + } + return result; + } + + /** + * Returns the codec in the form (1,256) or (1,64,1,1). Note that trailing + * zero fields are not shown. + */ + public String toString() { + StringBuffer buffer = new StringBuffer(11); + buffer.append('('); + buffer.append(b); + buffer.append(','); + buffer.append(h); + if (s != 0 || d != 0) { + buffer.append(','); + buffer.append(s); + } + if (d != 0) { + buffer.append(','); + buffer.append(d); + } + buffer.append(')'); + return buffer.toString(); + } + + /** + * @return the b + */ + public int getB() { + return b; + } + + /** + * @return the h + */ + public int getH() { + return h; + } + + /** + * @return the s + */ + public int getS() { + return s; + } + + /** + * @return the l + */ + public int getL() { + return l; + } + + public boolean equals(Object o) { + if (o instanceof BHSDCodec) { + BHSDCodec codec = (BHSDCodec) o; + return codec.b == b && codec.h == h && codec.s == s && codec.d == d; + } + return false; + } + + public int hashCode() { + return ((b* 37 + h) * 37 + s) * 37 + d; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/BandSet.java b/src/main/java/org/apache/harmony/pack200/BandSet.java new file mode 100644 index 0000000..a45dd83 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/BandSet.java @@ -0,0 +1,808 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * Abstract superclass for a set of bands + */ +public abstract class BandSet { + + protected final SegmentHeader segmentHeader; + final int effort; + + // Minimum size of band for each effort level where we consider alternative codecs + // Note: these values have been tuned - please test carefully if changing them + private static final int[] effortThresholds = new int[] {0, 0, 1000, 500, 100, 100, 100, 100, 100, 0}; + + private long[] canonicalLargest; + private long[] canonicalSmallest; + + /** + * Create a new BandSet + * @param effort - the packing effort to be used (must be 1-9) + * @param header - the segment header + */ + public BandSet(int effort, SegmentHeader header) { + this.effort = effort; + this.segmentHeader = header; + } + + /** + * Write the packed set of bands to the given output stream + * @param out + * @throws IOException + * @throws Pack200Exception + */ + public abstract void pack(OutputStream out) throws IOException, Pack200Exception; + + /** + * Encode a band without considering other Codecs + * @param band - the band + * @param codec - the Codec to use + * @return the encoded band + * @throws Pack200Exception + */ + public byte[] encodeScalar(int[] band, BHSDCodec codec) throws Pack200Exception { + return codec.encode(band); + } + + /** + * Encode a single value with the given Codec + * @param value - the value to encode + * @param codec - Codec to use + * @return the encoded value + * @throws Pack200Exception + */ + public byte[] encodeScalar(int value, BHSDCodec codec) throws Pack200Exception { + return codec.encode(value); + } + + /** + * Encode a band of integers. The default codec may be used, but other + * Codecs are considered if effort is greater than 1. + * + * @param name + * - name of the band (used for debugging) + * @param ints + * - the band + * @param defaultCodec + * - the default Codec + * @return the encoded band + * @throws Pack200Exception + */ + public byte[] encodeBandInt(String name, int[] ints, BHSDCodec defaultCodec) throws Pack200Exception { + byte[] encodedBand = null; + // Useful for debugging +// if(ints.length > 0) { +// System.out.println("encoding " + name + " " + ints.length); +// } + if(effort > 1 && (ints.length >= effortThresholds[effort])) { + BandAnalysisResults results = analyseBand(name, ints, defaultCodec); + Codec betterCodec = results.betterCodec; + encodedBand = results.encodedBand; + if(betterCodec != null) { + if(betterCodec instanceof BHSDCodec) { + int[] specifierBand = CodecEncoding.getSpecifier(betterCodec, defaultCodec); + int specifier = specifierBand[0]; + if(specifierBand.length > 1) { + for (int i = 1; i < specifierBand.length; i++) { + segmentHeader.appendBandCodingSpecifier(specifierBand[i]); + } + } + if(defaultCodec.isSigned()) { + specifier = -1 -specifier; + } else { + specifier = specifier + defaultCodec.getL(); + } + byte[] specifierEncoded = defaultCodec.encode(new int[] {specifier}); + byte[] band = new byte[specifierEncoded.length + encodedBand.length]; + System.arraycopy(specifierEncoded, 0, band, 0, specifierEncoded.length); + System.arraycopy(encodedBand, 0, band, specifierEncoded.length, encodedBand.length); + return band; + } else if (betterCodec instanceof PopulationCodec) { + int[] extraSpecifierInfo = results.extraMetadata; + for (int i = 0; i < extraSpecifierInfo.length; i++) { + segmentHeader.appendBandCodingSpecifier(extraSpecifierInfo[i]); + } + return encodedBand; + } else if (betterCodec instanceof RunCodec) { + + } + } + } + + // If we get here then we've decided to use the default codec. + if(ints.length > 0) { + if(encodedBand == null) { + encodedBand = defaultCodec.encode(ints); + } + int first = ints[0]; + if(defaultCodec.getB() != 1) { + if (defaultCodec.isSigned() && first >= -256 && first <= -1) { + int specifier = -1 - CodecEncoding.getSpecifierForDefaultCodec(defaultCodec); + byte[] specifierEncoded = defaultCodec.encode(new int[] {specifier}); + byte[] band = new byte[specifierEncoded.length + encodedBand.length]; + System.arraycopy(specifierEncoded, 0, band, 0, specifierEncoded.length); + System.arraycopy(encodedBand, 0, band, specifierEncoded.length, encodedBand.length); + return band; + } else if (!defaultCodec.isSigned() && first >= defaultCodec.getL() + && first <= defaultCodec.getL() + 255) { + int specifier = CodecEncoding.getSpecifierForDefaultCodec(defaultCodec) + defaultCodec.getL(); + byte[] specifierEncoded = defaultCodec.encode(new int[] {specifier}); + byte[] band = new byte[specifierEncoded.length + encodedBand.length]; + System.arraycopy(specifierEncoded, 0, band, 0, specifierEncoded.length); + System.arraycopy(encodedBand, 0, band, specifierEncoded.length, encodedBand.length); + return band; + } + } + return encodedBand; + } + return new byte[0]; + } + + private BandAnalysisResults analyseBand(String name, int[] band, + BHSDCodec defaultCodec) throws Pack200Exception { + + BandAnalysisResults results = new BandAnalysisResults(); + + if(canonicalLargest == null) { + canonicalLargest = new long[116]; + canonicalSmallest = new long[116]; + for (int i = 1; i < canonicalLargest.length; i++) { + canonicalLargest[i] = CodecEncoding.getCanonicalCodec(i).largest(); + canonicalSmallest[i] = CodecEncoding.getCanonicalCodec(i).smallest(); + } + } + BandData bandData = new BandData(band); + + // Check that there is a reasonable saving to be made + byte[] encoded = defaultCodec.encode(band); + results.encodedBand = encoded; + + // Note: these values have been tuned - please test carefully if changing them + if(encoded.length <= band.length + 23 - 2*effort) { // TODO: tweak + return results; + } + + // Check if we can use BYTE1 as that's a 1:1 mapping if we can + if(!bandData.anyNegatives() && bandData.largest <= Codec.BYTE1.largest()) { + results.encodedBand = Codec.BYTE1.encode(band) ; + results.betterCodec = Codec.BYTE1; + return results; + } + + // Consider a population codec (but can't be nested) + if(effort > 3 && !name.equals("POPULATION")) { + int numDistinctValues = bandData.numDistinctValues(); + float distinctValuesAsProportion = (float)numDistinctValues / (float)band.length; + + // Note: these values have been tuned - please test carefully if changing them + if(numDistinctValues < 100 || distinctValuesAsProportion < 0.02 || (effort > 6 && distinctValuesAsProportion < 0.04)) { // TODO: tweak + encodeWithPopulationCodec(name, band, defaultCodec, bandData, results); + if(timeToStop(results)) { + return results; + } + } + } + + List codecFamiliesToTry = new ArrayList(); + + // See if the deltas are mainly small increments + if(bandData.mainlyPositiveDeltas() && bandData.mainlySmallDeltas()) { + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaUnsignedCodecs2); + } + + if (bandData.wellCorrelated()) { // Try delta encodings + if (bandData.mainlyPositiveDeltas()) { + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaUnsignedCodecs1); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaUnsignedCodecs3); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaUnsignedCodecs4); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaUnsignedCodecs5); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaUnsignedCodecs1); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaUnsignedCodecs3); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaUnsignedCodecs4); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaUnsignedCodecs5); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaUnsignedCodecs2); + } else { + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaSignedCodecs1); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaSignedCodecs3); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaSignedCodecs2); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaSignedCodecs4); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaSignedCodecs5); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaSignedCodecs1); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaSignedCodecs2); + } + } else { + if (bandData.anyNegatives()) { + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaSignedCodecs1); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaSignedCodecs2); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaSignedCodecs1); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaSignedCodecs2); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaSignedCodecs3); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaSignedCodecs4); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaSignedCodecs5); + } else { + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaUnsignedCodecs1); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaUnsignedCodecs3); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaUnsignedCodecs4); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaUnsignedCodecs5); + codecFamiliesToTry.add(CanonicalCodecFamilies.nonDeltaUnsignedCodecs2); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaUnsignedCodecs1); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaUnsignedCodecs3); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaUnsignedCodecs4); + codecFamiliesToTry.add(CanonicalCodecFamilies.deltaUnsignedCodecs5); + } + } + if(name.equalsIgnoreCase("cpint")) { + System.out.print(""); + } + + for (Iterator iterator = codecFamiliesToTry.iterator(); iterator + .hasNext();) { + BHSDCodec[] family = (BHSDCodec[]) iterator.next(); + tryCodecs(name, band, defaultCodec, bandData, results, encoded, + family); + if (timeToStop(results)) { + break; + } + } + + return results; + } + + private boolean timeToStop(BandAnalysisResults results) { + // if tried more than effort number of codecs for this band then return + // Note: these values have been tuned - please test carefully if changing them + if(effort > 6) { + return results.numCodecsTried >= effort * 2; + } + return results.numCodecsTried >= effort; + // May want to also check how much we've saved if performance needs improving, e.g. saved more than effort*2 % + // || (float)results.saved/(float)results.encodedBand.length > (float)effort * 2/100; + } + + private void tryCodecs(String name, int[] band, BHSDCodec defaultCodec, BandData bandData, + BandAnalysisResults results, byte[] encoded, + BHSDCodec[] potentialCodecs) throws Pack200Exception { + for (int i = 0; i < potentialCodecs.length; i++) { + BHSDCodec potential = potentialCodecs[i]; + if(potential.equals(defaultCodec)) { + return; // don't try codecs with greater cardinality in the same 'family' as the default codec as there won't be any savings + } + if (potential.isDelta()) { + if (potential.largest() >= bandData.largestDelta + && potential.smallest() <= bandData.smallestDelta + && potential.largest() >= bandData.largest + && potential.smallest() <= bandData.smallest) { + // TODO: can represent some negative deltas with overflow + byte[] encoded2 = potential.encode(band); + results.numCodecsTried++; + byte[] specifierEncoded = defaultCodec.encode(CodecEncoding + .getSpecifier(potential, null)); + int saved = encoded.length - encoded2.length + - specifierEncoded.length; + if (saved > results.saved) { + results.betterCodec = potential; + results.encodedBand = encoded2; + results.saved = saved; + } + } + } else if (potential.largest() >= bandData.largest + && potential.smallest() <= bandData.smallest) { + byte[] encoded2 = potential.encode(band); + results.numCodecsTried++; + byte[] specifierEncoded = defaultCodec.encode(CodecEncoding + .getSpecifier(potential, null)); + int saved = encoded.length - encoded2.length + - specifierEncoded.length; + if (saved > results.saved) { + results.betterCodec = potential; + results.encodedBand = encoded2; + results.saved = saved; + } + } + if(timeToStop(results)) { + return; + } + } + } + + /** + * Returns true if the name of the source file can be predicted from the + * class name + * + * @param className + * the class name + * @param sourceFileName + * the source file name + */ + public boolean isPredictableSourceFileName(String className, String sourceFileName) { + if (className.indexOf('.') != -1) { + className = className.substring(className.lastIndexOf('.') + 1); + } + if (className.indexOf('$') != -1) { + className = className.substring(0, className.indexOf('$')); + } + className += ".java"; + return className.equals(sourceFileName); + } + +// This could be useful if further enhancements are done but is not currently used +// +// private void encodeWithRunCodec(String name, int[] band, int index, +// BHSDCodec defaultCodec, BandData bandData, +// BandAnalysisResults results) throws Pack200Exception { +// int[] firstBand = new int[index]; +// int[] secondBand = new int[band.length - index]; +// System.arraycopy(band, 0, firstBand, 0, index); +// System.arraycopy(band, index, secondBand, 0, secondBand.length); +// BandAnalysisResults firstResults = analyseBand(name + "A", firstBand, defaultCodec); +// BandAnalysisResults secondResults = analyseBand(name + "B", secondBand, defaultCodec); +// int specifier = 117; +// byte[] specifierEncoded = defaultCodec.encode(new int[] {specifier}); +// int totalLength = firstResults.encodedBand.length + secondResults.encodedBand.length + specifierEncoded.length + 4; // TODO actual +// if(totalLength < results.encodedBand.length) { +// System.out.println("using run codec"); +// results.saved += results.encodedBand.length - totalLength; +// byte[] encodedBand = new byte[specifierEncoded.length + firstResults.encodedBand.length + secondResults.encodedBand.length]; +// System.arraycopy(specifierEncoded, 0, encodedBand, 0, specifierEncoded.length); +// System.arraycopy(firstResults.encodedBand, 0, encodedBand, specifierEncoded.length, firstResults.encodedBand.length); +// System.arraycopy(secondResults.encodedBand, 0, encodedBand, specifierEncoded.length + firstResults.encodedBand.length, secondResults.encodedBand.length); +// results.encodedBand = encodedBand; +// results.betterCodec = new RunCodec(index, firstResults.betterCodec, secondResults.betterCodec); +// } +// } + + private void encodeWithPopulationCodec(String name, int[] band, + BHSDCodec defaultCodec, BandData bandData, BandAnalysisResults results) throws Pack200Exception { + results.numCodecsTried += 3; // quite a bit more effort to try this codec + final Map distinctValues = bandData.distinctValues; + + List favoured = new ArrayList(); + for (Iterator iterator = distinctValues.keySet().iterator(); iterator + .hasNext();) { + Integer value = (Integer) iterator.next(); + Integer count = (Integer) distinctValues.get(value); + if(count.intValue() > 2 || distinctValues.size() < 256) { // TODO: tweak + favoured.add(value); + } + } + + // Sort the favoured list with the most commonly occurring first + if(distinctValues.size() > 255) { + Collections.sort(favoured, new Comparator() { + public int compare(Object arg0, Object arg1) { + return ((Integer)distinctValues.get(arg1)).compareTo((Integer)distinctValues.get(arg0)); + } + }); + } + + IntList unfavoured = new IntList(); + Map favouredToIndex = new HashMap(); + for (int i = 0; i < favoured.size(); i++) { + Integer value = (Integer) favoured.get(i); + favouredToIndex.put(value, new Integer(i)); + } + + int[] tokens = new int[band.length]; + for (int i = 0; i < band.length; i++) { + Integer favouredIndex = (Integer)favouredToIndex.get(new Integer(band[i])); + if(favouredIndex == null) { + tokens[i] = 0; + unfavoured.add(band[i]); + } else { + tokens[i] = favouredIndex.intValue() + 1; + } + } + favoured.add(favoured.get(favoured.size() - 1)); // repeat last value + int[] favouredBand = integerListToArray(favoured); + int[] unfavouredBand = unfavoured.toArray(); + + // Analyse the three bands to get the best codec + BandAnalysisResults favouredResults = analyseBand("POPULATION", favouredBand, defaultCodec); + BandAnalysisResults unfavouredResults = analyseBand("POPULATION", unfavouredBand, defaultCodec); + + int tdefL = 0; + int l = 0; + Codec tokenCodec = null; + byte[] tokensEncoded; + int k = favoured.size() - 1; + if(k < 256) { + tdefL = 1; + tokensEncoded = Codec.BYTE1.encode(tokens); + } else { + BandAnalysisResults tokenResults = analyseBand("POPULATION", tokens, defaultCodec); + tokenCodec = tokenResults.betterCodec; + tokensEncoded = tokenResults.encodedBand; + if(tokenCodec == null) { + tokenCodec = defaultCodec; + } + l = ((BHSDCodec) tokenCodec).getL(); + int h = ((BHSDCodec) tokenCodec).getH(); + int s = ((BHSDCodec) tokenCodec).getS(); + int b = ((BHSDCodec) tokenCodec).getB(); + int d = ((BHSDCodec) tokenCodec).isDelta() ? 1 : 0; + if(s == 0 && d == 0) { + boolean canUseTDefL = true; + if(b > 1) { + BHSDCodec oneLowerB = new BHSDCodec(b-1, h); + if(oneLowerB.largest() >= k) { + canUseTDefL = false; + } + } + if(canUseTDefL) { + switch (l) { + case 4: + tdefL = 1; + break; + case 8: + tdefL = 2; + break; + case 16: + tdefL = 3; + break; + case 32: + tdefL = 4; + break; + case 64: + tdefL = 5; + break; + case 128: + tdefL = 6; + break; + case 192: + tdefL = 7; + break; + case 224: + tdefL = 8; + break; + case 240: + tdefL = 9; + break; + case 248: + tdefL = 10; + break; + case 252: + tdefL = 11; + break; + } + } + } + } + + byte[] favouredEncoded = favouredResults.encodedBand; + byte[] unfavouredEncoded = unfavouredResults.encodedBand; + Codec favouredCodec = favouredResults.betterCodec; + Codec unfavouredCodec = unfavouredResults.betterCodec; + + int specifier = 141 + (favouredCodec == null ? 1 : 0) + (4 * tdefL) + (unfavouredCodec == null ? 2 : 0); + IntList extraBandMetadata = new IntList(3); + if(favouredCodec != null) { + int[] specifiers = CodecEncoding.getSpecifier(favouredCodec, null); + for (int i = 0; i < specifiers.length; i++) { + extraBandMetadata.add(specifiers[i]); + } + } + if(tdefL == 0) { + int[] specifiers = CodecEncoding.getSpecifier(tokenCodec, null); + for (int i = 0; i < specifiers.length; i++) { + extraBandMetadata.add(specifiers[i]); + } + } + if(unfavouredCodec != null) { + int[] specifiers = CodecEncoding.getSpecifier(unfavouredCodec, null); + for (int i = 0; i < specifiers.length; i++) { + extraBandMetadata.add(specifiers[i]); + } + } + int[] extraMetadata = extraBandMetadata.toArray(); + byte[] extraMetadataEncoded = Codec.UNSIGNED5.encode(extraMetadata); + if(defaultCodec.isSigned()) { + specifier = -1 -specifier; + } else { + specifier = specifier + defaultCodec.getL(); + } + byte[] firstValueEncoded = defaultCodec.encode(new int[] {specifier}); + int totalBandLength = firstValueEncoded.length + favouredEncoded.length + tokensEncoded.length + unfavouredEncoded.length; + + if(totalBandLength + extraMetadataEncoded.length < results.encodedBand.length) { + results.saved += results.encodedBand.length - (totalBandLength + extraMetadataEncoded.length); + byte[] encodedBand = new byte[totalBandLength]; + System.arraycopy(firstValueEncoded, 0, encodedBand, 0, firstValueEncoded.length); + System.arraycopy(favouredEncoded, 0, encodedBand, firstValueEncoded.length, favouredEncoded.length); + System.arraycopy(tokensEncoded, 0, encodedBand, firstValueEncoded.length + favouredEncoded.length, tokensEncoded.length); + System.arraycopy(unfavouredEncoded, 0, encodedBand, firstValueEncoded.length + favouredEncoded.length + tokensEncoded.length, unfavouredEncoded.length); + results.encodedBand = encodedBand; + results.extraMetadata = extraMetadata; + if(l != 0) { + results.betterCodec = new PopulationCodec(favouredCodec, l, unfavouredCodec); + } else { + results.betterCodec = new PopulationCodec(favouredCodec, tokenCodec, unfavouredCodec); + } + } + } + + /** + * Encode a band of longs (values are split into their high and low 32 bits + * and then encoded as two separate bands + * + * @param name + * - name of the band (for debugging purposes) + * @param flags + * - the band + * @param loCodec + * - Codec for the low 32-bits band + * @param hiCodec + * - Codec for the high 32-bits band + * @param haveHiFlags + * - ignores the high band if true as all values would be zero + * @return the encoded band + * @throws Pack200Exception + */ + protected byte[] encodeFlags(String name, long[] flags, BHSDCodec loCodec, BHSDCodec hiCodec, + boolean haveHiFlags) throws Pack200Exception { + if(!haveHiFlags) { + int[] loBits = new int[flags.length]; + for (int i = 0; i < flags.length; i++) { + loBits[i] = (int) flags[i]; + } + return encodeBandInt(name, loBits, loCodec); + } else { + + int[] hiBits = new int[flags.length]; + int[] loBits = new int[flags.length]; + for (int i = 0; i < flags.length; i++) { + long l = flags[i]; + hiBits[i] = (int) (l >> 32); + loBits[i] = (int) l; + } + byte[] hi = encodeBandInt(name, hiBits, hiCodec); + byte[] lo = encodeBandInt(name, loBits, loCodec); + byte[] total = new byte[hi.length + lo.length]; + System.arraycopy(hi, 0, total, 0, hi.length); + System.arraycopy(lo, 0, total, hi.length + 1, lo.length); + return total; + } + } + + /** + * Converts a list of Integers to an int[] array + */ + protected int[] integerListToArray(List integerList) { + int[] array = new int[integerList.size()]; + for (int i = 0; i < array.length; i++) { + array[i] = ((Integer)integerList.get(i)).intValue(); + } + return array; + } + + /** + * Converts a list of Longs to an long[] array + */ + protected long[] longListToArray(List longList) { + long[] array = new long[longList.size()]; + for (int i = 0; i < array.length; i++) { + array[i] = ((Long)longList.get(i)).longValue(); + } + return array; + } + + /** + * Converts a list of ConstantPoolEntrys to an int[] array of their indices + */ + protected int[] cpEntryListToArray(List list) { + int[] array = new int[list.size()]; + for (int i = 0; i < array.length; i++) { + array[i] = ((ConstantPoolEntry)list.get(i)).getIndex(); + if(array[i] < 0) { + throw new RuntimeException("Index should be > 0"); + } + } + return array; + } + + /** + * Converts a list of ConstantPoolEntrys or nulls to an int[] array of their + * indices +1 (or 0 for nulls) + */ + protected int[] cpEntryOrNullListToArray(List theList) { + int[] array = new int[theList.size()]; + for (int j = 0; j < array.length; j++) { + ConstantPoolEntry cpEntry = (ConstantPoolEntry) theList.get(j); + array[j] = cpEntry == null ? 0 : cpEntry.getIndex() + 1; + if(cpEntry != null && cpEntry.getIndex() < 0) { + throw new RuntimeException("Index should be > 0"); + } + } + return array; + } + + protected byte[] encodeFlags(String name, long[][] flags, BHSDCodec loCodec, BHSDCodec hiCodec, + boolean haveHiFlags) throws Pack200Exception { + return encodeFlags(name, flatten(flags), loCodec, hiCodec, haveHiFlags); + } + + /* + * Flatten a 2-dimension array into a 1-dimension array + */ + private long[] flatten(long[][] flags) { + int totalSize = 0; + for (int i = 0; i < flags.length; i++) { + totalSize += flags[i].length; + } + long[] flatArray = new long[totalSize]; + int index = 0; + for (int i = 0; i < flags.length; i++) { + for (int j = 0; j < flags[i].length; j++) { + flatArray[index] = flags[i][j]; + index++; + } + } + return flatArray; + } + + /** + * BandData represents information about a band, e.g. largest value etc + * and is used in the heuristics that calculate whether an alternative + * Codec could make the encoded band smaller. + */ + public class BandData { + + private final int[] band; + private int smallest = Integer.MAX_VALUE; + private int largest = Integer.MIN_VALUE; + private int smallestDelta; + private int largestDelta; + + private int deltaIsAscending = 0; + private int smallDeltaCount = 0; + + private double averageAbsoluteDelta = 0; + private double averageAbsoluteValue = 0; + + private Map distinctValues; + + /** + * Create a new instance of BandData. The band is then analysed. + * @param band - the band of integers + */ + public BandData(int[] band) { + this.band = band; + Integer one = new Integer(1); + for (int i = 0; i < band.length; i++) { + if(band[i] < smallest) { + smallest = band[i]; + } + if(band[i] > largest) { + largest = band[i]; + } + if(i != 0) { + int delta = band[i] - band[i - 1]; + if(delta < smallestDelta) { + smallestDelta = delta; + } + if(delta > largestDelta) { + largestDelta = delta; + } + if(delta >= 0) { + deltaIsAscending++; + } + averageAbsoluteDelta += (double)Math.abs(delta)/(double)(band.length - 1); + if(Math.abs(delta) < 256) { + smallDeltaCount++; + } + } else { + smallestDelta = band[0]; + largestDelta = band[0]; + } + averageAbsoluteValue += (double)Math.abs(band[i])/(double)band.length; + if(effort > 3) { // do calculations needed to consider population codec + if(distinctValues == null) { + distinctValues = new HashMap(); + } + Integer value = new Integer(band[i]); + Integer count = (Integer) distinctValues.get(value); + if(count == null) { + count = one; + } else { + count = new Integer(count.intValue() + 1); + } + distinctValues.put(value, count); + } + } + } + + /** + * Returns true if the deltas between adjacent band elements are mainly + * small (heuristic) + */ + public boolean mainlySmallDeltas() { + // Note: the value below has been tuned - please test carefully if changing it + return (float)smallDeltaCount/(float)band.length > 0.7F; + } + + /** + * Returns true if the band is well correlated (i.e. would be suitable + * for a delta encoding) (heuristic) + */ + public boolean wellCorrelated() { + // Note: the value below has been tuned - please test carefully if changing it + return averageAbsoluteDelta * 3.1 < averageAbsoluteValue; + } + + /** + * Returns true if the band deltas are mainly positive (heuristic) + */ + public boolean mainlyPositiveDeltas() { + // Note: the value below has been tuned - please test carefully if changing it + return (float)deltaIsAscending/(float)band.length > 0.95F; + } + + /** + * Returns true if any band elements are negative + */ + public boolean anyNegatives() { + return smallest < 0; + } + + /** + * Returns the total number of distinct values found in the band + */ + public int numDistinctValues() { + if(distinctValues == null) { + return band.length; + } + return distinctValues.size(); + } + + } + + /** + * Results obtained by trying different Codecs to encode a band + */ + public class BandAnalysisResults { + + // The number of Codecs tried so far + private int numCodecsTried = 0; + + // The number of bytes saved by using betterCodec instead of the default codec + private int saved = 0; + + // Extra metadata to pass to the segment header (to be appended to the + // band_headers band) + private int[] extraMetadata; + + // The results of encoding the band with betterCodec + private byte[] encodedBand; + + // The best Codec found so far, or should be null if the default is the + // best so far + private Codec betterCodec; + + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/BcBands.java b/src/main/java/org/apache/harmony/pack200/BcBands.java new file mode 100644 index 0000000..3b541e4 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/BcBands.java @@ -0,0 +1,582 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.objectweb.asm.Label; + +/** + * Bytecode bands (corresponds to the bc_bands set of bands in the + * pack200 specification) + */ +public class BcBands extends BandSet { + + private final CpBands cpBands; + private final Segment segment; + + public BcBands(CpBands cpBands, Segment segment, int effort) { + super(effort, segment.getSegmentHeader()); + this.cpBands = cpBands; + this.segment = segment; + } + + private final IntList bcCodes = new IntList(); + private final IntList bcCaseCount = new IntList(); + private final IntList bcCaseValue = new IntList(); + private final IntList bcByte = new IntList(); + private final IntList bcShort = new IntList(); + private final IntList bcLocal = new IntList(); + private final List bcLabel = new ArrayList(); + private final List bcIntref = new ArrayList(); + private final List bcFloatRef = new ArrayList(); + private final List bcLongRef = new ArrayList(); + private final List bcDoubleRef = new ArrayList(); + private final List bcStringRef = new ArrayList(); + private final List bcClassRef = new ArrayList(); + private final List bcFieldRef = new ArrayList(); + private final List bcMethodRef = new ArrayList(); + private final List bcIMethodRef = new ArrayList(); + private List bcThisField = new ArrayList(); + private final List bcSuperField = new ArrayList(); + private List bcThisMethod = new ArrayList(); + private List bcSuperMethod = new ArrayList(); + private List bcInitRef = new ArrayList(); + + private String currentClass; + private String superClass; + private String currentNewClass; + + private static final int MULTIANEWARRAY = 197; + private static final int ALOAD_0 = 42; + private static final int WIDE = 196; + private static final int INVOKEINTERFACE = 185; + private static final int TABLESWITCH = 170; + private static final int IINC = 132; + private static final int LOOKUPSWITCH = 171; + private static final int endMarker = 255; + + private final IntList bciRenumbering = new IntList(); + private final Map labelsToOffsets = new HashMap(); + private int byteCodeOffset; + private int renumberedOffset; + private final IntList bcLabelRelativeOffsets = new IntList(); + + public void setCurrentClass(String name, String superName) { + currentClass = name; + superClass = superName; + } + + /** + * All input classes for the segment have now been read in, so this method + * is called so that this class can calculate/complete anything it could not + * do while classes were being read. + */ + public void finaliseBands() { + bcThisField = getIndexInClass(bcThisField); + bcThisMethod = getIndexInClass(bcThisMethod); + bcSuperMethod = getIndexInClass(bcSuperMethod); + bcInitRef = getIndexInClassForConstructor(bcInitRef); + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + PackingUtils.log("Writing byte code bands..."); + byte[] encodedBand = encodeBandInt("bcCodes", bcCodes.toArray(), + Codec.BYTE1); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from bcCodes[" + + bcCodes.size() + "]"); + + encodedBand = encodeBandInt("bcCaseCount", bcCaseCount.toArray(), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcCaseCount[" + bcCaseCount.size() + "]"); + + encodedBand = encodeBandInt("bcCaseValue", bcCaseValue.toArray(), + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcCaseValue[" + bcCaseValue.size() + "]"); + + encodedBand = encodeBandInt("bcByte", bcByte.toArray(), Codec.BYTE1); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from bcByte[" + + bcByte.size() + "]"); + + encodedBand = encodeBandInt("bcShort", bcShort.toArray(), Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from bcShort[" + + bcShort.size() + "]"); + + encodedBand = encodeBandInt("bcLocal", bcLocal.toArray(), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from bcLocal[" + + bcLocal.size() + "]"); + + encodedBand = encodeBandInt("bcLabel", integerListToArray(bcLabel), + Codec.BRANCH5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from bcLabel[" + + bcLabel.size() + "]"); + + encodedBand = encodeBandInt("bcIntref", cpEntryListToArray(bcIntref), + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcIntref[" + bcIntref.size() + "]"); + + encodedBand = encodeBandInt("bcFloatRef", + cpEntryListToArray(bcFloatRef), Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcFloatRef[" + bcFloatRef.size() + "]"); + + encodedBand = encodeBandInt("bcLongRef", cpEntryListToArray(bcLongRef), + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcLongRef[" + bcLongRef.size() + "]"); + + encodedBand = encodeBandInt("bcDoubleRef", + cpEntryListToArray(bcDoubleRef), Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcDoubleRef[" + bcDoubleRef.size() + "]"); + + encodedBand = encodeBandInt("bcStringRef", + cpEntryListToArray(bcStringRef), Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcStringRef[" + bcStringRef.size() + "]"); + + encodedBand = encodeBandInt("bcClassRef", + cpEntryOrNullListToArray(bcClassRef), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcClassRef[" + bcClassRef.size() + "]"); + + encodedBand = encodeBandInt("bcFieldRef", + cpEntryListToArray(bcFieldRef), Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcFieldRef[" + bcFieldRef.size() + "]"); + + encodedBand = encodeBandInt("bcMethodRef", + cpEntryListToArray(bcMethodRef), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcMethodRef[" + bcMethodRef.size() + "]"); + + encodedBand = encodeBandInt("bcIMethodRef", + cpEntryListToArray(bcIMethodRef), Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcIMethodRef[" + bcIMethodRef.size() + "]"); + + encodedBand = encodeBandInt("bcThisField", + integerListToArray(bcThisField), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcThisField[" + bcThisField.size() + "]"); + + encodedBand = encodeBandInt("bcSuperField", + integerListToArray(bcSuperField), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcSuperField[" + bcSuperField.size() + "]"); + + encodedBand = encodeBandInt("bcThisMethod", + integerListToArray(bcThisMethod), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcThisMethod[" + bcThisMethod.size() + "]"); + + encodedBand = encodeBandInt("bcSuperMethod", + integerListToArray(bcSuperMethod), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcSuperMethod[" + bcSuperMethod.size() + "]"); + + encodedBand = encodeBandInt("bcInitRef", integerListToArray(bcInitRef), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from bcInitRef[" + bcInitRef.size() + "]"); + + // out.write(encodeBandInt(cpEntryintegerListToArray(bcEscRef), + // Codec.UNSIGNED5)); + // out.write(encodeBandInt(integerListToArray(bcEscRefSize), + // Codec.UNSIGNED5)); + // out.write(encodeBandInt(integerListToArray(bcEscSize), + // Codec.UNSIGNED5)); + // out.write(encodeBandInt(integerListToArray(bcEscByte), Codec.BYTE1)); + } + + private List getIndexInClass(List cPMethodOrFieldList) { + List indices = new ArrayList(cPMethodOrFieldList.size()); + for (int i = 0; i < cPMethodOrFieldList.size(); i++) { + CPMethodOrField cpMF = (CPMethodOrField) cPMethodOrFieldList.get(i); + indices.add(new Integer(cpMF.getIndexInClass())); + } + return indices; + } + + private List getIndexInClassForConstructor(List cPMethodList) { + List indices = new ArrayList(cPMethodList.size()); + for (int i = 0; i < cPMethodList.size(); i++) { + CPMethodOrField cpMF = (CPMethodOrField) cPMethodList.get(i); + indices.add(new Integer(cpMF.getIndexInClassForConstructor())); + } + return indices; + } + + public void visitEnd() { + for (int i = 0; i < bciRenumbering.size(); i++) { + if (bciRenumbering.get(i) == -1) { + bciRenumbering.remove(i); + bciRenumbering.add(i, ++renumberedOffset); + } + } + if (renumberedOffset != 0) { + if(renumberedOffset + 1 != bciRenumbering.size()) { + throw new RuntimeException("Mistake made with renumbering"); + } + for (int i = bcLabel.size() - 1; i >= 0; i--) { + Object label = bcLabel.get(i); + if (label instanceof Integer) { + break; + } else if (label instanceof Label) { + bcLabel.remove(i); + Integer offset = (Integer) labelsToOffsets.get(label); + int relativeOffset = bcLabelRelativeOffsets.get(i); + bcLabel.add(i, new Integer(bciRenumbering.get(offset.intValue()) - bciRenumbering.get(relativeOffset))); + } + } + bcCodes.add(endMarker); + segment.getClassBands().doBciRenumbering(bciRenumbering, + labelsToOffsets); + bciRenumbering.clear(); + labelsToOffsets.clear(); + byteCodeOffset = 0; + renumberedOffset = 0; + } + } + + public void visitLabel(Label label) { + labelsToOffsets.put(label, new Integer(byteCodeOffset)); + } + + public void visitFieldInsn(int opcode, String owner, String name, + String desc) { + byteCodeOffset += 3; + updateRenumbering(); + boolean aload_0 = false; + if (bcCodes.size() > 0 + && (bcCodes.get(bcCodes.size() - 1)) == ALOAD_0) { + bcCodes.remove(bcCodes.size() - 1); + aload_0 = true; + } + CPMethodOrField cpField = cpBands.getCPField(owner, name, desc); + if (aload_0) { + opcode += 7; + } + if (owner.equals(currentClass)) { + opcode += 24; // change to getstatic_this, putstatic_this etc. + bcThisField.add(cpField); +// } else if (owner.equals(superClass)) { +// opcode += 38; // change to getstatic_super etc. +// bcSuperField.add(cpField); + } else { + if (aload_0) { + opcode -= 7; + bcCodes.add(ALOAD_0); // add aload_0 back in because + // there's no special rewrite in + // this case. + } + bcFieldRef.add(cpField); + } + aload_0 = false; + bcCodes.add(opcode); + } + + private void updateRenumbering() { + if(bciRenumbering.isEmpty()) { + bciRenumbering.add(0); + } + renumberedOffset ++; + for (int i = bciRenumbering.size(); i < byteCodeOffset; i++) { + bciRenumbering.add(-1); + } + bciRenumbering.add(renumberedOffset); + } + + public void visitIincInsn(int var, int increment) { + if (var > 255 || increment > 255) { + byteCodeOffset += 6; + bcCodes.add(WIDE); + bcCodes.add(IINC); + bcLocal.add(var); + bcShort.add(increment); + } else { + byteCodeOffset += 3; + bcCodes.add(IINC); + bcLocal.add(var); + bcByte.add(increment & 0xFF); + } + updateRenumbering(); + } + + public void visitInsn(int opcode) { + if (opcode >= 202) { + throw new RuntimeException( + "Non-standard bytecode instructions not supported"); + } else { + bcCodes.add(opcode); + byteCodeOffset++; + updateRenumbering(); + } + } + + public void visitIntInsn(int opcode, int operand) { + switch (opcode) { + case 17: // sipush + bcCodes.add(opcode); + bcShort.add(operand); + byteCodeOffset += 3; + break; + case 16: // bipush + case 188: // newarray + bcCodes.add(opcode); + bcByte.add(operand & 0xFF); + byteCodeOffset += 2; + } + updateRenumbering(); + } + + public void visitJumpInsn(int opcode, Label label) { + bcCodes.add(opcode); + bcLabel.add(label); + bcLabelRelativeOffsets.add(byteCodeOffset); + byteCodeOffset += 3; + updateRenumbering(); + } + + public void visitLdcInsn(Object cst) { + CPConstant constant = cpBands.getConstant(cst); + if (segment.lastConstantHadWideIndex() || constant instanceof CPLong + || constant instanceof CPDouble) { + byteCodeOffset += 3; + if (constant instanceof CPInt) { + bcCodes.add(237); // ildc_w + bcIntref.add(constant); + } else if (constant instanceof CPFloat) { + bcCodes.add(238); // fldc + bcFloatRef.add(constant); + } else if (constant instanceof CPLong) { + bcCodes.add(20); // lldc2_w + bcLongRef.add(constant); + } else if (constant instanceof CPDouble) { + bcCodes.add(239); // dldc2_w + bcDoubleRef.add(constant); + } else if (constant instanceof CPString) { + bcCodes.add(19); // aldc + bcStringRef.add(constant); + } else if (constant instanceof CPClass) { + bcCodes.add(236); // cldc + bcClassRef.add(constant); + } else { + throw new RuntimeException("Constant should not be null"); + } + } else { + byteCodeOffset += 2; + if (constant instanceof CPInt) { + bcCodes.add(234); // ildc + bcIntref.add(constant); + } else if (constant instanceof CPFloat) { + bcCodes.add(235); // fldc + bcFloatRef.add(constant); + } else if (constant instanceof CPString) { + bcCodes.add(18); // aldc + bcStringRef.add(constant); + } else if (constant instanceof CPClass) { + bcCodes.add(233); // cldc + bcClassRef.add(constant); + } + } + updateRenumbering(); + } + + public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { + bcCodes.add(LOOKUPSWITCH); + bcLabel.add(dflt); + bcLabelRelativeOffsets.add(byteCodeOffset); + bcCaseCount.add(keys.length); + for (int i = 0; i < labels.length; i++) { + bcCaseValue.add(keys[i]); + bcLabel.add(labels[i]); + bcLabelRelativeOffsets.add(byteCodeOffset); + } + int padding = (byteCodeOffset + 1) % 4 == 0 ? 0 : 4 - ((byteCodeOffset + 1) % 4); + byteCodeOffset += padding + 8 + 8 * keys.length; + updateRenumbering(); + } + + public void visitMethodInsn(int opcode, String owner, String name, + String desc) { + byteCodeOffset += 3; + updateRenumbering(); + switch (opcode) { + case 182: // invokevirtual + case 183: // invokespecial + case 184: // invokestatic + boolean aload_0 = false; + if (bcCodes.size() > 0 + && (bcCodes.get(bcCodes.size() - 1)) + == (ALOAD_0)) { + bcCodes.remove(bcCodes.size() - 1); + aload_0 = true; + opcode += 7; + } + if (owner.equals(currentClass)) { + opcode += 24; // change to invokevirtual_this, + // invokespecial_this etc. + + if(name.equals("") && opcode == 207) { + opcode = 230; // invokespecial_this_init + bcInitRef.add(cpBands.getCPMethod(owner, name, desc)); + } else { + bcThisMethod.add(cpBands.getCPMethod(owner, name, desc)); + } + } else if (owner.equals(superClass)) { // TODO + opcode += 38; // change to invokevirtual_super, + // invokespecial_super etc. + if(name.equals("") && opcode == 221) { + opcode = 231; // invokespecial_super_init + bcInitRef.add(cpBands.getCPMethod(owner, name, desc)); + } else { + bcSuperMethod.add(cpBands.getCPMethod(owner, name, desc)); + } + } else { + if (aload_0) { + opcode -= 7; + bcCodes.add(ALOAD_0); // add aload_0 back in + // because there's no + // special rewrite in this + // case. + } + if(name.equals("") && opcode == 183 && owner.equals(currentNewClass)) { + opcode = 232; // invokespecial_new_init + bcInitRef.add(cpBands.getCPMethod(owner, name, desc)); + } else { + bcMethodRef.add(cpBands.getCPMethod(owner, name, desc)); + } + } + bcCodes.add(opcode); + break; + case 185: // invokeinterface + CPMethodOrField cpIMethod = cpBands.getCPIMethod(owner, name, desc); + bcIMethodRef.add(cpIMethod); + bcCodes.add(INVOKEINTERFACE); + break; + } + } + + public void visitMultiANewArrayInsn(String desc, int dimensions) { + byteCodeOffset += 4; + updateRenumbering(); + bcCodes.add(MULTIANEWARRAY); + bcClassRef.add(cpBands.getCPClass(desc)); + bcByte.add(dimensions & 0xFF); + } + + public void visitTableSwitchInsn(int min, int max, Label dflt, + Label[] labels) { + bcCodes.add(TABLESWITCH); + bcLabel.add(dflt); + bcLabelRelativeOffsets.add(byteCodeOffset); + bcCaseValue.add(min); + int count = labels.length; + bcCaseCount.add(count); + for (int i = 0; i < count; i++) { + bcLabel.add(labels[i]); + bcLabelRelativeOffsets.add(byteCodeOffset); + } + int padding = (byteCodeOffset + 1) % 4 == 0 ? 0 : 4 - ((byteCodeOffset + 1) % 4); + byteCodeOffset+= (padding + 12 + 4 * labels.length); + updateRenumbering(); + } + + public void visitTypeInsn(int opcode, String type) { + // NEW, ANEWARRAY, CHECKCAST or INSTANCEOF + byteCodeOffset += 3; + updateRenumbering(); + bcCodes.add(opcode); + bcClassRef.add(cpBands.getCPClass(type)); + if(opcode == 187) { // NEW + currentNewClass = type; + } + } + + public void visitVarInsn(int opcode, int var) { + // ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET + if (var > 255) { + byteCodeOffset += 4; + bcCodes.add(WIDE); + bcCodes.add(opcode); + bcLocal.add(var); + } else { + if(var > 3 || opcode == 169 /* RET */) { + byteCodeOffset += 2; + bcCodes.add(opcode); + bcLocal.add(var); + } else { + byteCodeOffset +=1; + switch(opcode) { + case 21: // ILOAD + case 54: // ISTORE + bcCodes.add(opcode + 5 + var); + break; + case 22: // LLOAD + case 55: // LSTORE + bcCodes.add(opcode + 8 + var); + break; + case 23: // FLOAD + case 56: // FSTORE + bcCodes.add(opcode + 11 + var); + break; + case 24: // DLOAD + case 57: // DSTORE + bcCodes.add(opcode + 14 + var); + break; + case 25: // A_LOAD + case 58: // A_STORE + bcCodes.add(opcode + 17 + var); + break; + } + } + } + updateRenumbering(); + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/CPClass.java b/src/main/java/org/apache/harmony/pack200/CPClass.java new file mode 100644 index 0000000..1639613 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPClass.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Constant pool entry for a class + */ +public class CPClass extends CPConstant implements Comparable { + + private final String className; + private final CPUTF8 utf8; + private final boolean isInnerClass; + + public CPClass(CPUTF8 utf8) { + this.utf8 = utf8; + this.className = utf8.getUnderlyingString(); + char[] chars = className.toCharArray(); + for (int i = 0; i < chars.length; i++) { + if(chars[i] <= 0x2D) { + isInnerClass = true; + return; + } + } + isInnerClass = false; + } + + public int compareTo(Object arg0) { + return className.compareTo(((CPClass)arg0).className); + } + + public String toString() { + return className; + } + + public int getIndexInCpUtf8() { + return utf8.getIndex(); + } + + public boolean isInnerClass() { + return isInnerClass; + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/CPConstant.java b/src/main/java/org/apache/harmony/pack200/CPConstant.java new file mode 100644 index 0000000..ffd3229 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPConstant.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Abstract superclass for constant pool constant entries such as numbers or + * Strings + */ +public abstract class CPConstant extends ConstantPoolEntry implements + Comparable { + +} diff --git a/src/main/java/org/apache/harmony/pack200/CPDouble.java b/src/main/java/org/apache/harmony/pack200/CPDouble.java new file mode 100644 index 0000000..210f774 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPDouble.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Constant pool entry for a double. + */ +public class CPDouble extends CPConstant { + + private final double theDouble; + + public CPDouble(double theDouble) { + this.theDouble = theDouble; + } + + public int compareTo(Object obj) { + return Double.compare(theDouble, ((CPDouble)obj).theDouble); + } + + public double getDouble() { + return theDouble; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/CPFloat.java b/src/main/java/org/apache/harmony/pack200/CPFloat.java new file mode 100644 index 0000000..6cb649d --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPFloat.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Constant pool entry for a float. + */ +public class CPFloat extends CPConstant { + + private final float theFloat; + + public CPFloat(float theFloat) { + this.theFloat = theFloat; + } + + public int compareTo(Object obj) { + return Float.compare(theFloat, ((CPFloat)obj).theFloat); + } + + public float getFloat() { + return theFloat; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/CPInt.java b/src/main/java/org/apache/harmony/pack200/CPInt.java new file mode 100644 index 0000000..abcfe30 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPInt.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Constant pool entry for an int. + */ +public class CPInt extends CPConstant { + + private final int theInt; + + public CPInt(int theInt) { + this.theInt = theInt; + } + + public int compareTo(Object obj) { + if(theInt > ((CPInt)obj).theInt) { + return 1; + } else if (theInt == ((CPInt)obj).theInt) { + return 0; + } else { + return -1; + } + } + + public int getInt() { + return theInt; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/CPLong.java b/src/main/java/org/apache/harmony/pack200/CPLong.java new file mode 100644 index 0000000..2f2d7b4 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPLong.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Constant pool entry for a long. + */ +public class CPLong extends CPConstant { + + private final long theLong; + + public CPLong(long theLong) { + this.theLong = theLong; + } + + public int compareTo(Object obj) { + if(theLong > ((CPLong)obj).theLong) { + return 1; + } else if (theLong == ((CPLong)obj).theLong) { + return 0; + } else { + return -1; + } + } + + public long getLong() { + return theLong; + } + + public String toString() { + return "" + theLong; + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/CPMethodOrField.java b/src/main/java/org/apache/harmony/pack200/CPMethodOrField.java new file mode 100644 index 0000000..d3deae4 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPMethodOrField.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Constant pool entry for a method or field. + */ +public class CPMethodOrField extends ConstantPoolEntry implements Comparable { + + private final CPClass className; + private final CPNameAndType nameAndType; + private int indexInClass = -1; + private int indexInClassForConstructor = -1; + + public CPMethodOrField(CPClass className, CPNameAndType nameAndType) { + this.className = className; + this.nameAndType = nameAndType; + } + + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof CPMethodOrField)) { + return false; + } + return ((CPMethodOrField) obj).className.equals(className) + && ((CPMethodOrField) obj).nameAndType.equals(nameAndType); + } + + public int hashCode() { + return className.hashCode() + nameAndType.hashCode(); + } + + public String toString() { + return className + ": " + nameAndType; + } + + public int compareTo(Object obj) { + if (obj instanceof CPMethodOrField) { + CPMethodOrField mof = (CPMethodOrField) obj; + int compareName = className.compareTo(mof.className); + if (compareName == 0) { + return nameAndType.compareTo(mof.nameAndType); + } else { + return compareName; + } + } + return 0; + } + + public int getClassIndex() { + return className.getIndex(); + } + + public CPClass getClassName() { + return className; + } + + public int getDescIndex() { + return nameAndType.getIndex(); + } + + public CPNameAndType getDesc() { + return nameAndType; + } + + public int getIndexInClass() { + return indexInClass; + } + + public void setIndexInClass(int index) { + indexInClass = index; + } + + public int getIndexInClassForConstructor() { + return indexInClassForConstructor; + } + + public void setIndexInClassForConstructor(int index) { + indexInClassForConstructor = index; + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/pack200/CPNameAndType.java b/src/main/java/org/apache/harmony/pack200/CPNameAndType.java new file mode 100644 index 0000000..5b4d76b --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPNameAndType.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Constant pool entry for a name and type pair. + */ +public class CPNameAndType extends ConstantPoolEntry implements Comparable { + + private final CPUTF8 name; + private final CPSignature signature; + + public CPNameAndType(CPUTF8 name, CPSignature signature) { + this.name = name; + this.signature = signature; + } + + public boolean equals(Object obj) { + if (obj == null || !(obj instanceof CPNameAndType)) { + return false; + } + return ((CPNameAndType) obj).name.equals(name) + && ((CPNameAndType) obj).signature.equals(signature); + } + + public int hashCode() { + return name.hashCode() + signature.hashCode(); + } + + public String toString() { + return name + ":" + signature; + } + + public int compareTo(Object obj) { + if (obj instanceof CPNameAndType) { + CPNameAndType nat = (CPNameAndType) obj; + int compareSignature = signature.compareTo(nat.signature);; + if(compareSignature == 0) { + return name.compareTo(nat.name); + } else { + return compareSignature; + } + } + return 0; + } + + public int getNameIndex() { + return name.getIndex(); + } + + public String getName() { + return name.getUnderlyingString(); + } + + public int getTypeIndex() { + return signature.getIndex(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/pack200/CPSignature.java b/src/main/java/org/apache/harmony/pack200/CPSignature.java new file mode 100644 index 0000000..d5e423c --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPSignature.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.util.List; + +/** + * Constant pool entry for a signature. + */ +public class CPSignature extends ConstantPoolEntry implements Comparable { + + private final CPUTF8 signatureForm; + private final List classes; + private final String signature; + private final boolean formStartsWithBracket; + + public CPSignature(String signature, CPUTF8 signatureForm, List classes) { + this.signature = signature; + this.signatureForm = signatureForm; + this.classes = classes; + formStartsWithBracket = signatureForm.toString().startsWith("("); + } + + public int compareTo(Object arg0) { + if(signature.equals(((CPSignature) arg0).signature)) { + return 0; + } + if (formStartsWithBracket + && !((CPSignature) arg0).formStartsWithBracket) { + return 1; + } + if (((CPSignature) arg0).formStartsWithBracket + && !formStartsWithBracket) { + return -1; + } + if (classes.size() - ((CPSignature) arg0).classes.size() != 0) { + return classes.size() - ((CPSignature) arg0).classes.size(); + } + if (classes.size() > 0) { + for (int i = classes.size() - 1; i >=0; i--) { + CPClass cpClass = (CPClass) classes.get(i); + CPClass compareClass = (CPClass) ((CPSignature) arg0).classes + .get(i); + int classComp = cpClass.compareTo(compareClass); + if(classComp != 0) { + return classComp; + } + } + } + return signature.compareTo(((CPSignature) arg0).signature); + } + + public int getIndexInCpUtf8() { + return signatureForm.getIndex(); + } + + public List getClasses() { + return classes; + } + + public String toString() { + return signature; + } + + public String getUnderlyingString() { + return signature; + } + + public CPUTF8 getSignatureForm() { + return signatureForm; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/CPString.java b/src/main/java/org/apache/harmony/pack200/CPString.java new file mode 100644 index 0000000..b8acca6 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPString.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Constant pool entry for a String. + */ +public class CPString extends CPConstant { + + private final String string; + private final CPUTF8 utf8; + + public CPString(CPUTF8 utf8) { + this.utf8 = utf8; + this.string = utf8.getUnderlyingString(); + } + + public int compareTo(Object arg0) { + return string.compareTo(((CPString)arg0).string); + } + + public String toString() { + return string; + } + + public int getIndexInCpUtf8() { + return utf8.getIndex(); + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/CPUTF8.java b/src/main/java/org/apache/harmony/pack200/CPUTF8.java new file mode 100644 index 0000000..00a1526 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CPUTF8.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Constant pool entry for a UTF8 entry, used for storing long Strings. + */ +public class CPUTF8 extends ConstantPoolEntry implements Comparable { + + private final String string; + + public CPUTF8(String string) { + this.string = string; + } + + public int compareTo(Object arg0) { + return string.compareTo(((CPUTF8)arg0).string); + } + + public String toString() { + return string; + } + + public String getUnderlyingString() { + return string; + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/CanonicalCodecFamilies.java b/src/main/java/org/apache/harmony/pack200/CanonicalCodecFamilies.java new file mode 100644 index 0000000..174f533 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CanonicalCodecFamilies.java @@ -0,0 +1,210 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Sets of codecs that share characteristics. Mainly used for different effort + * compression heuristics in BandSet. + */ +public class CanonicalCodecFamilies { + + // Families of codecs for bands of positive integers that do not correlate + // well (i.e. would not benefit from delta encoding) + + public static BHSDCodec[] nonDeltaUnsignedCodecs1 = new BHSDCodec[] { + // (1,256) is a special case and is considered separately so shouldn't be included here +// CodecEncoding.getCanonicalCodec(1), // (1,256) + CodecEncoding.getCanonicalCodec(5), // (2,256) + CodecEncoding.getCanonicalCodec(9), // (3,256) + CodecEncoding.getCanonicalCodec(13) // (4,256) + }; + + public static BHSDCodec[] nonDeltaUnsignedCodecs2 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(17), // (5,4) + CodecEncoding.getCanonicalCodec(20), // (5,16) + CodecEncoding.getCanonicalCodec(23), // (5,32) + CodecEncoding.getCanonicalCodec(26), // (5,64) + CodecEncoding.getCanonicalCodec(29) // (5,128) + }; + + public static BHSDCodec[] nonDeltaUnsignedCodecs3 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(47), // (2,192) + CodecEncoding.getCanonicalCodec(48), // (2,224) + CodecEncoding.getCanonicalCodec(49), // (2,240) + CodecEncoding.getCanonicalCodec(50), // (2,248) + CodecEncoding.getCanonicalCodec(51) // (2,252) + }; + + public static BHSDCodec[] nonDeltaUnsignedCodecs4 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(70), // (3,192) + CodecEncoding.getCanonicalCodec(71), // (3,224) + CodecEncoding.getCanonicalCodec(72), // (3,240) + CodecEncoding.getCanonicalCodec(73), // (3,248) + CodecEncoding.getCanonicalCodec(74) // (3,252) + }; + + public static BHSDCodec[] nonDeltaUnsignedCodecs5 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(93), // (4,192) + CodecEncoding.getCanonicalCodec(94), // (4,224) + CodecEncoding.getCanonicalCodec(95), // (4,240) + CodecEncoding.getCanonicalCodec(96), // (4,248) + CodecEncoding.getCanonicalCodec(97) // (4,252) + }; + + // Families of codecs for bands of positive integers that do correlate well + // and would benefit from delta encoding + + public static BHSDCodec[] deltaUnsignedCodecs1 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(3), // (1,256,0,1) + CodecEncoding.getCanonicalCodec(7), // (2,256,0,1) + CodecEncoding.getCanonicalCodec(11), // (3,256,0,1) + CodecEncoding.getCanonicalCodec(15) // (4,256,0,1) + }; + + public static BHSDCodec[] deltaUnsignedCodecs2 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(32), // (5,4,0,1) + CodecEncoding.getCanonicalCodec(35), // (5,16,0,1) + CodecEncoding.getCanonicalCodec(38), // (5,32,0,1) + CodecEncoding.getCanonicalCodec(41), // (5,64,0,1) + CodecEncoding.getCanonicalCodec(44) // (5,128,0,1) + }; + + public static BHSDCodec[] deltaUnsignedCodecs3 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(52), // (2,8,0,1) + CodecEncoding.getCanonicalCodec(54), // (2,16,0,1) + CodecEncoding.getCanonicalCodec(56), // (2,32,0,1) + CodecEncoding.getCanonicalCodec(58), // (2,64,0,1) + CodecEncoding.getCanonicalCodec(60), // (2,128,0,1) + CodecEncoding.getCanonicalCodec(62), // (2,192,0,1) + CodecEncoding.getCanonicalCodec(64), // (2,224,0,1) + CodecEncoding.getCanonicalCodec(66), // (2,240,0,1) + CodecEncoding.getCanonicalCodec(68) // (2,248,0,1) + }; + + public static BHSDCodec[] deltaUnsignedCodecs4 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(75), // (3,8,0,1) + CodecEncoding.getCanonicalCodec(77), // (3,16,0,1) + CodecEncoding.getCanonicalCodec(79), // (3,32,0,1) + CodecEncoding.getCanonicalCodec(81), // (3,64,0,1) + CodecEncoding.getCanonicalCodec(83), // (3,128,0,1) + CodecEncoding.getCanonicalCodec(85), // (3,192,0,1) + CodecEncoding.getCanonicalCodec(87), // (3,224,0,1) + CodecEncoding.getCanonicalCodec(89), // (3,240,0,1) + CodecEncoding.getCanonicalCodec(91) // (3,248,0,1) + }; + + public static BHSDCodec[] deltaUnsignedCodecs5 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(98), // (4,8,0,1) + CodecEncoding.getCanonicalCodec(100), // (4,16,0,1) + CodecEncoding.getCanonicalCodec(102), // (4,32,0,1) + CodecEncoding.getCanonicalCodec(104), // (4,64,0,1) + CodecEncoding.getCanonicalCodec(106), // (4,128,0,1) + CodecEncoding.getCanonicalCodec(108), // (4,192,0,1) + CodecEncoding.getCanonicalCodec(110), // (4,224,0,1) + CodecEncoding.getCanonicalCodec(112), // (4,240,0,1) + CodecEncoding.getCanonicalCodec(114) // (4,248,0,1) + }; + + // Families of codecs for bands containing positive and negative integers + // that do correlate well (i.e. delta encoding is used) + + public static BHSDCodec[] deltaSignedCodecs1 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(4), // (1,256,1,1) + CodecEncoding.getCanonicalCodec(8), // (2,256,1,1) + CodecEncoding.getCanonicalCodec(12), // (3,256,1,1) + CodecEncoding.getCanonicalCodec(16) // (4,256,1,1) + }; + + public static BHSDCodec[] deltaSignedCodecs2 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(33), // (5,4,1,1) + CodecEncoding.getCanonicalCodec(36), // (5,16,1,1) + CodecEncoding.getCanonicalCodec(39), // (5,32,1,1) + CodecEncoding.getCanonicalCodec(42), // (5,64,1,1) + CodecEncoding.getCanonicalCodec(45) // (5,128,1,1) + }; + + public static BHSDCodec[] deltaSignedCodecs3 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(53), // (2,8,1,1) + CodecEncoding.getCanonicalCodec(55), // (2,16,1,1) + CodecEncoding.getCanonicalCodec(57), // (2,32,1,1) + CodecEncoding.getCanonicalCodec(59), // (2,64,1,1) + CodecEncoding.getCanonicalCodec(61), // (2,128,1,1) + CodecEncoding.getCanonicalCodec(63), // (2,192,1,1) + CodecEncoding.getCanonicalCodec(65), // (2,224,1,1) + CodecEncoding.getCanonicalCodec(67), // (2,240,1,1) + CodecEncoding.getCanonicalCodec(69) // (2,248,1,1) + }; + + public static BHSDCodec[] deltaSignedCodecs4 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(76), // (3,8,1,1) + CodecEncoding.getCanonicalCodec(78), // (3,16,1,1) + CodecEncoding.getCanonicalCodec(80), // (3,32,1,1) + CodecEncoding.getCanonicalCodec(82), // (3,64,1,1) + CodecEncoding.getCanonicalCodec(84), // (3,128,1,1) + CodecEncoding.getCanonicalCodec(86), // (3,192,1,1) + CodecEncoding.getCanonicalCodec(88), // (3,224,1,1) + CodecEncoding.getCanonicalCodec(90), // (3,240,1,1) + CodecEncoding.getCanonicalCodec(92) // (3,248,1,1) + }; + + public static BHSDCodec[] deltaSignedCodecs5 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(99), // (4,8,1,1) + CodecEncoding.getCanonicalCodec(101), // (4,16,1,1) + CodecEncoding.getCanonicalCodec(103), // (4,32,1,1) + CodecEncoding.getCanonicalCodec(105), // (4,64,1,1) + CodecEncoding.getCanonicalCodec(107), // (4,128,1,1) + CodecEncoding.getCanonicalCodec(109), // (4,192,1,1) + CodecEncoding.getCanonicalCodec(111), // (4,224,1,1) + CodecEncoding.getCanonicalCodec(113), // (4,240,1,1) + CodecEncoding.getCanonicalCodec(115) // (4,248,1,1) + }; + + public static BHSDCodec[] deltaDoubleSignedCodecs1 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(34), // (5,4,2,1) + CodecEncoding.getCanonicalCodec(37), // (5,16,2,1) + CodecEncoding.getCanonicalCodec(40), // (5,32,2,1) + CodecEncoding.getCanonicalCodec(43), // (5,64,2,1) + CodecEncoding.getCanonicalCodec(46) // (5,128,2,1) + }; + + // Families of codecs for bands containing positive and negative values that + // do not correlate well (i.e. delta encoding is not used) + + public static BHSDCodec[] nonDeltaSignedCodecs1 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(2), // (1,256,1) + CodecEncoding.getCanonicalCodec(6), // (2,256,1) + CodecEncoding.getCanonicalCodec(10), // (3,256,1) + CodecEncoding.getCanonicalCodec(14) // (4,256,1) + }; + + public static BHSDCodec[] nonDeltaSignedCodecs2 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(18), // (5,4,1) + CodecEncoding.getCanonicalCodec(21), // (5,16,1) + CodecEncoding.getCanonicalCodec(24), // (5,32,1) + CodecEncoding.getCanonicalCodec(27), // (5,64,1) + CodecEncoding.getCanonicalCodec(30) // (5,128,1) + }; + + public static BHSDCodec[] nonDeltaDoubleSignedCodecs1 = new BHSDCodec[] { + CodecEncoding.getCanonicalCodec(19), // (5,4,2) + CodecEncoding.getCanonicalCodec(22), // (5,16,2) + CodecEncoding.getCanonicalCodec(25), // (5,32,2) + CodecEncoding.getCanonicalCodec(28), // (5,64,2) + CodecEncoding.getCanonicalCodec(31) // (5,128,2) + }; + +} diff --git a/src/main/java/org/apache/harmony/pack200/ClassBands.java b/src/main/java/org/apache/harmony/pack200/ClassBands.java new file mode 100644 index 0000000..fb1de8d --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/ClassBands.java @@ -0,0 +1,1553 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.harmony.pack200.AttributeDefinitionBands.AttributeDefinition; +import org.apache.harmony.pack200.IcBands.IcTuple; +import org.objectweb.asm.Label; +import org.objectweb.asm.Opcodes; + +/** + * Class bands (corresponds to the class_bands set of bands in the + * pack200 specification) + */ +public class ClassBands extends BandSet { + + private final CpBands cpBands; + private final AttributeDefinitionBands attrBands; + + private final CPClass[] class_this; + private final CPClass[] class_super; + private final CPClass[][] class_interface; + private final int[] class_interface_count; + + private final int[] major_versions; + + private final long[] class_flags; + private int[] class_attr_calls; + private final List classSourceFile = new ArrayList(); + private final List classEnclosingMethodClass = new ArrayList(); + private final List classEnclosingMethodDesc = new ArrayList(); + private final List classSignature = new ArrayList(); + + private final IntList classFileVersionMinor = new IntList(); + private final IntList classFileVersionMajor = new IntList(); + + private final int[] class_field_count; + private final CPNameAndType[][] field_descr; + private final long[][] field_flags; + private int[] field_attr_calls; + private final List fieldConstantValueKQ = new ArrayList(); + private final List fieldSignature = new ArrayList(); + + private final int[] class_method_count; + private final CPNameAndType[][] method_descr; + private final long[][] method_flags; + private int[] method_attr_calls; + private final List methodSignature = new ArrayList(); + private final IntList methodExceptionNumber = new IntList(); + private final List methodExceptionClasses = new ArrayList(); + + private int[] codeHeaders; + private final IntList codeMaxStack = new IntList(); + private final IntList codeMaxLocals = new IntList(); + private final IntList codeHandlerCount = new IntList(); + private final List codeHandlerStartP = new ArrayList(); + private final List codeHandlerEndPO = new ArrayList(); + private final List codeHandlerCatchPO = new ArrayList(); + private final List codeHandlerClass = new ArrayList(); + private final List codeFlags = new ArrayList(); + private int[] code_attr_calls; + private final IntList codeLineNumberTableN = new IntList(); + private final List codeLineNumberTableBciP = new ArrayList(); + private final IntList codeLineNumberTableLine = new IntList(); + private final IntList codeLocalVariableTableN = new IntList(); + private final List codeLocalVariableTableBciP = new ArrayList(); + private final List codeLocalVariableTableSpanO = new ArrayList(); + private final List codeLocalVariableTableNameRU = new ArrayList(); + private final List codeLocalVariableTableTypeRS = new ArrayList(); + private final IntList codeLocalVariableTableSlot = new IntList(); + private final IntList codeLocalVariableTypeTableN = new IntList(); + private final List codeLocalVariableTypeTableBciP = new ArrayList(); + private final List codeLocalVariableTypeTableSpanO = new ArrayList(); + private final List codeLocalVariableTypeTableNameRU = new ArrayList(); + private final List codeLocalVariableTypeTableTypeRS = new ArrayList(); + private final IntList codeLocalVariableTypeTableSlot = new IntList(); + + private final MetadataBandGroup class_RVA_bands; + private final MetadataBandGroup class_RIA_bands; + private final MetadataBandGroup field_RVA_bands; + private final MetadataBandGroup field_RIA_bands; + private final MetadataBandGroup method_RVA_bands; + private final MetadataBandGroup method_RIA_bands; + private final MetadataBandGroup method_RVPA_bands; + private final MetadataBandGroup method_RIPA_bands; + private final MetadataBandGroup method_AD_bands; + + private final List classAttributeBands = new ArrayList(); + private final List methodAttributeBands = new ArrayList(); + private final List fieldAttributeBands = new ArrayList(); + private final List codeAttributeBands = new ArrayList(); + + private final List tempFieldFlags = new ArrayList(); + private final List tempFieldDesc = new ArrayList(); + private final List tempMethodFlags = new ArrayList(); + private final List tempMethodDesc = new ArrayList(); + + private boolean anySyntheticClasses = false; + private boolean anySyntheticFields = false; + private boolean anySyntheticMethods = false; + private final Segment segment; + + private final Map classReferencesInnerClass = new HashMap(); + private final boolean stripDebug; + + private int index = 0; + + private int numMethodArgs = 0; + private int[] class_InnerClasses_N; + private CPClass[] class_InnerClasses_RC; + private int[] class_InnerClasses_F; + private List classInnerClassesOuterRCN; + private List classInnerClassesNameRUN; + + public ClassBands(Segment segment, int numClasses, int effort, boolean stripDebug) throws IOException { + super(effort, segment.getSegmentHeader()); + this.stripDebug = stripDebug; + this.segment = segment; + this.cpBands = segment.getCpBands(); + this.attrBands = segment.getAttrBands(); + class_this = new CPClass[numClasses]; + class_super = new CPClass[numClasses]; + class_interface_count = new int[numClasses]; + class_interface = new CPClass[numClasses][]; + class_field_count = new int[numClasses]; + class_method_count = new int[numClasses]; + field_descr = new CPNameAndType[numClasses][]; + field_flags = new long[numClasses][]; + method_descr = new CPNameAndType[numClasses][]; + method_flags = new long[numClasses][]; + // minor_versions = new int[numClasses]; + major_versions = new int[numClasses]; + class_flags = new long[numClasses]; + + class_RVA_bands = new MetadataBandGroup("RVA", MetadataBandGroup.CONTEXT_CLASS, cpBands, segmentHeader, effort); + class_RIA_bands = new MetadataBandGroup("RIA", MetadataBandGroup.CONTEXT_CLASS, cpBands, segmentHeader, effort); + field_RVA_bands = new MetadataBandGroup("RVA", MetadataBandGroup.CONTEXT_FIELD, cpBands, segmentHeader, effort); + field_RIA_bands = new MetadataBandGroup("RIA", MetadataBandGroup.CONTEXT_FIELD, cpBands, segmentHeader, effort); + method_RVA_bands = new MetadataBandGroup("RVA", MetadataBandGroup.CONTEXT_METHOD, cpBands, segmentHeader, effort); + method_RIA_bands = new MetadataBandGroup("RIA", MetadataBandGroup.CONTEXT_METHOD, cpBands, segmentHeader, effort); + method_RVPA_bands = new MetadataBandGroup("RVPA", MetadataBandGroup.CONTEXT_METHOD, cpBands, segmentHeader, effort); + method_RIPA_bands = new MetadataBandGroup("RIPA", MetadataBandGroup.CONTEXT_METHOD, cpBands, segmentHeader, effort); + method_AD_bands = new MetadataBandGroup("AD", MetadataBandGroup.CONTEXT_METHOD, cpBands, segmentHeader, effort); + + createNewAttributeBands(); + } + + private void createNewAttributeBands() throws IOException { + List classAttributeLayouts = attrBands.getClassAttributeLayouts(); + for (Iterator iterator = classAttributeLayouts.iterator(); iterator.hasNext();) { + AttributeDefinition def = (AttributeDefinition) iterator.next(); + classAttributeBands.add(new NewAttributeBands(effort, cpBands, segment.getSegmentHeader(), def)); + } + List methodAttributeLayouts = attrBands.getMethodAttributeLayouts(); + for (Iterator iterator = methodAttributeLayouts.iterator(); iterator.hasNext();) { + AttributeDefinition def = (AttributeDefinition) iterator.next(); + methodAttributeBands.add(new NewAttributeBands(effort, cpBands, segment.getSegmentHeader(), def)); + } + List fieldAttributeLayouts = attrBands.getFieldAttributeLayouts(); + for (Iterator iterator = fieldAttributeLayouts.iterator(); iterator.hasNext();) { + AttributeDefinition def = (AttributeDefinition) iterator.next(); + fieldAttributeBands.add(new NewAttributeBands(effort, cpBands, segment.getSegmentHeader(), def)); + } + List codeAttributeLayouts = attrBands.getCodeAttributeLayouts(); + for (Iterator iterator = codeAttributeLayouts.iterator(); iterator.hasNext();) { + AttributeDefinition def = (AttributeDefinition) iterator.next(); + codeAttributeBands.add(new NewAttributeBands(effort, cpBands, segment.getSegmentHeader(), def)); + } + } + + public void addClass(int major, int flags, String className, + String signature, String superName, String[] interfaces) { + class_this[index] = cpBands.getCPClass(className); + class_super[index] = cpBands.getCPClass(superName); + class_interface_count[index] = interfaces.length; + class_interface[index] = new CPClass[interfaces.length]; + for (int i = 0; i < interfaces.length; i++) { + class_interface[index][i] = cpBands.getCPClass(interfaces[i]); + } + major_versions[index] = major; + class_flags[index] = flags; + if(!anySyntheticClasses && ((flags & (1 << 12)) != 0) && segment.getCurrentClassReader().hasSyntheticAttributes()) { + cpBands.addCPUtf8("Synthetic"); + anySyntheticClasses = true; + } + if((flags & Opcodes.ACC_DEPRECATED) != 0) { // ASM uses (1<<17) flag for deprecated + flags = flags & ~Opcodes.ACC_DEPRECATED; + flags = flags | (1<<20); + } + if(signature != null) { + class_flags[index] |= (1 << 19); + classSignature.add(cpBands.getCPSignature(signature)); + } + } + + public void currentClassReferencesInnerClass(CPClass inner) { + if(!(index >= class_this.length)) { + CPClass currentClass = class_this[index]; + if(currentClass != null && !currentClass.equals(inner) && !isInnerClassOf(currentClass.toString(), inner)) { + Set referencedInnerClasses = (Set)classReferencesInnerClass.get(currentClass); + if(referencedInnerClasses == null) { + referencedInnerClasses = new HashSet(); + classReferencesInnerClass.put(currentClass, referencedInnerClasses); + } + referencedInnerClasses.add(inner); + } + } + } + + private boolean isInnerClassOf(String possibleInner, CPClass possibleOuter) { + if(isInnerClass(possibleInner)) { + String superClassName = possibleInner.substring(0, possibleInner.lastIndexOf('$')); + if(superClassName.equals(possibleOuter.toString())) { + return true; + } else { // do this recursively + return isInnerClassOf(superClassName, possibleOuter); + } + } + return false; + } + + private boolean isInnerClass(String possibleInner) { + return possibleInner.indexOf('$') != -1; + } + + public void addField(int flags, String name, String desc, String signature, + Object value) { + flags = flags & 0xFFFF; + tempFieldDesc.add(cpBands.getCPNameAndType(name, desc)); + if (signature != null) { + fieldSignature.add(cpBands.getCPSignature(signature)); + flags |= (1 << 19); + } + if((flags & Opcodes.ACC_DEPRECATED) != 0) { // ASM uses (1<<17) flag for deprecated + flags = flags & ~Opcodes.ACC_DEPRECATED; + flags = flags | (1<<20); + } + if (value != null) { + fieldConstantValueKQ.add(cpBands.getConstant(value)); + flags |= (1 << 17); + } + if(!anySyntheticFields && ((flags & (1 << 12)) != 0) && segment.getCurrentClassReader().hasSyntheticAttributes()) { + cpBands.addCPUtf8("Synthetic"); + anySyntheticFields = true; + } + tempFieldFlags.add(new Long(flags)); + } + + /** + * All input classes for the segment have now been read in, so this method + * is called so that this class can calculate/complete anything it could not + * do while classes were being read. + */ + public void finaliseBands() { + int defaultMajorVersion = segmentHeader.getDefaultMajorVersion(); + for (int i = 0; i < class_flags.length; i++) { + int major = major_versions[i]; + if (major != defaultMajorVersion) { + class_flags[i] |= 1 << 24; + classFileVersionMajor.add(major); + classFileVersionMinor.add(0); + } + } + // Calculate code headers + codeHeaders = new int[codeHandlerCount.size()]; + int removed = 0; + for (int i = 0; i < codeHeaders.length; i++) { + int numHandlers = codeHandlerCount.get(i - removed); + int maxLocals = codeMaxLocals.get(i - removed); + int maxStack = codeMaxStack.get(i - removed); + if (numHandlers == 0) { + int header = maxLocals * 12 + maxStack + 1; + if (header < 145 && maxStack < 12) { + codeHeaders[i] = header; + } + } else if (numHandlers == 1) { + int header = maxLocals * 8 + maxStack + 145; + if (header < 209 && maxStack < 8) { + codeHeaders[i] = header; + } + } else if (numHandlers == 2) { + int header = maxLocals * 7 + maxStack + 209; + if (header < 256 && maxStack < 7) { + codeHeaders[i] = header; + } + } + if (codeHeaders[i] != 0) { // Remove the redundant values from + // codeHandlerCount, codeMaxLocals and + // codeMaxStack + codeHandlerCount.remove(i - removed); + codeMaxLocals.remove(i - removed); + codeMaxStack.remove(i - removed); + removed++; + } else if (!segment.getSegmentHeader().have_all_code_flags()) { + codeFlags.add(new Long(0)); + } + } + + // Compute any required IcLocals + IntList innerClassesN = new IntList(); + List icLocal = new ArrayList(); + for (int i = 0; i < class_this.length; i++) { + CPClass cpClass = class_this[i]; + Set referencedInnerClasses = (Set) classReferencesInnerClass.get(cpClass); + if(referencedInnerClasses != null) { + int innerN = 0; + List innerClasses = segment.getIcBands().getInnerClassesForOuter(cpClass.toString()); + if(innerClasses != null) { + for (Iterator iterator2 = innerClasses.iterator(); iterator2 + .hasNext();) { + referencedInnerClasses.remove(((IcTuple)iterator2.next()).C); + } + } + for (Iterator iterator2 = referencedInnerClasses.iterator(); iterator2 + .hasNext();) { + CPClass inner = (CPClass) iterator2.next(); + IcTuple icTuple = segment.getIcBands().getIcTuple(inner); + if(icTuple != null && ! icTuple.isAnonymous()) { + // should transmit an icLocal entry + icLocal.add(icTuple); + innerN++; + } + } + if(innerN != 0) { + innerClassesN.add(innerN); + class_flags[i] |= (1 << 23); + } + } + } + class_InnerClasses_N = innerClassesN.toArray(); + class_InnerClasses_RC = new CPClass[icLocal.size()]; + class_InnerClasses_F = new int[icLocal.size()]; + classInnerClassesOuterRCN = new ArrayList(); + classInnerClassesNameRUN = new ArrayList(); + for (int i = 0; i < class_InnerClasses_RC.length; i++) { + IcTuple icTuple = (IcTuple) icLocal.get(i); + class_InnerClasses_RC[i] = (icTuple.C); + if(icTuple.C2 == null && icTuple.N == null) { + class_InnerClasses_F[i] = 0; + } else { + if (icTuple.F == 0) { + class_InnerClasses_F[i] = 0x00010000; + } else { + class_InnerClasses_F[i] = icTuple.F; + } + classInnerClassesOuterRCN.add(icTuple.C2); + classInnerClassesNameRUN.add(icTuple.N); + } + } + // Calculate any backwards calls from metadata bands + IntList classAttrCalls = new IntList(); + IntList fieldAttrCalls = new IntList(); + IntList methodAttrCalls = new IntList(); + IntList codeAttrCalls = new IntList(); + + if(class_RVA_bands.hasContent()) { + classAttrCalls.add(class_RVA_bands.numBackwardsCalls()); + } + if(class_RIA_bands.hasContent()) { + classAttrCalls.add(class_RIA_bands.numBackwardsCalls()); + } + if(field_RVA_bands.hasContent()) { + fieldAttrCalls.add(field_RVA_bands.numBackwardsCalls()); + } + if(field_RIA_bands.hasContent()) { + fieldAttrCalls.add(field_RIA_bands.numBackwardsCalls()); + } + if(method_RVA_bands.hasContent()) { + methodAttrCalls.add(method_RVA_bands.numBackwardsCalls()); + } + if(method_RIA_bands.hasContent()) { + methodAttrCalls.add(method_RIA_bands.numBackwardsCalls()); + } + if(method_RVPA_bands.hasContent()) { + methodAttrCalls.add(method_RVPA_bands.numBackwardsCalls()); + } + if(method_RIPA_bands.hasContent()) { + methodAttrCalls.add(method_RIPA_bands.numBackwardsCalls()); + } + if(method_AD_bands.hasContent()) { + methodAttrCalls.add(method_AD_bands.numBackwardsCalls()); + } + + // Sort non-predefined attribute bands + Comparator comparator = new Comparator() { + public int compare(Object arg0, Object arg1) { + NewAttributeBands bands0 = (NewAttributeBands)arg0; + NewAttributeBands bands1 = (NewAttributeBands)arg1; + return bands0.getFlagIndex() - bands1.getFlagIndex(); + } + }; + Collections.sort(classAttributeBands, comparator); + Collections.sort(methodAttributeBands, comparator); + Collections.sort(fieldAttributeBands, comparator); + Collections.sort(codeAttributeBands, comparator); + + for (Iterator iterator = classAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + if(bands.isUsedAtLeastOnce()) { + int[] backwardsCallCounts = bands.numBackwardsCalls(); + for (int i = 0; i < backwardsCallCounts.length; i++) { + classAttrCalls.add(backwardsCallCounts[i]); + } + } + } + for (Iterator iterator = methodAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + if(bands.isUsedAtLeastOnce()) { + int[] backwardsCallCounts = bands.numBackwardsCalls(); + for (int i = 0; i < backwardsCallCounts.length; i++) { + methodAttrCalls.add(backwardsCallCounts[i]); + } + } + } + for (Iterator iterator = fieldAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + if(bands.isUsedAtLeastOnce()) { + int[] backwardsCallCounts = bands.numBackwardsCalls(); + for (int i = 0; i < backwardsCallCounts.length; i++) { + fieldAttrCalls.add(backwardsCallCounts[i]); + } + } + } + for (Iterator iterator = codeAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + if(bands.isUsedAtLeastOnce()) { + int[] backwardsCallCounts = bands.numBackwardsCalls(); + for (int i = 0; i < backwardsCallCounts.length; i++) { + codeAttrCalls.add(backwardsCallCounts[i]); + } + } + } + + class_attr_calls = classAttrCalls.toArray(); + field_attr_calls = fieldAttrCalls.toArray(); + method_attr_calls = methodAttrCalls.toArray(); + code_attr_calls = codeAttrCalls.toArray(); + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + PackingUtils.log("Writing class bands..."); + + byte[] encodedBand = encodeBandInt("class_this", getInts(class_this), + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_this[" + class_this.length + "]"); + + encodedBand = encodeBandInt("class_super", getInts(class_super), + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_super[" + class_super.length + "]"); + + encodedBand = encodeBandInt("class_interface_count", + class_interface_count, Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_interface_count[" + + class_interface_count.length + "]"); + + int totalInterfaces = sum(class_interface_count); + int[] classInterface = new int[totalInterfaces]; + int k = 0; + for (int i = 0; i < class_interface.length; i++) { + if (class_interface[i] != null) { + for (int j = 0; j < class_interface[i].length; j++) { + CPClass cpClass = class_interface[i][j]; + classInterface[k] = cpClass.getIndex(); + k++; + } + } + } + + encodedBand = encodeBandInt("class_interface", classInterface, + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_interface[" + classInterface.length + "]"); + + encodedBand = encodeBandInt("class_field_count", class_field_count, + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_field_count[" + class_field_count.length + + "]"); + + encodedBand = encodeBandInt("class_method_count", class_method_count, + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_method_count[" + class_method_count.length + + "]"); + + int totalFields = sum(class_field_count); + int[] fieldDescr = new int[totalFields]; + k = 0; + for (int i = 0; i < field_descr.length; i++) { + for (int j = 0; j < field_descr[i].length; j++) { + CPNameAndType descr = field_descr[i][j]; + fieldDescr[k] = descr.getIndex(); + k++; + } + } + + encodedBand = encodeBandInt("field_descr", fieldDescr, Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from field_descr[" + fieldDescr.length + "]"); + + writeFieldAttributeBands(out); + + int totalMethods = sum(class_method_count); + int[] methodDescr = new int[totalMethods]; + k = 0; + for (int i = 0; i < method_descr.length; i++) { + for (int j = 0; j < method_descr[i].length; j++) { + CPNameAndType descr = method_descr[i][j]; + methodDescr[k] = descr.getIndex(); + k++; + } + } + + encodedBand = encodeBandInt("method_descr", methodDescr, Codec.MDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from method_descr[" + methodDescr.length + "]"); + + writeMethodAttributeBands(out); + writeClassAttributeBands(out); + writeCodeBands(out); + } + + private int sum(int[] ints) { + int sum = 0; + for (int i = 0; i < ints.length; i++) { + sum += ints[i]; + } + return sum; + } + + private void writeFieldAttributeBands(OutputStream out) throws IOException, + Pack200Exception { + byte[] encodedBand = encodeFlags("field_flags", field_flags, + Codec.UNSIGNED5, Codec.UNSIGNED5, segmentHeader + .have_field_flags_hi()); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from field_flags[" + field_flags.length + "]"); + + // *field_attr_count :UNSIGNED5 [COUNT(1<<16,...)] + // *field_attr_indexes :UNSIGNED5 [SUM(*field_attr_count)] + encodedBand = encodeBandInt("field_attr_calls", field_attr_calls, + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from field_attr_calls[" + field_attr_calls.length + + "]"); + + encodedBand = encodeBandInt("fieldConstantValueKQ", + cpEntryListToArray(fieldConstantValueKQ), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from fieldConstantValueKQ[" + + fieldConstantValueKQ.size() + "]"); + + encodedBand = encodeBandInt("fieldSignature", + cpEntryListToArray(fieldSignature), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from fieldSignature[" + fieldSignature.size() + "]"); + + field_RVA_bands.pack(out); + field_RIA_bands.pack(out); + for (Iterator iterator = fieldAttributeBands.iterator(); iterator + .hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + bands.pack(out); + } + } + + private void writeMethodAttributeBands(OutputStream out) + throws IOException, Pack200Exception { + byte[] encodedBand = encodeFlags("method_flags", method_flags, + Codec.UNSIGNED5, Codec.UNSIGNED5, segmentHeader + .have_method_flags_hi()); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from method_flags[" + method_flags.length + "]"); + + // *method_attr_count :UNSIGNED5 [COUNT(1<<16,...)] + // *method_attr_indexes :UNSIGNED5 [SUM(*method_attr_count)] + encodedBand = encodeBandInt("method_attr_calls", method_attr_calls, + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from method_attr_calls[" + method_attr_calls.length + + "]"); + + encodedBand = encodeBandInt("methodExceptionNumber", + methodExceptionNumber.toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from methodExceptionNumber[" + + methodExceptionNumber.size() + "]"); + + encodedBand = encodeBandInt("methodExceptionClasses", + cpEntryListToArray(methodExceptionClasses), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from methodExceptionClasses[" + + methodExceptionClasses.size() + "]"); + + encodedBand = encodeBandInt("methodSignature", + cpEntryListToArray(methodSignature), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils + .log("Wrote " + encodedBand.length + + " bytes from methodSignature[" + + methodSignature.size() + "]"); + + method_RVA_bands.pack(out); + method_RIA_bands.pack(out); + method_RVPA_bands.pack(out); + method_RIPA_bands.pack(out); + method_AD_bands.pack(out); + for (Iterator iterator = methodAttributeBands.iterator(); iterator + .hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + bands.pack(out); + } + } + + private void writeClassAttributeBands(OutputStream out) throws IOException, + Pack200Exception { + byte[] encodedBand = encodeFlags("class_flags", class_flags, + Codec.UNSIGNED5, Codec.UNSIGNED5, segmentHeader + .have_class_flags_hi()); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_flags[" + class_flags.length + "]"); + + // These bands are not needed, but could be used to reduce the size of + // the archive if there are enough different non-standard attributes + // defined that segmentHeader.have_class_flags_hi() is true. The same + // applies to method_attr_count, field_attr_count, code_attr_count etc. + + // *class_attr_count :UNSIGNED5 [COUNT(1<<16,...)] + // *class_attr_indexes :UNSIGNED5 [SUM(*class_attr_count)] + + encodedBand = encodeBandInt("class_attr_calls", class_attr_calls, + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_attr_calls[" + class_attr_calls.length + + "]"); + + encodedBand = encodeBandInt("classSourceFile", + cpEntryOrNullListToArray(classSourceFile), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils + .log("Wrote " + encodedBand.length + + " bytes from classSourceFile[" + + classSourceFile.size() + "]"); + + encodedBand = encodeBandInt("class_enclosing_method_RC", + cpEntryListToArray(classEnclosingMethodClass), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_enclosing_method_RC[" + + classEnclosingMethodClass.size() + "]"); + + encodedBand = encodeBandInt("class_EnclosingMethod_RDN", + cpEntryOrNullListToArray(classEnclosingMethodDesc), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_EnclosingMethod_RDN[" + + classEnclosingMethodDesc.size() + "]"); + + encodedBand = encodeBandInt("class_Signature_RS", + cpEntryListToArray(classSignature), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_Signature_RS[" + classSignature.size() + + "]"); + + class_RVA_bands.pack(out); + class_RIA_bands.pack(out); + + encodedBand = encodeBandInt("class_InnerClasses_N", + class_InnerClasses_N, Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_InnerClasses_N[" + + class_InnerClasses_N.length + "]"); + + encodedBand = encodeBandInt("class_InnerClasses_RC", + getInts(class_InnerClasses_RC), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_InnerClasses_RC[" + + class_InnerClasses_RC.length + "]"); + + encodedBand = encodeBandInt("class_InnerClasses_F", + class_InnerClasses_F, Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_InnerClasses_F[" + + class_InnerClasses_F.length + "]"); + + encodedBand = encodeBandInt("class_InnerClasses_outer_RCN", + cpEntryOrNullListToArray(classInnerClassesOuterRCN), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_InnerClasses_outer_RCN[" + + classInnerClassesOuterRCN.size() + "]"); + + encodedBand = encodeBandInt("class_InnerClasses_name_RUN", + cpEntryOrNullListToArray(classInnerClassesNameRUN), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from class_InnerClasses_name_RUN[" + + classInnerClassesNameRUN.size() + "]"); + + encodedBand = encodeBandInt("classFileVersionMinor", + classFileVersionMinor.toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from classFileVersionMinor[" + + classFileVersionMinor.size() + "]"); + + encodedBand = encodeBandInt("classFileVersionMajor", + classFileVersionMajor.toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from classFileVersionMajor[" + + classFileVersionMajor.size() + "]"); + + for (Iterator iterator = classAttributeBands.iterator(); iterator + .hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + bands.pack(out); + } + } + + private int[] getInts(CPClass[] cpClasses) { + int[] ints = new int[cpClasses.length]; + for (int i = 0; i < ints.length; i++) { + ints[i] = cpClasses[i].getIndex(); + } + return ints; + } + + private void writeCodeBands(OutputStream out) throws IOException, + Pack200Exception { + byte[] encodedBand = encodeBandInt("codeHeaders", codeHeaders, + Codec.BYTE1); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from codeHeaders[" + codeHeaders.length + "]"); + + encodedBand = encodeBandInt("codeMaxStack", codeMaxStack.toArray(), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from codeMaxStack[" + codeMaxStack.size() + "]"); + + encodedBand = encodeBandInt("codeMaxLocals", codeMaxLocals.toArray(), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from codeMaxLocals[" + codeMaxLocals.size() + "]"); + + encodedBand = encodeBandInt("codeHandlerCount", codeHandlerCount + .toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from codeHandlerCount[" + codeHandlerCount.size() + + "]"); + + encodedBand = encodeBandInt("codeHandlerStartP", + integerListToArray(codeHandlerStartP), Codec.BCI5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from codeHandlerStartP[" + codeHandlerStartP.size() + + "]"); + + encodedBand = encodeBandInt("codeHandlerEndPO", + integerListToArray(codeHandlerEndPO), Codec.BRANCH5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from codeHandlerEndPO[" + codeHandlerEndPO.size() + + "]"); + + encodedBand = encodeBandInt("codeHandlerCatchPO", + integerListToArray(codeHandlerCatchPO), Codec.BRANCH5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from codeHandlerCatchPO[" + codeHandlerCatchPO.size() + + "]"); + + encodedBand = encodeBandInt("codeHandlerClass", + cpEntryOrNullListToArray(codeHandlerClass), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from codeHandlerClass[" + codeHandlerClass.size() + + "]"); + + writeCodeAttributeBands(out); + } + + private void writeCodeAttributeBands(OutputStream out) throws IOException, + Pack200Exception { + byte[] encodedBand = encodeFlags("codeFlags", + longListToArray(codeFlags), Codec.UNSIGNED5, Codec.UNSIGNED5, + segmentHeader.have_code_flags_hi()); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from codeFlags[" + codeFlags.size() + "]"); + + // *code_attr_count :UNSIGNED5 [COUNT(1<<16,...)] + // *code_attr_indexes :UNSIGNED5 [SUM(*code_attr_count)] + encodedBand = encodeBandInt("code_attr_calls", code_attr_calls, + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils + .log("Wrote " + encodedBand.length + + " bytes from code_attr_calls[" + + code_attr_calls.length + "]"); + + encodedBand = encodeBandInt("code_LineNumberTable_N", + codeLineNumberTableN.toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LineNumberTable_N[" + + codeLineNumberTableN.size() + "]"); + + encodedBand = encodeBandInt("code_LineNumberTable_bci_P", + integerListToArray(codeLineNumberTableBciP), Codec.BCI5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LineNumberTable_bci_P[" + + codeLineNumberTableBciP.size() + "]"); + + encodedBand = encodeBandInt("code_LineNumberTable_line", + codeLineNumberTableLine.toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LineNumberTable_line[" + + codeLineNumberTableLine.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTable_N", + codeLocalVariableTableN.toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTable_N[" + + codeLocalVariableTableN.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTable_bci_P", + integerListToArray(codeLocalVariableTableBciP), Codec.BCI5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTable_bci_P[" + + codeLocalVariableTableBciP.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTable_span_O", + integerListToArray(codeLocalVariableTableSpanO), Codec.BRANCH5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTable_span_O[" + + codeLocalVariableTableSpanO.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTable_name_RU", + cpEntryListToArray(codeLocalVariableTableNameRU), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTable_name_RU[" + + codeLocalVariableTableNameRU.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTable_type_RS", + cpEntryListToArray(codeLocalVariableTableTypeRS), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTable_type_RS[" + + codeLocalVariableTableTypeRS.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTable_slot", + codeLocalVariableTableSlot.toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTable_slot[" + + codeLocalVariableTableSlot.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTypeTable_N", + codeLocalVariableTypeTableN.toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTypeTable_N[" + + codeLocalVariableTypeTableN.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTypeTable_bci_P", + integerListToArray(codeLocalVariableTypeTableBciP), Codec.BCI5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTypeTable_bci_P[" + + codeLocalVariableTypeTableBciP.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTypeTable_span_O", + integerListToArray(codeLocalVariableTypeTableSpanO), Codec.BRANCH5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTypeTable_span_O[" + + codeLocalVariableTypeTableSpanO.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTypeTable_name_RU", + cpEntryListToArray(codeLocalVariableTypeTableNameRU), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTypeTable_name_RU[" + + codeLocalVariableTypeTableNameRU.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTypeTable_type_RS", + cpEntryListToArray(codeLocalVariableTypeTableTypeRS), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTypeTable_type_RS[" + + codeLocalVariableTypeTableTypeRS.size() + "]"); + + encodedBand = encodeBandInt("code_LocalVariableTypeTable_slot", + codeLocalVariableTypeTableSlot.toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from code_LocalVariableTypeTable_slot[" + + codeLocalVariableTypeTableSlot.size() + "]"); + + for (Iterator iterator = codeAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + bands.pack(out); + } + } + + public void addMethod(int flags, String name, String desc, + String signature, String[] exceptions) { + CPNameAndType nt = cpBands.getCPNameAndType(name, desc); + tempMethodDesc.add(nt); + if (signature != null) { + methodSignature.add(cpBands.getCPSignature(signature)); + flags |= (1 << 19); + } + if (exceptions != null) { + methodExceptionNumber.add(exceptions.length); + for (int i = 0; i < exceptions.length; i++) { + methodExceptionClasses.add(cpBands.getCPClass(exceptions[i])); + } + flags |= (1 << 18); + } + if((flags & Opcodes.ACC_DEPRECATED) != 0) { // ASM uses (1<<17) flag for deprecated + flags = flags & ~Opcodes.ACC_DEPRECATED; + flags = flags | (1<<20); + } + tempMethodFlags.add(new Long(flags)); + numMethodArgs = countArgs(desc); + if(!anySyntheticMethods && ((flags & (1 << 12)) != 0) && segment.getCurrentClassReader().hasSyntheticAttributes()) { + cpBands.addCPUtf8("Synthetic"); + anySyntheticMethods = true; + } + } + + public void endOfMethod() { + if(codeFlags.size() > 0) { + long latestCodeFlag = ((Long)codeFlags.get(codeFlags.size() - 1)).longValue(); + int latestLocalVariableTableN = codeLocalVariableTableN.get(codeLocalVariableTableN.size() - 1); + if(latestCodeFlag == (1 << 2) && latestLocalVariableTableN == 0) { + codeLocalVariableTableN.remove(codeLocalVariableTableN.size() - 1); + codeFlags.remove(codeFlags.size() - 1); + codeFlags.add(new Integer(0)); + } + } + } + + protected static int countArgs(String descriptor) { + int bra = descriptor.indexOf('('); + int ket = descriptor.indexOf(')'); + if (bra == -1 || ket == -1 || ket < bra) + throw new IllegalArgumentException("No arguments"); + + boolean inType = false; + boolean consumingNextType = false; + int count = 0; + for (int i = bra + 1; i < ket; i++) { + char charAt = descriptor.charAt(i); + if (inType && charAt == ';') { + inType = false; + consumingNextType = false; + } else if (!inType && charAt == 'L') { + inType = true; + count++; + } else if (charAt == '[') { + consumingNextType = true; + } else if (inType) { + // NOP + } else { + if (consumingNextType) { + count++; + consumingNextType = false; + } else { + if (charAt == 'D' || charAt == 'J') { + count += 2; + } else { + count++; + } + } + } + } + return count; + } + + public void endOfClass() { // All the data for the current class has been + // read + int numFields = tempFieldDesc.size(); + class_field_count[index] = numFields; + field_descr[index] = new CPNameAndType[numFields]; + field_flags[index] = new long[numFields]; + for (int i = 0; i < numFields; i++) { + field_descr[index][i] = (CPNameAndType) tempFieldDesc.get(i); + field_flags[index][i] = ((Long) tempFieldFlags.get(i)).longValue(); + } + int numMethods = tempMethodDesc.size(); + class_method_count[index] = numMethods; + method_descr[index] = new CPNameAndType[numMethods]; + method_flags[index] = new long[numMethods]; + for (int i = 0; i < numMethods; i++) { + method_descr[index][i] = (CPNameAndType) tempMethodDesc.get(i); + method_flags[index][i] = ((Long) tempMethodFlags.get(i)) + .longValue(); + } + tempFieldDesc.clear(); + tempFieldFlags.clear(); + tempMethodDesc.clear(); + tempMethodFlags.clear(); + index++; + } + + public void addSourceFile(String source) { + String implicitSourceFileName = class_this[index].toString(); + if(implicitSourceFileName.indexOf('$') != -1) { + implicitSourceFileName = implicitSourceFileName.substring(0, implicitSourceFileName.indexOf('$')); + } + implicitSourceFileName = implicitSourceFileName + .substring(implicitSourceFileName.lastIndexOf('/') + 1) + + ".java"; + if (source.equals(implicitSourceFileName)) { + classSourceFile.add(null); + } else { + classSourceFile.add(cpBands.getCPUtf8(source)); + } + class_flags[index] |= (1 << 17); + } + + public void addEnclosingMethod(String owner, String name, String desc) { + class_flags[index] |= (1 << 18); + classEnclosingMethodClass.add(cpBands.getCPClass(owner)); + classEnclosingMethodDesc.add(name == null ? null : cpBands + .getCPNameAndType(name, desc)); + } + + public void addClassAttribute(NewAttribute attribute) { + // TODO: backwards calls + String attributeName = attribute.type; + for (Iterator iterator = classAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + if(bands.getAttributeName().equals(attributeName)) { + bands.addAttribute(attribute); + int flagIndex = bands.getFlagIndex(); + class_flags[index] |= (1 << flagIndex); + return; + } + } + throw new RuntimeException("No suitable definition for " + attributeName); + } + + public void addFieldAttribute(NewAttribute attribute) { + String attributeName = attribute.type; + for (Iterator iterator = fieldAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + if(bands.getAttributeName().equals(attributeName)) { + bands.addAttribute(attribute); + int flagIndex = bands.getFlagIndex(); + Long flags = (Long)tempFieldFlags.remove(tempFieldFlags.size() - 1); + tempFieldFlags.add(new Long(flags.longValue() | (1 << flagIndex))); + return; + } + } + throw new RuntimeException("No suitable definition for " + attributeName); + } + + public void addMethodAttribute(NewAttribute attribute) { + String attributeName = attribute.type; + for (Iterator iterator = methodAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + if(bands.getAttributeName().equals(attributeName)) { + bands.addAttribute(attribute); + int flagIndex = bands.getFlagIndex(); + Long flags = (Long)tempMethodFlags.remove(tempMethodFlags.size() - 1); + tempMethodFlags.add(new Long(flags.longValue() | (1 << flagIndex))); + return; + } + } + throw new RuntimeException("No suitable definition for " + attributeName); + } + + public void addCodeAttribute(NewAttribute attribute) { + String attributeName = attribute.type; + for (Iterator iterator = codeAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands bands = (NewAttributeBands) iterator.next(); + if(bands.getAttributeName().equals(attributeName)) { + bands.addAttribute(attribute); + int flagIndex = bands.getFlagIndex(); + Long flags = (Long)codeFlags.remove(codeFlags.size() - 1); + codeFlags.add(new Long(flags.longValue() | (1 << flagIndex))); + return; + } + } + throw new RuntimeException("No suitable definition for " + attributeName); + } + + public void addMaxStack(int maxStack, int maxLocals) { + Long latestFlag = (Long) tempMethodFlags + .remove(tempMethodFlags.size() - 1); + Long newFlag = new Long(latestFlag.intValue() | (1 << 17)); + tempMethodFlags.add(newFlag); + codeMaxStack.add(maxStack); + if ((newFlag.longValue() & (1 << 3)) == 0) { // not static + maxLocals--; // minus 'this' local + } + maxLocals -= numMethodArgs; + codeMaxLocals.add(maxLocals); + } + + public void addCode() { + codeHandlerCount.add(0); + if(!stripDebug) { + codeFlags.add(new Long((1 << 2))); + codeLocalVariableTableN.add(0); + } + } + + public void addHandler(Label start, Label end, Label handler, String type) { + int handlers = codeHandlerCount.remove(codeHandlerCount + .size() - 1); + codeHandlerCount.add(handlers + 1); + codeHandlerStartP.add(start); + codeHandlerEndPO.add(end); + codeHandlerCatchPO.add(handler); + codeHandlerClass.add(type == null ? null : cpBands.getCPClass(type)); + } + + public void addLineNumber(int line, Label start) { + Long latestCodeFlag = (Long) codeFlags.get(codeFlags.size() - 1); + if ((latestCodeFlag.intValue() & (1 << 1)) == 0) { + codeFlags.remove(codeFlags.size() - 1); + codeFlags.add(new Long(latestCodeFlag.intValue() | (1 << 1))); + codeLineNumberTableN.add(1); + } else { + codeLineNumberTableN + .increment(codeLineNumberTableN.size() - 1); + } + codeLineNumberTableLine.add(line); + codeLineNumberTableBciP.add(start); + } + + public void addLocalVariable(String name, String desc, String signature, + Label start, Label end, int indx) { + if (signature != null) { // LocalVariableTypeTable attribute + Long latestCodeFlag = (Long) codeFlags.get(codeFlags.size() - 1); + if ((latestCodeFlag.intValue() & (1 << 3)) == 0) { + codeFlags.remove(codeFlags.size() - 1); + codeFlags.add(new Long(latestCodeFlag.intValue() | (1 << 3))); + codeLocalVariableTypeTableN.add(1); + } else { + codeLocalVariableTypeTableN + .increment(codeLocalVariableTypeTableN.size() - 1); + } + codeLocalVariableTypeTableBciP.add(start); + codeLocalVariableTypeTableSpanO.add(end); + codeLocalVariableTypeTableNameRU.add(cpBands.getCPUtf8(name)); + codeLocalVariableTypeTableTypeRS.add(cpBands + .getCPSignature(signature)); + codeLocalVariableTypeTableSlot.add(indx); + } + // LocalVariableTable attribute + codeLocalVariableTableN + .increment(codeLocalVariableTableN.size() - 1); + codeLocalVariableTableBciP.add(start); + codeLocalVariableTableSpanO.add(end); + codeLocalVariableTableNameRU.add(cpBands.getCPUtf8(name)); + codeLocalVariableTableTypeRS.add(cpBands.getCPSignature(desc)); + codeLocalVariableTableSlot.add(indx); + } + + public void doBciRenumbering(IntList bciRenumbering, Map labelsToOffsets) { + renumberBci(codeLineNumberTableBciP, bciRenumbering, labelsToOffsets); + renumberBci(codeLocalVariableTableBciP, bciRenumbering, labelsToOffsets); + renumberOffsetBci(codeLocalVariableTableBciP, + codeLocalVariableTableSpanO, bciRenumbering, labelsToOffsets); + renumberBci(codeLocalVariableTypeTableBciP, bciRenumbering, + labelsToOffsets); + renumberOffsetBci(codeLocalVariableTypeTableBciP, + codeLocalVariableTypeTableSpanO, bciRenumbering, + labelsToOffsets); + renumberBci(codeHandlerStartP, bciRenumbering, labelsToOffsets); + renumberOffsetBci(codeHandlerStartP, codeHandlerEndPO, + bciRenumbering, labelsToOffsets); + renumberDoubleOffsetBci(codeHandlerStartP, codeHandlerEndPO, codeHandlerCatchPO, + bciRenumbering, labelsToOffsets); + + for (Iterator iterator = classAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands newAttributeBandSet = (NewAttributeBands) iterator.next(); + newAttributeBandSet.renumberBci(bciRenumbering, labelsToOffsets); + } + for (Iterator iterator = methodAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands newAttributeBandSet = (NewAttributeBands) iterator.next(); + newAttributeBandSet.renumberBci(bciRenumbering, labelsToOffsets); + } + for (Iterator iterator = fieldAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands newAttributeBandSet = (NewAttributeBands) iterator.next(); + newAttributeBandSet.renumberBci(bciRenumbering, labelsToOffsets); + } + for (Iterator iterator = codeAttributeBands.iterator(); iterator.hasNext();) { + NewAttributeBands newAttributeBandSet = (NewAttributeBands) iterator.next(); + newAttributeBandSet.renumberBci(bciRenumbering, labelsToOffsets); + } + } + + private void renumberBci(List list, IntList bciRenumbering, Map labelsToOffsets) { + for (int i = list.size() - 1; i >= 0; i--) { + Object label = list.get(i); + if (label instanceof Integer) { + break; + } else if (label instanceof Label) { + list.remove(i); + Integer bytecodeIndex = (Integer) labelsToOffsets.get(label); + list.add(i, new Integer(bciRenumbering.get(bytecodeIndex.intValue()))); + } + } + } + + private void renumberOffsetBci(List relative, List list, + IntList bciRenumbering, Map labelsToOffsets) { + for (int i = list.size() - 1; i >= 0; i--) { + Object label = list.get(i); + if (label instanceof Integer) { + break; + } else if (label instanceof Label) { + list.remove(i); + Integer bytecodeIndex = (Integer) labelsToOffsets.get(label); + Integer renumberedOffset = new Integer(bciRenumbering + .get(bytecodeIndex.intValue()) + - ((Integer) relative.get(i)).intValue()); + list.add(i, renumberedOffset); + } + } + } + + private void renumberDoubleOffsetBci(List relative, List firstOffset, List list, + IntList bciRenumbering, Map labelsToOffsets) { + // TODO: There's probably a nicer way of doing this... + for (int i = list.size() - 1; i >= 0; i--) { + Object label = list.get(i); + if (label instanceof Integer) { + break; + } else if (label instanceof Label) { + list.remove(i); + Integer bytecodeIndex = (Integer) labelsToOffsets.get(label); + Integer renumberedOffset = new Integer(bciRenumbering + .get(bytecodeIndex.intValue()) + - ((Integer) relative.get(i)).intValue() - ((Integer) firstOffset.get(i)).intValue()); + list.add(i, renumberedOffset); + } + } + } + + public boolean isAnySyntheticClasses() { + return anySyntheticClasses; + } + + public boolean isAnySyntheticFields() { + return anySyntheticFields; + } + + public boolean isAnySyntheticMethods() { + return anySyntheticMethods; + } + + public void addParameterAnnotation(int parameter, String desc, + boolean visible, List nameRU, List t, List values, List caseArrayN, List nestTypeRS, List nestNameRU, List nestPairN) { + if(visible) { + method_RVPA_bands.addAnnotation(desc, nameRU, t, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + Integer flag = (Integer) tempMethodFlags.remove(tempMethodFlags.size() - 1); + if((flag.intValue() & (1<<23)) != 0) { + method_RVPA_bands.incrementAnnoN(); + } else { + method_RVPA_bands.newEntryInAnnoN(); + } + tempMethodFlags.add(new Integer(flag.intValue() | (1<<23))); + } else { + method_RIPA_bands.addAnnotation(desc, nameRU, t, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + Integer flag = (Integer) tempMethodFlags.remove(tempMethodFlags.size() - 1); + if((flag.intValue() & (1<<24)) != 0) { + method_RIPA_bands.incrementAnnoN(); + } else { + method_RIPA_bands.newEntryInAnnoN(); + } + tempMethodFlags.add(new Integer(flag.intValue() | (1<<24))); + } + } + + public void addAnnotation(int context, String desc, boolean visible, List nameRU, List t, List values, List caseArrayN, List nestTypeRS, List nestNameRU, List nestPairN) { + switch (context) { + case MetadataBandGroup.CONTEXT_CLASS: + if(visible) { + class_RVA_bands.addAnnotation(desc, nameRU, t, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + if((class_flags[index] & (1<<21)) != 0) { + class_RVA_bands.incrementAnnoN(); + } else { + class_RVA_bands.newEntryInAnnoN(); + class_flags[index] = class_flags[index] | (1<<21); + } + } else { + class_RIA_bands.addAnnotation(desc, nameRU, t, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + if((class_flags[index] & (1<<22)) != 0) { + class_RIA_bands.incrementAnnoN(); + } else { + class_RIA_bands.newEntryInAnnoN(); + class_flags[index] = class_flags[index] | (1<<22); + } + } + break; + case MetadataBandGroup.CONTEXT_FIELD: + if(visible) { + field_RVA_bands.addAnnotation(desc, nameRU, t, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + Long flag = (Long) tempFieldFlags.remove(tempFieldFlags.size() - 1); + if((flag.intValue() & (1<<21)) != 0) { + field_RVA_bands.incrementAnnoN(); + } else { + field_RVA_bands.newEntryInAnnoN(); + } + tempFieldFlags.add(new Long(flag.intValue() | (1<<21))); + } else { + field_RIA_bands.addAnnotation(desc, nameRU, t, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + Long flag = (Long) tempFieldFlags.remove(tempFieldFlags.size() - 1); + if((flag.intValue() & (1<<22)) != 0) { + field_RIA_bands.incrementAnnoN(); + } else { + field_RIA_bands.newEntryInAnnoN(); + } + tempFieldFlags.add(new Long(flag.intValue() | (1<<22))); + } + break; + case MetadataBandGroup.CONTEXT_METHOD: + if(visible) { + method_RVA_bands.addAnnotation(desc, nameRU, t, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + Long flag = (Long) tempMethodFlags.remove(tempMethodFlags.size() - 1); + if((flag.intValue() & (1<<21)) != 0) { + method_RVA_bands.incrementAnnoN(); + } else { + method_RVA_bands.newEntryInAnnoN(); + } + tempMethodFlags.add(new Long(flag.intValue() | (1<<21))); + } else { + method_RIA_bands.addAnnotation(desc, nameRU, t, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + Long flag = (Long) tempMethodFlags.remove(tempMethodFlags.size() - 1); + if((flag.intValue() & (1<<22)) != 0) { + method_RIA_bands.incrementAnnoN(); + } else { + method_RIA_bands.newEntryInAnnoN(); + } + tempMethodFlags.add(new Long(flag.intValue() | (1<<22))); + } + break; + } + } + + public void addAnnotationDefault(List nameRU, List t, List values, List caseArrayN, List nestTypeRS, List nestNameRU, List nestPairN) { + method_AD_bands.addAnnotation(null, nameRU, t, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + Long flag = (Long) tempMethodFlags.remove(tempMethodFlags.size() - 1); + tempMethodFlags.add(new Long(flag.longValue() | (1<<25))); + } + + /** + * Remove all entries for the current class + */ + public void removeCurrentClass() { + // Note - this doesn't remove any entries added to the constant pool but + // that shouldn't be a problem + if ((class_flags[index] & (1 << 17)) != 0) { + classSourceFile.remove(classSourceFile.size() - 1); + } + if ((class_flags[index] & (1 << 18)) != 0) { + classEnclosingMethodClass + .remove(classEnclosingMethodClass.size() - 1); + classEnclosingMethodDesc + .remove(classEnclosingMethodDesc.size() - 1); + } + if ((class_flags[index] & (1 << 19)) != 0) { + classSignature.remove(classSignature.size() - 1); + } + if ((class_flags[index] & (1 << 21)) != 0) { + class_RVA_bands.removeLatest(); + } + if ((class_flags[index] & (1 << 22)) != 0) { + class_RIA_bands.removeLatest(); + } + for (Iterator iterator = tempFieldFlags.iterator(); iterator.hasNext();) { + Long flagsL = (Long) iterator.next(); + long flags = flagsL.longValue(); + if ((flags & (1 << 19)) != 0) { + fieldSignature.remove(fieldSignature.size() - 1); + } + if ((flags & (1 << 17)) != 0) { + fieldConstantValueKQ.remove(fieldConstantValueKQ.size() - 1); + } + if ((flags & (1 << 21)) != 0) { + field_RVA_bands.removeLatest(); + } + if ((flags & (1 << 22)) != 0) { + field_RIA_bands.removeLatest(); + } + } + for (Iterator iterator = tempMethodFlags.iterator(); iterator.hasNext();) { + Long flagsL = (Long) iterator.next(); + long flags = flagsL.longValue(); + if ((flags & (1 << 19)) != 0) { + methodSignature.remove(methodSignature.size() - 1); + } + if ((flags & (1 << 18)) != 0) { + int exceptions = methodExceptionNumber + .remove(methodExceptionNumber.size() - 1); + for (int i = 0; i < exceptions; i++) { + methodExceptionClasses + .remove(methodExceptionClasses.size() - 1); + } + } + if ((flags & (1 << 17)) != 0) { // has code attribute + codeMaxLocals.remove(codeMaxLocals.size() - 1); + codeMaxStack.remove(codeMaxStack.size() - 1); + int handlers = codeHandlerCount + .remove(codeHandlerCount.size() - 1); + for (int i = 0; i < handlers; i++) { + int index = codeHandlerStartP.size() - 1; + codeHandlerStartP.remove(index); + codeHandlerEndPO.remove(index); + codeHandlerCatchPO.remove(index); + codeHandlerClass.remove(index); + } + if (!stripDebug) { + long cdeFlags = ((Long) codeFlags + .remove(codeFlags.size() - 1)).longValue(); + int numLocalVariables = codeLocalVariableTableN + .remove(codeLocalVariableTableN.size() - 1); + for (int i = 0; i < numLocalVariables; i++) { + int location = codeLocalVariableTableBciP.size() - 1; + codeLocalVariableTableBciP.remove(location); + codeLocalVariableTableSpanO.remove(location); + codeLocalVariableTableNameRU.remove(location); + codeLocalVariableTableTypeRS.remove(location); + codeLocalVariableTableSlot.remove(location); + } + if ((cdeFlags & (1 << 3)) != 0) { + int numLocalVariablesInTypeTable = codeLocalVariableTypeTableN + .remove(codeLocalVariableTypeTableN.size() - 1); + for (int i = 0; i < numLocalVariablesInTypeTable; i++) { + int location = codeLocalVariableTypeTableBciP + .size() - 1; + codeLocalVariableTypeTableBciP.remove(location); + codeLocalVariableTypeTableSpanO.remove(location); + codeLocalVariableTypeTableNameRU.remove(location); + codeLocalVariableTypeTableTypeRS.remove(location); + codeLocalVariableTypeTableSlot.remove(location); + } + } + if ((cdeFlags & (1 << 1)) != 0) { + int numLineNumbers = codeLineNumberTableN + .remove(codeLineNumberTableN.size() - 1); + for (int i = 0; i < numLineNumbers; i++) { + int location = codeLineNumberTableBciP.size() - 1; + codeLineNumberTableBciP.remove(location); + codeLineNumberTableLine.remove(location); + } + } + } + } + if ((flags & (1 << 21)) != 0) { + method_RVA_bands.removeLatest(); + } + if ((flags & (1 << 22)) != 0) { + method_RIA_bands.removeLatest(); + } + if ((flags & (1 << 23)) != 0) { + method_RVPA_bands.removeLatest(); + } + if ((flags & (1 << 24)) != 0) { + method_RIPA_bands.removeLatest(); + } + if ((flags & (1 << 25)) != 0) { + method_AD_bands.removeLatest(); + } + } + class_this[index] = null; + class_super[index] = null; + class_interface_count[index] = 0; + class_interface[index] = null; + major_versions[index] = 0; + class_flags[index] = 0; + tempFieldDesc.clear(); + tempFieldFlags.clear(); + tempMethodDesc.clear(); + tempMethodFlags.clear(); + index--; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/Codec.java b/src/main/java/org/apache/harmony/pack200/Codec.java new file mode 100644 index 0000000..83b80e0 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/Codec.java @@ -0,0 +1,246 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.InputStream; + + +/** + * A Codec allows a sequence of bytes to be decoded into integer values (or vice + * versa). + * + * There are a number of standard Codecs ({@link #UDELTA5}, {@link #UNSIGNED5}, + * {@link #BYTE1}, {@link #CHAR3}) that are used in the implementation of many + * bands; but there are a variety of other ones, and indeed the specification + * assumes that other combinations of values can result in more specific and + * efficient formats. There are also a sequence of canonical encodings defined + * by the Pack200 specification, which allow a Codec to be referred to by + * canonical number. {@link CodecEncoding#getCodec(int, InputStream, Codec)}) + */ +public abstract class Codec { + + /** + * BCI5 = (5,4): Used for storing branching information in bytecode. + */ + public static final BHSDCodec BCI5 = new BHSDCodec(5, 4); + + /** + * BRANCH5 = (5,4,2): Used for storing branching information in bytecode. + */ + public static final BHSDCodec BRANCH5 = new BHSDCodec(5, 4, 2); + + /** + * BYTE1 = (1,256): Used for storing plain bytes. + */ + public static final BHSDCodec BYTE1 = new BHSDCodec(1, 256); + + /** + * CHAR3 = (3,128): Used for storing text (UTF-8) strings. NB This isn't + * quite the same as UTF-8, but has similar properties; ASCII characters + * < 127 are stored in a single byte. + */ + public static final BHSDCodec CHAR3 = new BHSDCodec(3, 128); + + /** + * DELTA5 = (5,64,1,1): Used for the majority of numerical codings where + * there is a correlated sequence of signed values. + */ + public static final BHSDCodec DELTA5 = new BHSDCodec(5, 64, 1, 1); + + /** + * MDELTA5 = (5,64,2,1): Used for the majority of numerical codings where + * there is a correlated sequence of signed values, but where most of them + * are expected to be non-negative. + */ + public static final BHSDCodec MDELTA5 = new BHSDCodec(5, 64, 2, 1); + + /** + * SIGNED5 = (5,64,1): Used for small signed values. + */ + public static final BHSDCodec SIGNED5 = new BHSDCodec(5, 64, 1); + + /** + * UDELTA5 = (5,64,0,1): Used for the majority of numerical codings where + * there is a correlated sequence of unsigned values. + */ + public static final BHSDCodec UDELTA5 = new BHSDCodec(5, 64, 0, 1); + + /** + * UNSIGNED5 = (5,64): Used for small unsigned values. + */ + public static final BHSDCodec UNSIGNED5 = new BHSDCodec(5, 64); + + public int lastBandLength; + + /** + * Decode a sequence of bytes from the given input stream, returning the + * value as a long. Note that this method can only be applied for non-delta + * encodings. + * + * @param in + * the input stream to read from + * @return the value as a long + * @throws IOException + * if there is a problem reading from the underlying input + * stream + * @throws Pack200Exception + * if the encoding is a delta encoding + */ + public abstract int decode(InputStream in) throws IOException, + Pack200Exception; + + /** + * Encode a single value into a sequence of bytes. + * + * @param value + * the value to encode + * @param last + * the previous value encoded (for delta encodings) + * @return the encoded bytes + * @throws Pack200Exception + */ + public abstract byte[] encode(int value, int last) + throws Pack200Exception; + + /** + * Encode a single value into a sequence of bytes. Note that this method can + * only be used for non-delta encodings. + * + * @param value + * the value to encode + * @return the encoded bytes + * @throws Pack200Exception + */ + public abstract byte[] encode(int value) throws Pack200Exception; + + /** + * Decode a sequence of bytes from the given input stream, returning the + * value as a long. If this encoding is a delta encoding (d=1) then the + * previous value must be passed in as a parameter. If it is a non-delta + * encoding, then it does not matter what value is passed in, so it makes + * sense for the value to be passed in by default using code similar to: + * + *
+     * long last = 0;
+     * while (condition) {
+     *     last = codec.decode(in, last);
+     *     // do something with last
+     * }
+     * 
+ * + * @param in + * the input stream to read from + * @param last + * the previous value read, which must be supplied if the codec + * is a delta encoding + * @return the value as a long + * @throws IOException + * if there is a problem reading from the underlying input + * stream + * @throws Pack200Exception + * if there is a problem decoding the value or that the value is + * invalid + */ + public abstract int decode(InputStream in, long last) throws IOException, + Pack200Exception; + + /** + * Decodes a sequence of n values from in. + * This should probably be used in most cases, since some codecs (such as + * + * @{link PopCodec}) only work when the number of values to be read is + * known. + * + * @param n + * the number of values to decode + * @param in + * the input stream to read from + * @return an array of int values corresponding to values + * decoded + * @throws IOException + * if there is a problem reading from the underlying input + * stream + * @throws Pack200Exception + * if there is a problem decoding the value or that the value is + * invalid + */ + public int[] decodeInts(int n, InputStream in) throws IOException, + Pack200Exception { + lastBandLength = 0; + int result[] = new int[n]; + int last = 0; + for (int i = 0; i < n; i++) { + result[i] = last = decode(in, last); + } + return result; + } + + /** + * Decodes a sequence of n values from in. + * + * @param n + * the number of values to decode + * @param in + * the input stream to read from + * @param firstValue + * the first value in the band if it has already been read + * @return an array of int values corresponding to values + * decoded, with firstValue as the first value in the array. + * @throws IOException + * if there is a problem reading from the underlying input + * stream + * @throws Pack200Exception + * if there is a problem decoding the value or that the value is + * invalid + */ + public int[] decodeInts(int n, InputStream in, int firstValue) + throws IOException, Pack200Exception { + int result[] = new int[n + 1]; + result[0] = firstValue; + int last = firstValue; + for (int i = 1; i < n + 1; i++) { + result[i] = last = decode(in, last); + } + return result; + } + + /** + * Encode a sequence of integers into a byte array + * + * @param ints + * the values to encode + * @return byte[] encoded bytes + * @throws Pack200Exception + * if there is a problem encoding any of the values + */ + public byte[] encode(int[] ints) throws Pack200Exception { + int total = 0; + byte[][] bytes = new byte[ints.length][]; + for (int i = 0; i < ints.length; i++) { + bytes[i] = encode(ints[i], i > 0 ? ints[i-1] : 0); + total += bytes[i].length; + } + byte[] encoded = new byte[total]; + int index = 0; + for (int i = 0; i < bytes.length; i++) { + System.arraycopy(bytes[i], 0, encoded, index, bytes[i].length); + index += bytes[i].length; + } + return encoded; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/CodecEncoding.java b/src/main/java/org/apache/harmony/pack200/CodecEncoding.java new file mode 100644 index 0000000..c7df8a4 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CodecEncoding.java @@ -0,0 +1,346 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + + +/** + * CodecEncoding is used to get the right Codec for a given meta-encoding + */ +public class CodecEncoding { + + /** + * The canonical encodings are defined to allow a single byte to represent + * one of the standard encodings. The following values are defined in the + * Pack200 specification, and this array cannot be changed. + */ + private static final BHSDCodec[] canonicalCodec = { null, + new BHSDCodec(1, 256), new BHSDCodec(1, 256, 1), + new BHSDCodec(1, 256, 0, 1), new BHSDCodec(1, 256, 1, 1), + new BHSDCodec(2, 256), new BHSDCodec(2, 256, 1), + new BHSDCodec(2, 256, 0, 1), new BHSDCodec(2, 256, 1, 1), + new BHSDCodec(3, 256), new BHSDCodec(3, 256, 1), + new BHSDCodec(3, 256, 0, 1), new BHSDCodec(3, 256, 1, 1), + new BHSDCodec(4, 256), new BHSDCodec(4, 256, 1), + new BHSDCodec(4, 256, 0, 1), new BHSDCodec(4, 256, 1, 1), + new BHSDCodec(5, 4), new BHSDCodec(5, 4, 1), + new BHSDCodec(5, 4, 2), new BHSDCodec(5, 16), + new BHSDCodec(5, 16, 1), new BHSDCodec(5, 16, 2), + new BHSDCodec(5, 32), new BHSDCodec(5, 32, 1), + new BHSDCodec(5, 32, 2), new BHSDCodec(5, 64), + new BHSDCodec(5, 64, 1), new BHSDCodec(5, 64, 2), + new BHSDCodec(5, 128), new BHSDCodec(5, 128, 1), + new BHSDCodec(5, 128, 2), new BHSDCodec(5, 4, 0, 1), + new BHSDCodec(5, 4, 1, 1), new BHSDCodec(5, 4, 2, 1), + new BHSDCodec(5, 16, 0, 1), new BHSDCodec(5, 16, 1, 1), + new BHSDCodec(5, 16, 2, 1), new BHSDCodec(5, 32, 0, 1), + new BHSDCodec(5, 32, 1, 1), new BHSDCodec(5, 32, 2, 1), + new BHSDCodec(5, 64, 0, 1), new BHSDCodec(5, 64, 1, 1), + new BHSDCodec(5, 64, 2, 1), new BHSDCodec(5, 128, 0, 1), + new BHSDCodec(5, 128, 1, 1), new BHSDCodec(5, 128, 2, 1), + new BHSDCodec(2, 192), new BHSDCodec(2, 224), + new BHSDCodec(2, 240), new BHSDCodec(2, 248), + new BHSDCodec(2, 252), new BHSDCodec(2, 8, 0, 1), + new BHSDCodec(2, 8, 1, 1), new BHSDCodec(2, 16, 0, 1), + new BHSDCodec(2, 16, 1, 1), new BHSDCodec(2, 32, 0, 1), + new BHSDCodec(2, 32, 1, 1), new BHSDCodec(2, 64, 0, 1), + new BHSDCodec(2, 64, 1, 1), new BHSDCodec(2, 128, 0, 1), + new BHSDCodec(2, 128, 1, 1), new BHSDCodec(2, 192, 0, 1), + new BHSDCodec(2, 192, 1, 1), new BHSDCodec(2, 224, 0, 1), + new BHSDCodec(2, 224, 1, 1), new BHSDCodec(2, 240, 0, 1), + new BHSDCodec(2, 240, 1, 1), new BHSDCodec(2, 248, 0, 1), + new BHSDCodec(2, 248, 1, 1), new BHSDCodec(3, 192), + new BHSDCodec(3, 224), new BHSDCodec(3, 240), + new BHSDCodec(3, 248), new BHSDCodec(3, 252), + new BHSDCodec(3, 8, 0, 1), new BHSDCodec(3, 8, 1, 1), + new BHSDCodec(3, 16, 0, 1), new BHSDCodec(3, 16, 1, 1), + new BHSDCodec(3, 32, 0, 1), new BHSDCodec(3, 32, 1, 1), + new BHSDCodec(3, 64, 0, 1), new BHSDCodec(3, 64, 1, 1), + new BHSDCodec(3, 128, 0, 1), new BHSDCodec(3, 128, 1, 1), + new BHSDCodec(3, 192, 0, 1), new BHSDCodec(3, 192, 1, 1), + new BHSDCodec(3, 224, 0, 1), new BHSDCodec(3, 224, 1, 1), + new BHSDCodec(3, 240, 0, 1), new BHSDCodec(3, 240, 1, 1), + new BHSDCodec(3, 248, 0, 1), new BHSDCodec(3, 248, 1, 1), + new BHSDCodec(4, 192), new BHSDCodec(4, 224), + new BHSDCodec(4, 240), new BHSDCodec(4, 248), + new BHSDCodec(4, 252), new BHSDCodec(4, 8, 0, 1), + new BHSDCodec(4, 8, 1, 1), new BHSDCodec(4, 16, 0, 1), + new BHSDCodec(4, 16, 1, 1), new BHSDCodec(4, 32, 0, 1), + new BHSDCodec(4, 32, 1, 1), new BHSDCodec(4, 64, 0, 1), + new BHSDCodec(4, 64, 1, 1), new BHSDCodec(4, 128, 0, 1), + new BHSDCodec(4, 128, 1, 1), new BHSDCodec(4, 192, 0, 1), + new BHSDCodec(4, 192, 1, 1), new BHSDCodec(4, 224, 0, 1), + new BHSDCodec(4, 224, 1, 1), new BHSDCodec(4, 240, 0, 1), + new BHSDCodec(4, 240, 1, 1), new BHSDCodec(4, 248, 0, 1), + new BHSDCodec(4, 248, 1, 1) }; + + private static Map canonicalCodecsToSpecifiers; + + + /** + * Returns the codec specified by the given value byte and optional byte + * header. If the value is >=116, then bytes may be consumed from the + * secondary input stream, which is taken to be the contents of the + * band_headers byte array. Since the values from this are consumed and not + * repeated, the input stream should be reused for subsequent encodings. + * This does not therefore close the input stream. + * + * @param value + * the canonical encoding value + * @param in + * the input stream to read additional byte headers from + * @param defaultCodec + * TODO + * @return the corresponding codec, or null if the default + * should be used + * + * @throws IOException + * if there is a problem reading from the input stream (which in + * reality, is never, since the band_headers are likely stored + * in a byte array and accessed via a ByteArrayInputStream. + * However, an EOFException could occur if things go wrong) + * @throws Pack200Exception + */ + public static Codec getCodec(int value, InputStream in, Codec defaultCodec) + throws IOException, Pack200Exception { + // Sanity check to make sure that no-one has changed + // the canonical codecs, which would really cause havoc + if (canonicalCodec.length != 116) { + throw new Error( + "Canonical encodings have been incorrectly modified"); + } + if (value < 0) { + throw new IllegalArgumentException( + "Encoding cannot be less than zero"); + } else if (value == 0) { + return defaultCodec; + } else if (value <= 115) { + return canonicalCodec[value]; + } else if (value == 116) { + int code = in.read(); + if (code == -1) { + throw new EOFException( + "End of buffer read whilst trying to decode codec"); + } + int d = (code & 0x01); + int s = (code >> 1 & 0x03); + int b = (code >> 3 & 0x07) + 1; // this might result in an invalid + // number, but it's checked in the + // Codec constructor + code = in.read(); + if (code == -1) { + throw new EOFException( + "End of buffer read whilst trying to decode codec"); + } + int h = code + 1; + // This handles the special cases for invalid combinations of data. + return new BHSDCodec(b, h, s, d); + } else if (value >= 117 && value <= 140) { // Run codec + int offset = value - 117; + int kx = offset & 3; + boolean kbflag = (offset >> 2 & 1) == 1; + boolean adef = (offset >> 3 & 1) == 1; + boolean bdef = (offset >> 4 & 1) == 1; + // If both A and B use the default encoding, what's the point of + // having a run of default values followed by default values + if (adef && bdef) { + throw new Pack200Exception( + "ADef and BDef should never both be true"); + } + int kb = (kbflag ? in.read() : 3); + int k = (kb + 1) * (int) Math.pow(16, kx); + Codec aCodec, bCodec; + if (adef) { + aCodec = defaultCodec; + } else { + aCodec = getCodec(in.read(), in, defaultCodec); + } + if (bdef) { + bCodec = defaultCodec; + } else { + bCodec = getCodec(in.read(), in, defaultCodec); + } + return new RunCodec(k, aCodec, bCodec); + } else if (value >= 141 && value <= 188) { // Population Codec + int offset = value - 141; + boolean fdef = (offset & 1) == 1; + boolean udef = (offset >> 1 & 1) == 1; + int tdefl = offset >> 2; + boolean tdef = tdefl != 0; + // From section 6.7.3 of spec + final int[] tdefToL = { 0, 4, 8, 16, 32, 64, 128, 192, 224, 240, + 248, 252 }; + int l = tdefToL[tdefl]; + // NOTE: Do not re-factor this to bring out uCodec; the order in + // which + // they are read from the stream is important + if (tdef) { + Codec fCodec = (fdef ? defaultCodec : getCodec(in.read(), in, + defaultCodec)); + Codec uCodec = (udef ? defaultCodec : getCodec(in.read(), in, + defaultCodec)); + // Unfortunately, if tdef, then tCodec depends both on l and + // also on k, the + // number of items read from the fCodec. So we don't know in + // advance what + // the codec will be. + return new PopulationCodec(fCodec, l, uCodec); + } else { + Codec fCodec = (fdef ? defaultCodec : getCodec(in.read(), in, + defaultCodec)); + Codec tCodec = getCodec(in.read(), in, defaultCodec); + Codec uCodec = (udef ? defaultCodec : getCodec(in.read(), in, + defaultCodec)); + return new PopulationCodec(fCodec, tCodec, uCodec); + } + } else { + throw new Pack200Exception("Invalid codec encoding byte (" + value + + ") found"); + } + } + + public static int getSpecifierForDefaultCodec(BHSDCodec defaultCodec) { + return getSpecifier(defaultCodec, null)[0]; + } + + public static int[] getSpecifier(Codec codec, Codec defaultForBand) { + // lazy initialization + if(canonicalCodecsToSpecifiers == null) { + HashMap reverseMap = new HashMap(canonicalCodec.length); + for (int i = 0; i < canonicalCodec.length; i++) { + reverseMap.put(canonicalCodec[i], new Integer(i)); + } + canonicalCodecsToSpecifiers = reverseMap; + } + + if(canonicalCodecsToSpecifiers.containsKey(codec)) { + return new int[] {((Integer)canonicalCodecsToSpecifiers.get(codec)).intValue()}; + } else if (codec instanceof BHSDCodec) { + // Cache these? + BHSDCodec bhsdCodec = (BHSDCodec)codec; + int[] specifiers = new int[3]; + specifiers[0] = 116; + specifiers[1] = (bhsdCodec.isDelta() ? 1 : 0) + 2 + * bhsdCodec.getS() + 8 * (bhsdCodec.getB()-1); + specifiers[2] = bhsdCodec.getH() - 1; + return specifiers; + } else if (codec instanceof RunCodec) { + RunCodec runCodec = (RunCodec) codec; + int k = runCodec.getK(); + int kb; + int kx; + if(k <= 256) { + kb = 0; + kx = k - 1; + } else if (k <= 4096) { + kb = 1; + kx = k/16 - 1; + } else if (k <= 65536) { + kb = 2; + kx = k/256 - 1; + } else { + kb = 3; + kx = k/4096 - 1; + } + Codec aCodec = runCodec.getACodec(); + Codec bCodec = runCodec.getBCodec(); + int abDef = 0; + if(aCodec.equals(defaultForBand)) { + abDef = 1; + } else if (bCodec.equals(defaultForBand)) { + abDef = 2; + } + int first = 117 + kb + (kx==3 ? 0 : 4) + (8 * abDef); + int[] aSpecifier = abDef == 1 ? new int[0] : getSpecifier(aCodec, defaultForBand); + int[] bSpecifier = abDef == 2 ? new int[0] : getSpecifier(bCodec, defaultForBand); + int[] specifier = new int[1 + (kx==3 ? 0 : 1) + aSpecifier.length + bSpecifier.length]; + specifier[0] = first; + int index = 1; + if(kx != 3) { + specifier[1] = kx; + index++; + } + for (int i = 0; i < aSpecifier.length; i++) { + specifier[index] = aSpecifier[i]; + index++; + } + for (int i = 0; i < bSpecifier.length; i++) { + specifier[index] = bSpecifier[i]; + index++; + } + return specifier; + } else if (codec instanceof PopulationCodec) { + PopulationCodec populationCodec = (PopulationCodec) codec; + Codec tokenCodec = populationCodec.getTokenCodec(); + Codec favouredCodec = populationCodec.getFavouredCodec(); + Codec unfavouredCodec = populationCodec.getUnfavouredCodec(); + int fDef = favouredCodec.equals(defaultForBand) ? 1 : 0; + int uDef = unfavouredCodec.equals(defaultForBand) ? 1 : 0; + int tDefL = 0; + int[] favoured = populationCodec.getFavoured(); + if(favoured != null) { + int k = favoured.length; + if(tokenCodec == Codec.BYTE1) { + tDefL = 1; + } else if (tokenCodec instanceof BHSDCodec) { + BHSDCodec tokenBHSD = (BHSDCodec) tokenCodec; + if(tokenBHSD.getS() == 0) { + int[] possibleLValues = new int[] {4, 8, 16, 32, 64, 128, 192, 224, 240, 248, 252}; + int l = 256-tokenBHSD.getH(); + int index = Arrays.binarySearch(possibleLValues, l); + if(index != -1) { + // TODO: check range is ok for ks + tDefL = index++; + } + } + } + } + int first = 141 + fDef + (2 * uDef) + (4 * tDefL); + int[] favouredSpecifier = fDef == 1 ? new int[0] : getSpecifier(favouredCodec, defaultForBand); + int[] tokenSpecifier = tDefL != 0 ? new int[0] : getSpecifier(tokenCodec, defaultForBand); + int[] unfavouredSpecifier = uDef == 1 ? new int[0] : getSpecifier(unfavouredCodec, defaultForBand); + int[] specifier = new int[1 + favouredSpecifier.length + unfavouredSpecifier.length + tokenSpecifier.length]; + specifier[0] = first; + int index = 1; + for (int i = 0; i < favouredSpecifier.length; i++) { + specifier[index] = favouredSpecifier[i]; + index++; + } + for (int i = 0; i < tokenSpecifier.length; i++) { + specifier[index] = tokenSpecifier[i]; + index++; + } + for (int i = 0; i < unfavouredSpecifier.length; i++) { + specifier[index] = unfavouredSpecifier[i]; + index++; + } + return specifier; + } + + return null; + } + + public static BHSDCodec getCanonicalCodec(int i) { + return canonicalCodec[i]; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/ConstantPoolEntry.java b/src/main/java/org/apache/harmony/pack200/ConstantPoolEntry.java new file mode 100644 index 0000000..d2fd1b3 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/ConstantPoolEntry.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Abstract superclass for constant pool entries + */ +public abstract class ConstantPoolEntry { + + private int index = -1; + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/CpBands.java b/src/main/java/org/apache/harmony/pack200/CpBands.java new file mode 100644 index 0000000..a4cfebf --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/CpBands.java @@ -0,0 +1,694 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import org.objectweb.asm.Type; + +/** + * Pack200 Constant Pool Bands + */ +public class CpBands extends BandSet { + + // Don't need to include default attribute names in the constant pool bands + private final Set defaultAttributeNames = new HashSet(); + + private final Set cp_Utf8 = new TreeSet(); + private final Set cp_Int = new TreeSet(); + private final Set cp_Float = new TreeSet(); + private final Set cp_Long = new TreeSet(); + private final Set cp_Double = new TreeSet(); + private final Set cp_String = new TreeSet(); + private final Set cp_Class = new TreeSet(); + private final Set cp_Signature = new TreeSet(); + private final Set cp_Descr = new TreeSet(); + private final Set cp_Field = new TreeSet(); + private final Set cp_Method = new TreeSet(); + private final Set cp_Imethod = new TreeSet(); + + private final Map stringsToCpUtf8 = new HashMap(); + private final Map stringsToCpNameAndType = new HashMap(); + private final Map stringsToCpClass = new HashMap(); + private final Map stringsToCpSignature = new HashMap(); + private final Map stringsToCpMethod = new HashMap(); + private final Map stringsToCpField = new HashMap(); + private final Map stringsToCpIMethod = new HashMap(); + + private final Map objectsToCPConstant = new HashMap(); + + private final Segment segment; + + public CpBands(Segment segment, int effort) { + super(effort, segment.getSegmentHeader()); + this.segment = segment; + defaultAttributeNames.add("AnnotationDefault"); + defaultAttributeNames.add("RuntimeVisibleAnnotations"); + defaultAttributeNames.add("RuntimeInvisibleAnnotations"); + defaultAttributeNames.add("RuntimeVisibleParameterAnnotations"); + defaultAttributeNames.add("RuntimeInvisibleParameterAnnotations"); + defaultAttributeNames.add("Code"); + defaultAttributeNames.add("LineNumberTable"); + defaultAttributeNames.add("LocalVariableTable"); + defaultAttributeNames.add("LocalVariableTypeTable"); + defaultAttributeNames.add("ConstantValue"); + defaultAttributeNames.add("Deprecated"); + defaultAttributeNames.add("EnclosingMethod"); + defaultAttributeNames.add("Exceptions"); + defaultAttributeNames.add("InnerClasses"); + defaultAttributeNames.add("Signature"); + defaultAttributeNames.add("SourceFile"); + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + PackingUtils.log("Writing constant pool bands..."); + writeCpUtf8(out); + writeCpInt(out); + writeCpFloat(out); + writeCpLong(out); + writeCpDouble(out); + writeCpString(out); + writeCpClass(out); + writeCpSignature(out); + writeCpDescr(out); + writeCpMethodOrField(cp_Field, out, "cp_Field"); + writeCpMethodOrField(cp_Method, out, "cp_Method"); + writeCpMethodOrField(cp_Imethod, out, "cp_Imethod"); + } + + private void writeCpUtf8(OutputStream out) throws IOException, + Pack200Exception { + PackingUtils.log("Writing " + cp_Utf8.size() + " UTF8 entries..."); + int[] cpUtf8Prefix = new int[cp_Utf8.size() - 2]; + int[] cpUtf8Suffix = new int[cp_Utf8.size() - 1]; + List chars = new ArrayList(); + List bigSuffix = new ArrayList(); + List bigChars = new ArrayList(); + Object[] cpUtf8Array = cp_Utf8.toArray(); + String first = ((CPUTF8) cpUtf8Array[1]).getUnderlyingString(); + cpUtf8Suffix[0] = first.length(); + addCharacters(chars, first.toCharArray()); + for (int i = 2; i < cpUtf8Array.length; i++) { + char[] previous = ((CPUTF8) cpUtf8Array[i - 1]) + .getUnderlyingString().toCharArray(); + String currentStr = ((CPUTF8) cpUtf8Array[i]).getUnderlyingString(); + char[] current = currentStr.toCharArray(); + int prefix = 0; + for (int j = 0; j < previous.length; j++) { + if (previous[j] == current[j]) { + prefix++; + } else { + break; + } + } + cpUtf8Prefix[i - 2] = prefix; + currentStr = currentStr.substring(prefix); + char[] suffix = currentStr.toCharArray(); + if (suffix.length > 1000) { // big suffix (1000 is arbitrary - can we + // do better?) + cpUtf8Suffix[i - 1] = 0; + bigSuffix.add(new Integer(suffix.length)); + addCharacters(bigChars, suffix); + } else { + cpUtf8Suffix[i - 1] = suffix.length; + addCharacters(chars, suffix); + } + } + int[] cpUtf8Chars = new int[chars.size()]; + int[] cpUtf8BigSuffix = new int[bigSuffix.size()]; + int[][] cpUtf8BigChars = new int[bigSuffix.size()][]; + for (int i = 0; i < cpUtf8Chars.length; i++) { + cpUtf8Chars[i] = ((Character) chars.get(i)).charValue(); + } + for (int i = 0; i < cpUtf8BigSuffix.length; i++) { + int numBigChars = ((Integer) bigSuffix.get(i)).intValue(); + cpUtf8BigSuffix[i] = numBigChars; + cpUtf8BigChars[i] = new int[numBigChars]; + for (int j = 0; j < numBigChars; j++) { + cpUtf8BigChars[i][j] = ((Character) bigChars.remove(0)).charValue(); + } + } + + byte[] encodedBand = encodeBandInt("cpUtf8Prefix", cpUtf8Prefix, Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cpUtf8Prefix[" + cpUtf8Prefix.length + "]"); + + encodedBand = encodeBandInt("cpUtf8Suffix", cpUtf8Suffix, Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cpUtf8Suffix[" + cpUtf8Suffix.length + "]"); + + encodedBand = encodeBandInt("cpUtf8Chars", cpUtf8Chars, Codec.CHAR3); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cpUtf8Chars[" + cpUtf8Chars.length + "]"); + + encodedBand = encodeBandInt("cpUtf8BigSuffix", cpUtf8BigSuffix, + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cpUtf8BigSuffix[" + cpUtf8BigSuffix.length + "]"); + + for (int i = 0; i < cpUtf8BigChars.length; i++) { + encodedBand = encodeBandInt("cpUtf8BigChars " + i, + cpUtf8BigChars[i], Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cpUtf8BigChars" + i + "[" + + cpUtf8BigChars[i].length + "]"); + } + } + + private void addCharacters(List chars, char[] charArray) { + for (int i = 0; i < charArray.length; i++) { + chars.add(new Character(charArray[i])); + } + } + + private void writeCpInt(OutputStream out) throws IOException, + Pack200Exception { + PackingUtils.log("Writing " + cp_Int.size() + " Integer entries..."); + int[] cpInt = new int[cp_Int.size()]; + int i = 0; + for (Iterator iterator = cp_Int.iterator(); iterator.hasNext();) { + CPInt integer = (CPInt) iterator.next(); + cpInt[i] = integer.getInt(); + i++; + } + byte[] encodedBand = encodeBandInt("cp_Int", cpInt, Codec.UDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cp_Int[" + cpInt.length + "]"); + } + + private void writeCpFloat(OutputStream out) throws IOException, + Pack200Exception { + PackingUtils.log("Writing " + cp_Float.size() + " Float entries..."); + int[] cpFloat = new int[cp_Float.size()]; + int i = 0; + for (Iterator iterator = cp_Float.iterator(); iterator.hasNext();) { + CPFloat fl = (CPFloat) iterator.next(); + cpFloat[i] = Float.floatToIntBits(fl.getFloat()); + i++; + } + byte[] encodedBand = encodeBandInt("cp_Float", cpFloat, Codec.UDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cp_Float[" + cpFloat.length + "]"); + } + + private void writeCpLong(OutputStream out) throws IOException, + Pack200Exception { + PackingUtils.log("Writing " + cp_Long.size() + " Long entries..."); + int[] highBits = new int[cp_Long.size()]; + int[] loBits = new int[cp_Long.size()]; + int i = 0; + for (Iterator iterator = cp_Long.iterator(); iterator.hasNext();) { + CPLong lng = (CPLong) iterator.next(); + long l = lng.getLong(); + highBits[i] = (int) (l >> 32); + loBits[i] = (int) l; + i++; + } + byte[] encodedBand = encodeBandInt("cp_Long_hi", highBits, Codec.UDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cp_Long_hi[" + highBits.length + "]"); + + encodedBand = encodeBandInt("cp_Long_lo", loBits, Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cp_Long_lo[" + loBits.length + "]"); + } + + private void writeCpDouble(OutputStream out) throws IOException, + Pack200Exception { + PackingUtils.log("Writing " + cp_Double.size() + " Double entries..."); + int[] highBits = new int[cp_Double.size()]; + int[] loBits = new int[cp_Double.size()]; + int i = 0; + for (Iterator iterator = cp_Double.iterator(); iterator.hasNext();) { + CPDouble dbl = (CPDouble) iterator.next(); + long l = Double.doubleToLongBits(dbl.getDouble()); + highBits[i] = (int) (l >> 32); + loBits[i] = (int) l; + i++; + } + byte[] encodedBand = encodeBandInt("cp_Double_hi", highBits, Codec.UDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cp_Double_hi[" + highBits.length + "]"); + + encodedBand = encodeBandInt("cp_Double_lo", loBits, Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cp_Double_lo[" + loBits.length + "]"); + } + + private void writeCpString(OutputStream out) throws IOException, + Pack200Exception { + PackingUtils.log("Writing " + cp_String.size() + " String entries..."); + int[] cpString = new int[cp_String.size()]; + int i = 0; + for (Iterator iterator = cp_String.iterator(); iterator.hasNext();) { + CPString cpStr = (CPString) iterator.next(); + cpString[i] = cpStr.getIndexInCpUtf8(); + i++; + } + byte[] encodedBand = encodeBandInt("cpString", cpString, Codec.UDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cpString[" + cpString.length + "]"); + } + + private void writeCpClass(OutputStream out) throws IOException, + Pack200Exception { + PackingUtils.log("Writing " + cp_Class.size() + " Class entries..."); + int[] cpClass = new int[cp_Class.size()]; + int i = 0; + for (Iterator iterator = cp_Class.iterator(); iterator.hasNext();) { + CPClass cpCl = (CPClass) iterator.next(); + cpClass[i] = cpCl.getIndexInCpUtf8(); + i++; + } + byte[] encodedBand = encodeBandInt("cpClass", cpClass, Codec.UDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cpClass[" + cpClass.length + "]"); + } + + private void writeCpSignature(OutputStream out) throws IOException, + Pack200Exception { + PackingUtils.log("Writing " + cp_Signature.size() + " Signature entries..."); + int[] cpSignatureForm = new int[cp_Signature.size()]; + List classes = new ArrayList(); + int i = 0; + for (Iterator iterator = cp_Signature.iterator(); iterator.hasNext();) { + CPSignature cpS = (CPSignature) iterator.next(); + classes.addAll(cpS.getClasses()); + cpSignatureForm[i] = cpS.getIndexInCpUtf8(); + i++; + } + int[] cpSignatureClasses = new int[classes.size()]; + for (int j = 0; j < cpSignatureClasses.length; j++) { + cpSignatureClasses[j] = ((CPClass) classes.get(j)).getIndex(); + } + + byte[] encodedBand = encodeBandInt("cpSignatureForm", cpSignatureForm, + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cpSignatureForm[" + cpSignatureForm.length + "]"); + + encodedBand = encodeBandInt("cpSignatureClasses", cpSignatureClasses, + Codec.UDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cpSignatureClasses[" + cpSignatureClasses.length + "]"); + } + + private void writeCpDescr(OutputStream out) throws IOException, + Pack200Exception { + PackingUtils.log("Writing " + cp_Descr.size() + + " Descriptor entries..."); + int[] cpDescrName = new int[cp_Descr.size()]; + int[] cpDescrType = new int[cp_Descr.size()]; + int i = 0; + for (Iterator iterator = cp_Descr.iterator(); iterator.hasNext();) { + CPNameAndType nameAndType = (CPNameAndType) iterator.next(); + cpDescrName[i] = nameAndType.getNameIndex(); + cpDescrType[i] = nameAndType.getTypeIndex(); + i++; + } + + byte[] encodedBand = encodeBandInt("cp_Descr_Name", cpDescrName, + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cp_Descr_Name[" + cpDescrName.length + "]"); + + encodedBand = encodeBandInt("cp_Descr_Type", cpDescrType, Codec.UDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from cp_Descr_Type[" + cpDescrType.length + "]"); + } + + private void writeCpMethodOrField(Set cp, OutputStream out, String name) + throws IOException, Pack200Exception { + PackingUtils.log("Writing " + cp.size() + + " Method and Field entries..."); + int[] cp_methodOrField_class = new int[cp.size()]; + int[] cp_methodOrField_desc = new int[cp.size()]; + int i = 0; + for (Iterator iterator = cp.iterator(); iterator.hasNext();) { + CPMethodOrField mOrF = (CPMethodOrField) iterator.next(); + cp_methodOrField_class[i] = mOrF.getClassIndex(); + cp_methodOrField_desc[i] = mOrF.getDescIndex(); + i++; + } + byte[] encodedBand = encodeBandInt(name + "_class", + cp_methodOrField_class, Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + name + "_class[" + cp_methodOrField_class.length + "]"); + + encodedBand = encodeBandInt(name + "_desc", cp_methodOrField_desc, + Codec.UDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + name + "_desc[" + cp_methodOrField_desc.length + "]"); + } + + /** + * All input classes for the segment have now been read in, so this method + * is called so that this class can calculate/complete anything it could not + * do while classes were being read. + */ + public void finaliseBands() { + addCPUtf8(""); + removeSignaturesFromCpUTF8(); + addIndices(); + segmentHeader.setCp_Utf8_count(cp_Utf8.size()); + segmentHeader.setCp_Int_count(cp_Int.size()); + segmentHeader.setCp_Float_count(cp_Float.size()); + segmentHeader.setCp_Long_count(cp_Long.size()); + segmentHeader.setCp_Double_count(cp_Double.size()); + segmentHeader.setCp_String_count(cp_String.size()); + segmentHeader.setCp_Class_count(cp_Class.size()); + segmentHeader.setCp_Signature_count(cp_Signature.size()); + segmentHeader.setCp_Descr_count(cp_Descr.size()); + segmentHeader.setCp_Field_count(cp_Field.size()); + segmentHeader.setCp_Method_count(cp_Method.size()); + segmentHeader.setCp_Imethod_count(cp_Imethod.size()); + } + + private void removeSignaturesFromCpUTF8() { + for (Iterator iterator = cp_Signature.iterator(); iterator.hasNext();) { + CPSignature signature = (CPSignature) iterator.next(); + String sigStr = signature.getUnderlyingString(); + CPUTF8 utf8 = signature.getSignatureForm(); + String form = utf8.getUnderlyingString(); + if (!sigStr.equals(form)) { + removeCpUtf8(sigStr); + } + } + } + + private void addIndices() { + Set[] sets = new Set[] { cp_Utf8, cp_Int, cp_Float, cp_Long, cp_Double, + cp_String, cp_Class, cp_Signature, cp_Descr, cp_Field, + cp_Method, cp_Imethod }; + for (int i = 0; i < sets.length; i++) { + int j = 0; + for (Iterator iterator = sets[i].iterator(); iterator.hasNext();) { + ConstantPoolEntry entry = (ConstantPoolEntry) iterator.next(); + entry.setIndex(j); + j++; + } + } + Map classNameToIndex = new HashMap(); + for (Iterator iterator = cp_Field.iterator(); iterator.hasNext();) { + CPMethodOrField mOrF = (CPMethodOrField) iterator.next(); + CPClass className = mOrF.getClassName(); + Integer index = (Integer) classNameToIndex.get(className); + if (index == null) { + classNameToIndex.put(className, new Integer(1)); + mOrF.setIndexInClass(0); + } else { + int theIndex = index.intValue(); + mOrF.setIndexInClass(theIndex); + classNameToIndex.put(className, new Integer(theIndex + 1)); + } + } + classNameToIndex.clear(); + Map classNameToConstructorIndex = new HashMap(); + for (Iterator iterator = cp_Method.iterator(); iterator.hasNext();) { + CPMethodOrField mOrF = (CPMethodOrField) iterator.next(); + CPClass className = mOrF.getClassName(); + Integer index = (Integer) classNameToIndex.get(className); + if (index == null) { + classNameToIndex.put(className, new Integer(1)); + mOrF.setIndexInClass(0); + } else { + int theIndex = index.intValue(); + mOrF.setIndexInClass(theIndex); + classNameToIndex.put(className, new Integer(theIndex + 1)); + } + if(mOrF.getDesc().getName().equals("")) { + Integer constructorIndex = (Integer) classNameToConstructorIndex.get(className); + if (constructorIndex == null) { + classNameToConstructorIndex.put(className, new Integer(1)); + mOrF.setIndexInClassForConstructor(0); + } else { + int theIndex = constructorIndex.intValue(); + mOrF.setIndexInClassForConstructor(theIndex); + classNameToConstructorIndex.put(className, new Integer(theIndex + 1)); + } + } + } + } + + private void removeCpUtf8(String string) { + CPUTF8 utf8 = (CPUTF8) stringsToCpUtf8.get(string); + if (utf8 != null) { + if(stringsToCpClass.get(string) == null) { // don't remove if strings are also in cpclass + stringsToCpUtf8.remove(string); + cp_Utf8.remove(utf8); + } + } + } + + void addCPUtf8(String utf8) { + getCPUtf8(utf8); + } + + public CPUTF8 getCPUtf8(String utf8) { + if(utf8 == null) { + return null; + } + CPUTF8 cpUtf8 = (CPUTF8) stringsToCpUtf8.get(utf8); + if (cpUtf8 == null) { + cpUtf8 = new CPUTF8(utf8); + cp_Utf8.add(cpUtf8); + stringsToCpUtf8.put(utf8, cpUtf8); + } + return cpUtf8; + } + + public void addCPNameAndType(String name, String signature) { + getCPNameAndType(name, signature); + } + + public void addCPSignature(String signature) { + getCPSignature(signature); + } + + public CPSignature getCPSignature(String signature) { + if(signature == null) { + return null; + } + CPSignature cpS = (CPSignature) stringsToCpSignature.get(signature); + if (cpS == null) { + List cpClasses = new ArrayList(); + CPUTF8 signatureUTF8; + if (signature.length() > 1 && signature.indexOf('L') != -1) { + List classes = new ArrayList(); + char[] chars = signature.toCharArray(); + StringBuffer signatureString = new StringBuffer(); + for (int i = 0; i < chars.length; i++) { + signatureString.append(chars[i]); + if (chars[i] == 'L') { + StringBuffer className = new StringBuffer(); + for (int j = i + 1; j < chars.length; j++) { + char c = chars[j]; + if (Character.isLetter(c) || Character.isDigit(c) + || c == '/' || c == '$' || c == '_') { + className.append(c); + } else { + classes.add(className.toString()); + i = j - 1; + break; + } + } + } + } + removeCpUtf8(signature); + for (Iterator iterator2 = classes.iterator(); iterator2 + .hasNext();) { + String className = (String) iterator2.next(); + CPClass cpClass = null; + if(className!= null) { + className = className.replace('.', '/'); + cpClass = (CPClass) stringsToCpClass.get(className); + if (cpClass == null) { + CPUTF8 cpUtf8 = getCPUtf8(className); + cpClass = new CPClass(cpUtf8); + cp_Class.add(cpClass); + stringsToCpClass.put(className, cpClass); + } + } + cpClasses.add(cpClass); + } + + signatureUTF8 = getCPUtf8(signatureString.toString()); + } else { + signatureUTF8 = getCPUtf8(signature); + } + cpS = new CPSignature(signature, signatureUTF8, cpClasses); + cp_Signature.add(cpS); + stringsToCpSignature.put(signature, cpS); + } + return cpS; + } + + public CPClass getCPClass(String className) { + if(className == null) { + return null; + } + className = className.replace('.', '/'); + CPClass cpClass = (CPClass) stringsToCpClass.get(className); + if (cpClass == null) { + CPUTF8 cpUtf8 = getCPUtf8(className); + cpClass = new CPClass(cpUtf8); + cp_Class.add(cpClass); + stringsToCpClass.put(className, cpClass); + } + if(cpClass.isInnerClass()) { + segment.getClassBands().currentClassReferencesInnerClass(cpClass); + } + return cpClass; + } + + public void addCPClass(String className) { + getCPClass(className); + } + + public CPNameAndType getCPNameAndType(String name, String signature) { + String descr = name + ":" + signature; + CPNameAndType nameAndType = (CPNameAndType) stringsToCpNameAndType + .get(descr); + if (nameAndType == null) { + nameAndType = new CPNameAndType(getCPUtf8(name), + getCPSignature(signature)); + stringsToCpNameAndType.put(descr, nameAndType); + cp_Descr.add(nameAndType); + } + return nameAndType; + } + + public CPMethodOrField getCPField(CPClass cpClass, String name, String desc) { + String key = cpClass.toString() + ":" + name + ":" + desc; + CPMethodOrField cpF = (CPMethodOrField) stringsToCpField + .get(key); + if (cpF == null) { + CPNameAndType nAndT = getCPNameAndType(name, desc); + cpF = new CPMethodOrField(cpClass, nAndT); + cp_Field.add(cpF); + stringsToCpField.put(key, cpF); + } + return cpF; + } + + public CPConstant getConstant(Object value) { + CPConstant constant = (CPConstant) objectsToCPConstant.get(value); + if (constant == null) { + if (value instanceof Integer) { + constant = new CPInt(((Integer) value).intValue()); + cp_Int.add(constant); + } else if (value instanceof Long) { + constant = new CPLong(((Long) value).longValue()); + cp_Long.add(constant); + } else if (value instanceof Float) { + constant = new CPFloat(((Float) value).floatValue()); + cp_Float.add(constant); + } else if (value instanceof Double) { + constant = new CPDouble(((Double) value).doubleValue()); + cp_Double.add(constant); + } else if (value instanceof String) { + constant = new CPString(getCPUtf8((String) value)); + cp_String.add(constant); + } else if (value instanceof Type) { + String className = ((Type) value).getClassName(); + if(className.endsWith("[]")) { + className = "[L" + className.substring(0, className.length() - 2); + while(className.endsWith("[]")) { + className = "[" + className.substring(0, className.length() - 2); + } + className += ";"; + } + constant = getCPClass(className); + } + objectsToCPConstant.put(value, constant); + } + return constant; + } + + public CPMethodOrField getCPMethod(CPClass cpClass, String name, String desc) { + String key = cpClass.toString() + ":" + name + ":" + desc; + CPMethodOrField cpM = (CPMethodOrField) stringsToCpMethod + .get(key); + if (cpM == null) { + CPNameAndType nAndT = getCPNameAndType(name, desc); + cpM = new CPMethodOrField(cpClass, nAndT); + cp_Method.add(cpM); + stringsToCpMethod.put(key, cpM); + } + return cpM; + } + + public CPMethodOrField getCPIMethod(CPClass cpClass, String name, + String desc) { + String key = cpClass.toString() + ":" + name + ":" + desc; + CPMethodOrField cpIM = (CPMethodOrField) stringsToCpIMethod + .get(key); + if (cpIM == null) { + CPNameAndType nAndT = getCPNameAndType(name, desc); + cpIM = new CPMethodOrField(cpClass, nAndT); + cp_Imethod.add(cpIM); + stringsToCpIMethod.put(key, cpIM); + } + return cpIM; + } + + public CPMethodOrField getCPField(String owner, String name, String desc) { + return getCPField(getCPClass(owner), name, desc); + } + + public CPMethodOrField getCPMethod(String owner, String name, String desc) { + return getCPMethod(getCPClass(owner), name, desc); + } + + public CPMethodOrField getCPIMethod(String owner, String name, String desc) { + return getCPIMethod(getCPClass(owner), name, desc); + } + + public boolean existsCpClass(String className) { + CPClass cpClass = (CPClass) stringsToCpClass.get(className); + return cpClass != null; + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/FileBands.java b/src/main/java/org/apache/harmony/pack200/FileBands.java new file mode 100644 index 0000000..38bfcef --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/FileBands.java @@ -0,0 +1,170 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TimeZone; + +import org.apache.harmony.pack200.Archive.PackingFile; +import org.apache.harmony.pack200.Archive.SegmentUnit; +import org.objectweb.asm.ClassReader; + +/** + * Bands containing information about files in the pack200 archive and the file + * contents for non-class-files. Corresponds to the file_bands set + * of bands described in the specification. + */ +public class FileBands extends BandSet { + + private final CPUTF8[] fileName; + private int[] file_name; + private final int[] file_modtime; + private final long[] file_size; + private final int[] file_options; + private final byte[][] file_bits; + + public FileBands(CpBands cpBands, SegmentHeader segmentHeader, + PackingOptions options, SegmentUnit segmentUnit, int effort) { + super(effort, segmentHeader); + List fileList = segmentUnit.getFileList(); + int size = fileList.size(); + fileName = new CPUTF8[size]; + file_modtime = new int[size]; + file_size = new long[size]; + file_options = new int[size]; + int totalSize = 0; + file_bits = new byte[size][]; + int archiveModtime = segmentHeader.getArchive_modtime(); + + Set classNames = new HashSet(); + for (Iterator iterator = segmentUnit.getClassList().iterator(); iterator + .hasNext();) { + ClassReader reader = (ClassReader) iterator.next(); + classNames.add(reader.getClassName()); + } + CPUTF8 emptyString = cpBands.getCPUtf8(""); + long modtime; + int latestModtime = Integer.MIN_VALUE; + boolean isLatest = !PackingOptions.KEEP.equals(options + .getModificationTime()); + for (int i = 0; i < size; i++) { + PackingFile packingFile = (PackingFile) fileList.get(i); + String name = packingFile.getName(); + if (name.endsWith(".class") && !options.isPassFile(name)) { + file_options[i] |= (1 << 1); + if (classNames.contains(name.substring(0, name.length() - 6))) { + fileName[i] = emptyString; + } else { + fileName[i] = cpBands.getCPUtf8(name); + } + } else { + fileName[i] = cpBands.getCPUtf8(name); + } + // set deflate_hint for file element + if (options.isKeepDeflateHint() && packingFile.isDefalteHint()) { + file_options[i] |= 0x1; + } + byte[] bytes = packingFile.getContents(); + file_size[i] = bytes.length; + totalSize += file_size[i]; + + // update modification time + modtime = (packingFile.getModtime() + TimeZone.getDefault().getRawOffset()) / 1000L; + file_modtime[i] = (int) (modtime - archiveModtime); + if (isLatest && latestModtime < file_modtime[i]) { + latestModtime = file_modtime[i]; + } + + file_bits[i] = packingFile.getContents(); + } + + if (isLatest) { + for (int index = 0; index < size; index++) { + file_modtime[index] = latestModtime; + } + } + } + + /** + * All input classes for the segment have now been read in, so this method + * is called so that this class can calculate/complete anything it could not + * do while classes were being read. + */ + public void finaliseBands() { + file_name = new int[fileName.length]; + for (int i = 0; i < file_name.length; i++) { + file_name[i] = fileName[i].getIndex(); + } + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + PackingUtils.log("Writing file bands..."); + byte[] encodedBand = encodeBandInt("file_name", file_name, + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from file_name[" + file_name.length + "]"); + + encodedBand = encodeFlags("file_size", file_size, Codec.UNSIGNED5, + Codec.UNSIGNED5, segmentHeader.have_file_size_hi()); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from file_size[" + file_size.length + "]"); + + if (segmentHeader.have_file_modtime()) { + encodedBand = encodeBandInt("file_modtime", file_modtime, + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from file_modtime[" + file_modtime.length + "]"); + } + if (segmentHeader.have_file_options()) { + encodedBand = encodeBandInt("file_options", file_options, + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from file_options[" + file_options.length + "]"); + } + + encodedBand = encodeBandInt("file_bits", flatten(file_bits), + Codec.BYTE1); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from file_bits[" + file_bits.length + "]"); + } + + private int[] flatten(byte[][] bytes) { + int total = 0; + for (int i = 0; i < bytes.length; i++) { + total += bytes[i].length; + } + int[] band = new int[total]; + int index = 0; + for (int i = 0; i < bytes.length; i++) { + for (int j = 0; j < bytes[i].length; j++) { + band[index++] = bytes[i][j] & 0xFF; + } + } + return band; + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/IcBands.java b/src/main/java/org/apache/harmony/pack200/IcBands.java new file mode 100644 index 0000000..6f1c375 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/IcBands.java @@ -0,0 +1,203 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +/** + * Inner class bands (corresponds to the ic_bands set of bands in + * the pack200 specification) + */ +public class IcBands extends BandSet { + + private final Set innerClasses = new TreeSet(); + private final CpBands cpBands; + private int bit16Count = 0; + + private final Map outerToInner = new HashMap(); + + public IcBands(SegmentHeader segmentHeader, CpBands cpBands, int effort) { + super(effort, segmentHeader); + this.cpBands = cpBands; + } + + /** + * All input classes for the segment have now been read in, so this method + * is called so that this class can calculate/complete anything it could not + * do while classes were being read. + */ + public void finaliseBands() { + segmentHeader.setIc_count(innerClasses.size()); + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + PackingUtils.log("Writing internal class bands..."); + int[] ic_this_class = new int[innerClasses.size()]; + int[] ic_flags = new int[innerClasses.size()]; + int[] ic_outer_class = new int[bit16Count]; + int[] ic_name = new int[bit16Count]; + + int index2 = 0; + List innerClassesList = new ArrayList(innerClasses); + for (int i = 0; i < ic_this_class.length; i++) { + IcTuple icTuple = (IcTuple) innerClassesList.get(i); + ic_this_class[i] = icTuple.C.getIndex(); + ic_flags[i] = icTuple.F; + if((icTuple.F & (1<<16)) != 0) { + ic_outer_class[index2] = icTuple.C2 == null ? 0 : icTuple.C2.getIndex() + 1; + ic_name[index2] = icTuple.N == null ? 0 : icTuple.N.getIndex() + 1; + index2++; + } + } + byte[] encodedBand = encodeBandInt("ic_this_class", ic_this_class, + Codec.UDELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from ic_this_class[" + ic_this_class.length + "]"); + + encodedBand = encodeBandInt("ic_flags", ic_flags, Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from ic_flags[" + ic_flags.length + "]"); + + encodedBand = encodeBandInt("ic_outer_class", ic_outer_class, + Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from ic_outer_class[" + ic_outer_class.length + "]"); + + encodedBand = encodeBandInt("ic_name", ic_name, Codec.DELTA5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from ic_name[" + ic_name.length + "]"); + } + + public void addInnerClass(String name, String outerName, String innerName, + int flags) { + if(outerName != null || innerName != null) { + if(namesArePredictable(name, outerName, innerName)) { + IcTuple innerClass = new IcTuple(cpBands.getCPClass(name), flags, null, null); + addToMap(outerName, innerClass); + innerClasses.add(innerClass); + } else { + flags |= (1<<16); + IcTuple icTuple = new IcTuple(cpBands.getCPClass(name), flags, cpBands.getCPClass(outerName), cpBands.getCPUtf8(innerName)); + boolean added = innerClasses.add(icTuple); + if(added) { + bit16Count++; + addToMap(outerName, icTuple); + } + } + } else { + IcTuple innerClass = new IcTuple(cpBands.getCPClass(name), flags, null, null); + addToMap(getOuter(name), innerClass); + innerClasses.add(innerClass); + } + } + + public List getInnerClassesForOuter(String outerClassName) { + return (List) outerToInner.get(outerClassName); + } + + private String getOuter(String name) { + return name.substring(0, name.lastIndexOf('$')); + } + + private void addToMap(String outerName, IcTuple icTuple) { + List tuples = (List) outerToInner.get(outerName); + if(tuples == null) { + tuples = new ArrayList(); + outerToInner.put(outerName, tuples); + tuples.add(icTuple); + } else { + for (Iterator iterator = tuples.iterator(); iterator.hasNext();) { + IcTuple icT = (IcTuple) iterator.next(); + if(icTuple.equals(icT)) { + return; + } + } + tuples.add(icTuple); + } + } + + private boolean namesArePredictable(String name, String outerName, + String innerName) { + // TODO: Could be multiple characters, not just $ + return name.equals(outerName + '$' + innerName) && innerName.indexOf('$') == -1; + } + + class IcTuple implements Comparable { + + protected CPClass C; // this class + protected int F; // flags + protected CPClass C2; // outer class + protected CPUTF8 N; // name + + public IcTuple(CPClass C, int F, CPClass C2, CPUTF8 N) { + this.C = C; + this.F = F; + this.C2 = C2; + this.N = N; + } + + public boolean equals(Object o) { + if(o instanceof IcTuple) { + IcTuple icT = (IcTuple)o; + return C.equals(icT.C) && F == icT.F && (C2 != null ? C2.equals(icT.C2) : icT.C2 == null) && (N != null ? N.equals(icT.N) : icT.N == null); + } + return false; + } + + public int hashCode() { + return (C.hashCode() * 37) + F; + } + + public String toString() { + return C.toString(); + } + + public int compareTo(Object arg0) { + return C.compareTo(((IcTuple)arg0).C); + } + + public boolean isAnonymous() { + String className = C.toString(); + String innerName = className.substring(className.lastIndexOf('$') + 1); + return Character.isDigit(innerName.charAt(0)); + } + + } + + public IcTuple getIcTuple(CPClass inner) { + for (Iterator iterator = innerClasses.iterator(); iterator.hasNext();) { + IcTuple icTuple = (IcTuple) iterator.next(); + if(icTuple.C.equals(inner)) { + return icTuple; + } + } + return null; + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/IntList.java b/src/main/java/org/apache/harmony/pack200/IntList.java new file mode 100644 index 0000000..e2ba351 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/IntList.java @@ -0,0 +1,253 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.util.Arrays; + +/** + * IntList is based on java.util.ArrayList, but is written + * specifically for ints in order to reduce boxing and unboxing to Integers, + * reduce the memory required and improve performance of pack200. + */ +public class IntList { + + private int[] array; + private int firstIndex; + private int lastIndex; + private int modCount; + + /** + * Constructs a new instance of IntList with capacity for ten elements. + */ + public IntList() { + this(10); + } + + /** + * Constructs a new instance of IntList with the specified capacity. + * + * @param capacity + * the initial capacity of this IntList + */ + public IntList(int capacity) { + if (capacity < 0) { + throw new IllegalArgumentException(); + } + firstIndex = lastIndex = 0; + array = new int[capacity]; + } + + /** + * Adds the specified object at the end of this IntList. + * + * @param object + * the object to add + * @return true + */ + public boolean add(int object) { + if (lastIndex == array.length) { + growAtEnd(1); + } + array[lastIndex++] = object; + modCount++; + return true; + } + + public void add(int location, int object) { + int size = lastIndex - firstIndex; + if (0 < location && location < size) { + if (firstIndex == 0 && lastIndex == array.length) { + growForInsert(location, 1); + } else if ((location < size / 2 && firstIndex > 0) + || lastIndex == array.length) { + System.arraycopy(array, firstIndex, array, --firstIndex, + location); + } else { + int index = location + firstIndex; + System.arraycopy(array, index, array, index + 1, size + - location); + lastIndex++; + } + array[location + firstIndex] = object; + } else if (location == 0) { + if (firstIndex == 0) { + growAtFront(1); + } + array[--firstIndex] = object; + } else if (location == size) { + if (lastIndex == array.length) { + growAtEnd(1); + } + array[lastIndex++] = object; + } else { + throw new IndexOutOfBoundsException(); + } + + modCount++; + } + + public void clear() { + if (firstIndex != lastIndex) { + Arrays.fill(array, firstIndex, lastIndex, -1); + firstIndex = lastIndex = 0; + modCount++; + } + } + + public int get(int location) { + if (0 <= location && location < (lastIndex - firstIndex)) { + return array[firstIndex + location]; + } + throw new IndexOutOfBoundsException("" + location); + } + + private void growAtEnd(int required) { + int size = lastIndex - firstIndex; + if (firstIndex >= required - (array.length - lastIndex)) { + int newLast = lastIndex - firstIndex; + if (size > 0) { + System.arraycopy(array, firstIndex, array, 0, size); + } + firstIndex = 0; + lastIndex = newLast; + } else { + int increment = size / 2; + if (required > increment) { + increment = required; + } + if (increment < 12) { + increment = 12; + } + int[] newArray = new int[size + increment]; + if (size > 0) { + System.arraycopy(array, firstIndex, newArray, 0, size); + firstIndex = 0; + lastIndex = size; + } + array = newArray; + } + } + + private void growAtFront(int required) { + int size = lastIndex - firstIndex; + if (array.length - lastIndex + firstIndex >= required) { + int newFirst = array.length - size; + if (size > 0) { + System.arraycopy(array, firstIndex, array, newFirst, size); + } + firstIndex = newFirst; + lastIndex = array.length; + } else { + int increment = size / 2; + if (required > increment) { + increment = required; + } + if (increment < 12) { + increment = 12; + } + int[] newArray = new int[size + increment]; + if (size > 0) { + System.arraycopy(array, firstIndex, newArray, newArray.length + - size, size); + } + firstIndex = newArray.length - size; + lastIndex = newArray.length; + array = newArray; + } + } + + private void growForInsert(int location, int required) { + int size = lastIndex - firstIndex; + int increment = size / 2; + if (required > increment) { + increment = required; + } + if (increment < 12) { + increment = 12; + } + int[] newArray = new int[size + increment]; + int newFirst = increment - required; + // Copy elements after location to the new array skipping inserted + // elements + System.arraycopy(array, location + firstIndex, newArray, newFirst + + location + required, size - location); + // Copy elements before location to the new array from firstIndex + System.arraycopy(array, firstIndex, newArray, newFirst, location); + firstIndex = newFirst; + lastIndex = size + increment; + + array = newArray; + } + + public void increment(int location) { + if (0 <= location && location < (lastIndex - firstIndex)) { + array[firstIndex + location]++; + } else { + throw new IndexOutOfBoundsException("" + location); + } + } + + public boolean isEmpty() { + return lastIndex == firstIndex; + } + + public int remove(int location) { + int result; + int size = lastIndex - firstIndex; + if (0 <= location && location < size) { + if (location == size - 1) { + result = array[--lastIndex]; + array[lastIndex] = 0; + } else if (location == 0) { + result = array[firstIndex]; + array[firstIndex++] = 0; + } else { + int elementIndex = firstIndex + location; + result = array[elementIndex]; + if (location < size / 2) { + System.arraycopy(array, firstIndex, array, firstIndex + 1, + location); + array[firstIndex++] = 0; + } else { + System.arraycopy(array, elementIndex + 1, array, + elementIndex, size - location - 1); + array[--lastIndex] = 0; + } + } + if (firstIndex == lastIndex) { + firstIndex = lastIndex = 0; + } + } else { + throw new IndexOutOfBoundsException(); + } + + modCount++; + return result; + } + + public int size() { + return lastIndex - firstIndex; + } + + public int[] toArray() { + int size = lastIndex - firstIndex; + int[] result = new int[size]; + System.arraycopy(array, firstIndex, result, 0, size); + return result; + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/MetadataBandGroup.java b/src/main/java/org/apache/harmony/pack200/MetadataBandGroup.java new file mode 100644 index 0000000..9704e2b --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/MetadataBandGroup.java @@ -0,0 +1,375 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * A group of metadata (annotation) bands, such as class_RVA_bands, + * method_AD_bands etc. + */ +public class MetadataBandGroup extends BandSet { + + public static final int CONTEXT_CLASS = 0; + public static final int CONTEXT_FIELD = 1; + public static final int CONTEXT_METHOD = 2; + + private final String type; + private int numBackwardsCalls = 0; + + public List param_NB = new ArrayList(); // TODO: Lazy instantiation? + public IntList anno_N = new IntList(); + public List type_RS = new ArrayList(); + public IntList pair_N = new IntList(); + public List name_RU = new ArrayList(); + public List T = new ArrayList(); + public List caseI_KI = new ArrayList(); + public List caseD_KD = new ArrayList(); + public List caseF_KF = new ArrayList(); + public List caseJ_KJ = new ArrayList(); + public List casec_RS = new ArrayList(); + public List caseet_RS = new ArrayList(); + public List caseec_RU = new ArrayList(); + public List cases_RU = new ArrayList(); + public IntList casearray_N = new IntList(); + public List nesttype_RS = new ArrayList(); + public IntList nestpair_N = new IntList(); + public List nestname_RU = new ArrayList(); + + private final CpBands cpBands; + private final int context; + + /** + * Constructs a new MetadataBandGroup + * + * @param type + * must be either AD, RVA, RIA, RVPA or RIPA. + * @param context + * CONTEXT_CLASS, CONTEXT_METHOD or + * CONTEXT_FIELD + * @param cpBands + * constant pool bands + * @param segmentHeader + * segment header + * @param effort + * packing effort + */ + public MetadataBandGroup(String type, int context, CpBands cpBands, SegmentHeader segmentHeader, int effort) { + super(effort, segmentHeader); + this.type = type; + this.cpBands = cpBands; + this.context = context; + } + + /* (non-Javadoc) + * @see org.apache.harmony.pack200.BandSet#pack(java.io.OutputStream) + */ + public void pack(OutputStream out) throws IOException, Pack200Exception { + PackingUtils.log("Writing metadata band group..."); + if(hasContent()) { + String contextStr; + if(context == CONTEXT_CLASS) { + contextStr = "Class"; + } else if (context == CONTEXT_FIELD) { + contextStr = "Field"; + } else { + contextStr = "Method"; + } + byte[] encodedBand = null; + if(!type.equals("AD")) { + encodedBand = encodeBandInt( + contextStr + "_" + type + " anno_N", anno_N.toArray(), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from " + contextStr + "_" + type + " anno_N[" + + anno_N.size() + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + + " type_RS", cpEntryListToArray(type_RS), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from " + contextStr + "_" + type + + " type_RS[" + type_RS.size() + "]"); + + encodedBand = encodeBandInt( + contextStr + "_" + type + " pair_N", pair_N.toArray(), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from " + contextStr + "_" + type + " pair_N[" + + pair_N.size() + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + + " name_RU", cpEntryListToArray(name_RU), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + + " bytes from " + contextStr + "_" + type + + " name_RU[" + name_RU.size() + "]"); + } + encodedBand = encodeBandInt(contextStr + "_" + type + " T", + tagListToArray(T), Codec.BYTE1); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " T[" + T.size() + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + " caseI_KI", + cpEntryListToArray(caseI_KI), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " caseI_KI[" + caseI_KI.size() + + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + " caseD_KD", + cpEntryListToArray(caseD_KD), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " caseD_KD[" + caseD_KD.size() + + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + " caseF_KF", + cpEntryListToArray(caseF_KF), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " caseF_KF[" + caseF_KF.size() + + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + " caseJ_KJ", + cpEntryListToArray(caseJ_KJ), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " caseJ_KJ[" + caseJ_KJ.size() + + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + " casec_RS", + cpEntryListToArray(casec_RS), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " casec_RS[" + casec_RS.size() + + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + " caseet_RS", + cpEntryListToArray(caseet_RS), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " caseet_RS[" + + caseet_RS.size() + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + " caseec_RU", + cpEntryListToArray(caseec_RU), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " caseec_RU[" + + caseec_RU.size() + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + " cases_RU", + cpEntryListToArray(cases_RU), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " cases_RU[" + cases_RU.size() + + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + + " casearray_N", casearray_N.toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " casearray_N[" + + casearray_N.size() + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + + " nesttype_RS", cpEntryListToArray(nesttype_RS), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " nesttype_RS[" + + nesttype_RS.size() + "]"); + + encodedBand = encodeBandInt( + contextStr + "_" + type + " nestpair_N", nestpair_N + .toArray(), Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " nestpair_N[" + + nestpair_N.size() + "]"); + + encodedBand = encodeBandInt(contextStr + "_" + type + + " nestname_RU", cpEntryListToArray(nestname_RU), + Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + contextStr + "_" + type + " nestname_RU[" + + nestname_RU.size() + "]"); + } + } + + private int[] tagListToArray(List t2) { + int[] ints = new int[t2.size()]; + for (int i = 0; i < ints.length; i++) { + ints[i] = ((String)t2.get(i)).charAt(0); + } + return ints; + } + + /** + * Add an annotation to this set of bands + * + * @param desc + * @param nameRU + * @param t + * @param values + * @param caseArrayN + * @param nestTypeRS + * @param nestNameRU + * @param nestPairN + */ + public void addAnnotation(String desc, List nameRU, List t, List values, List caseArrayN, List nestTypeRS, List nestNameRU, List nestPairN) { + type_RS.add(cpBands.getCPSignature(desc)); + pair_N.add(t.size()); + + for (Iterator iterator = nameRU.iterator(); iterator.hasNext();) { + String name = (String) iterator.next(); + name_RU.add(cpBands.getCPUtf8(name)); + } + + Iterator valuesIterator = values.iterator(); + for (Iterator iterator = t.iterator(); iterator.hasNext();) { + String tag = (String) iterator.next(); + T.add(tag); + if (tag.equals("B") || tag.equals("C") || tag.equals("I") + || tag.equals("S") || tag.equals("Z")) { + Integer value = (Integer)valuesIterator.next(); + caseI_KI.add(cpBands.getConstant(value)); + } else if (tag.equals("D")) { + Double value = (Double)valuesIterator.next(); + caseD_KD.add(cpBands.getConstant(value)); + } else if (tag.equals("F")) { + Float value = (Float)valuesIterator.next(); + caseF_KF.add(cpBands.getConstant(value)); + } else if (tag.equals("J")) { + Long value = (Long)valuesIterator.next(); + caseJ_KJ.add(cpBands.getConstant(value)); + } else if (tag.equals("C")) { + String value = (String)valuesIterator.next(); + casec_RS.add(cpBands.getCPSignature(value)); + } else if (tag.equals("e")) { + String value = (String)valuesIterator.next(); + String value2 = (String)valuesIterator.next(); + caseet_RS.add(cpBands.getCPSignature(value)); + caseec_RU.add(cpBands.getCPUtf8(value2)); + } else if (tag.equals("s")) { + String value = (String)valuesIterator.next(); + cases_RU.add(cpBands.getCPUtf8(value)); + } + // do nothing here for [ or @ (handled below) + } + for (Iterator iterator = caseArrayN.iterator(); iterator.hasNext();) { + int arraySize = ((Integer)iterator.next()).intValue(); + casearray_N.add(arraySize); + numBackwardsCalls += arraySize; + } + for (Iterator iterator = nesttype_RS.iterator(); iterator.hasNext();) { + String type = (String) iterator.next(); + nesttype_RS.add(cpBands.getCPSignature(type)); + } + for (Iterator iterator = nestname_RU.iterator(); iterator.hasNext();) { + String name = (String) iterator.next(); + nestname_RU.add(cpBands.getCPUtf8(name)); + } + for (Iterator iterator = nestPairN.iterator(); iterator.hasNext();) { + Integer numPairs = (Integer) iterator.next(); + nestPairN.add(numPairs); + numBackwardsCalls += numPairs.intValue(); + } + } + + /** + * Returns true if any annotations have been added to this set of bands + */ + public boolean hasContent() { + return type_RS.size() > 0; + } + + public int numBackwardsCalls() { + return numBackwardsCalls; + } + + public void incrementAnnoN() { + anno_N.increment(anno_N.size() - 1); + } + + public void newEntryInAnnoN() { + anno_N.add(1); + } + + /** + * Remove the latest annotation that was added to this group + */ + public void removeLatest() { + int latest = anno_N.remove(anno_N.size() -1); + for (int i = 0; i < latest; i++) { + type_RS.remove(type_RS.size() - 1); + int pairs = pair_N.remove(pair_N.size() - 1); + for (int j = 0; j < pairs; j++) { + removeOnePair(); + } + } + } + + /* + * Convenience method for removeLatest + */ + private void removeOnePair() { + String tag = (String) T.remove(T.size() - 1); + if (tag.equals("B") || tag.equals("C") || tag.equals("I") + || tag.equals("S") || tag.equals("Z")) { + caseI_KI.remove(caseI_KI.size() - 1); + } else if (tag.equals("D")) { + caseD_KD.remove(caseD_KD.size() - 1); + } else if (tag.equals("F")) { + caseF_KF.remove(caseF_KF.size() - 1); + } else if (tag.equals("J")) { + caseJ_KJ.remove(caseJ_KJ.size() - 1); + } else if (tag.equals("C")) { + casec_RS.remove(casec_RS.size() - 1); + } else if (tag.equals("e")) { + caseet_RS.remove(caseet_RS.size() - 1); + caseec_RU.remove(caseet_RS.size() - 1); + } else if (tag.equals("s")) { + cases_RU.remove(cases_RU.size() - 1); + } else if (tag.equals("[")) { + int arraySize = casearray_N.remove(casearray_N.size() - 1); + numBackwardsCalls -= arraySize; + for (int k = 0; k < arraySize; k++) { + removeOnePair(); + } + } else if (tag.equals("@")) { + nesttype_RS.remove(nesttype_RS.size() - 1); + int numPairs = nestpair_N.remove(nestpair_N.size() - 1); + numBackwardsCalls -= numPairs; + for (int i = 0; i < numPairs; i++) { + removeOnePair(); + } + } + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/NewAttribute.java b/src/main/java/org/apache/harmony/pack200/NewAttribute.java new file mode 100644 index 0000000..3cab224 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/NewAttribute.java @@ -0,0 +1,145 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import org.objectweb.asm.Attribute; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.Label; + +/** + * NewAttribute extends Attribute and manages unknown attributes + * encountered by ASM that have had a layout definition given to pack200 (e.g. + * via one of the -C, -M, -F or -D command line options) + */ +public class NewAttribute extends Attribute { + + private boolean contextClass = false; + private boolean contextMethod = false; + private boolean contextField = false; + private boolean contextCode = false; + + private final String layout; + private byte[] contents; + private int codeOff; + private Label[] labels; + private ClassReader classReader; + private char[] buf; + + public NewAttribute(String type, String layout, int context) { + super(type); + this.layout = layout; + addContext(context); + } + + public NewAttribute(ClassReader classReader, String type, String layout, byte[] contents, char[] buf, + int codeOff, Label[] labels) { + super(type); + this.classReader = classReader; + this.contents = contents; + this.layout = layout; + this.codeOff = codeOff; + this.labels = labels; + this.buf = buf; + } + + public void addContext(int context) { + switch(context) { + case AttributeDefinitionBands.CONTEXT_CLASS: + contextClass = true; + break; + case AttributeDefinitionBands.CONTEXT_METHOD: + contextMethod = true; + break; + case AttributeDefinitionBands.CONTEXT_FIELD: + contextField = true; + break; + case AttributeDefinitionBands.CONTEXT_CODE: + contextCode = true; + break; + } + } + + public boolean isContextClass() { + return contextClass; + } + + public boolean isContextMethod() { + return contextMethod; + } + + public boolean isContextField() { + return contextField; + } + + public boolean isContextCode() { + return contextCode; + } + + public String getLayout() { + return layout; + } + + public boolean isUnknown() { + return false; + } + + public boolean isCodeAttribute() { + return codeOff != -1; + } + + protected Attribute read(ClassReader cr, int off, int len, char[] buf, + int codeOff, Label[] labels) { + byte[] attributeContents = new byte[len]; + System.arraycopy(cr.b, off, attributeContents, 0, len); + return new NewAttribute(cr, type, layout, attributeContents, buf, codeOff, + labels); + } + + public boolean isUnknown(int context) { + switch(context) { + case AttributeDefinitionBands.CONTEXT_CLASS: + return contextClass; + case AttributeDefinitionBands.CONTEXT_METHOD: + return contextMethod; + case AttributeDefinitionBands.CONTEXT_FIELD: + return contextField; + case AttributeDefinitionBands.CONTEXT_CODE: + return contextCode; + } + return false; + } + + public String readUTF8(int index) { + return classReader.readUTF8(index, buf); + } + + public String readClass(int index) { + return classReader.readClass(index, buf); + } + + public Object readConst(int index) { + return classReader.readConst(index, buf); + } + + public byte[] getBytes() { + return contents; + } + + public Label getLabel(int index) { + return labels[index]; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/NewAttributeBands.java b/src/main/java/org/apache/harmony/pack200/NewAttributeBands.java new file mode 100644 index 0000000..fe006ef --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/NewAttributeBands.java @@ -0,0 +1,968 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.harmony.pack200.AttributeDefinitionBands.AttributeDefinition; +import org.objectweb.asm.Label; + +/** + * Set of bands relating to a non-predefined attribute that has had a layout + * definition given to pack200 (e.g. via one of the -C, -M, -F or -D command + * line options) + */ +public class NewAttributeBands extends BandSet { + + protected List attributeLayoutElements; + private int[] backwardsCallCounts; + private final CpBands cpBands; + private final AttributeDefinition def; + private boolean usedAtLeastOnce; + + // used when parsing + private Integral lastPIntegral; + + public NewAttributeBands(int effort, CpBands cpBands, SegmentHeader header, AttributeDefinition def) throws IOException { + super(effort, header); + this.def = def; + this.cpBands = cpBands; + parseLayout(); + } + + public void addAttribute(NewAttribute attribute) { + usedAtLeastOnce = true; + InputStream stream = new ByteArrayInputStream(attribute.getBytes()); + for (Iterator iterator = attributeLayoutElements.iterator(); iterator.hasNext();) { + AttributeLayoutElement layoutElement = (AttributeLayoutElement) iterator.next(); + layoutElement.addAttributeToBand(attribute, stream); + } + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + for (Iterator iterator = attributeLayoutElements.iterator(); iterator.hasNext();) { + AttributeLayoutElement layoutElement = (AttributeLayoutElement) iterator.next(); + layoutElement.pack(out); + } + } + + public String getAttributeName() { + return def.name.getUnderlyingString(); + } + + public int getFlagIndex() { + return def.index; + } + + public int[] numBackwardsCalls() { + return backwardsCallCounts; + } + + public boolean isUsedAtLeastOnce() { + return usedAtLeastOnce; + } + + private void parseLayout() throws IOException { + String layout = def.layout.getUnderlyingString(); + if (attributeLayoutElements == null) { + attributeLayoutElements = new ArrayList(); + StringReader stream = new StringReader(layout); + AttributeLayoutElement e; + while ((e = readNextAttributeElement(stream)) != null) { + attributeLayoutElements.add(e); + } + resolveCalls(); + } + } + + /** + * Resolve calls in the attribute layout and returns the number of backwards + * callables + * + * @param tokens - + * the attribute layout as a List of AttributeElements + */ + private void resolveCalls() { + for (int i = 0; i < attributeLayoutElements.size(); i++) { + AttributeLayoutElement element = (AttributeLayoutElement) attributeLayoutElements + .get(i); + if (element instanceof Callable) { + Callable callable = (Callable) element; + List body = callable.body; // Look for calls in the body + for (int iIndex = 0; iIndex < body.size(); iIndex++) { + LayoutElement layoutElement = (LayoutElement) body + .get(iIndex); + // Set the callable for each call + resolveCallsForElement(i, callable, layoutElement); + } + } + } + int backwardsCallableIndex = 0; + for (int i = 0; i < attributeLayoutElements.size(); i++) { + AttributeLayoutElement element = (AttributeLayoutElement) attributeLayoutElements + .get(i); + if (element instanceof Callable) { + Callable callable = (Callable) element; + if(callable.isBackwardsCallable) { + callable.setBackwardsCallableIndex(backwardsCallableIndex); + backwardsCallableIndex++; + } + } + } + backwardsCallCounts = new int[backwardsCallableIndex]; + } + + private void resolveCallsForElement(int i, + Callable currentCallable, LayoutElement layoutElement) { + if (layoutElement instanceof Call) { + Call call = (Call) layoutElement; + int index = call.callableIndex; + if (index == 0) { // Calls the parent callable + call.setCallable(currentCallable); + } else if (index > 0) { // Forwards call + for (int k = i + 1; k < attributeLayoutElements.size(); k++) { + AttributeLayoutElement el = (AttributeLayoutElement) attributeLayoutElements + .get(k); + if (el instanceof Callable) { + index--; + if (index == 0) { + call.setCallable((Callable) el); + break; + } + } + } + } else { // Backwards call + for (int k = i; k >= 0; k--) { + AttributeLayoutElement el = (AttributeLayoutElement) attributeLayoutElements + .get(k); + if (el instanceof Callable) { + index++; + if (index == 0) { + call.setCallable((Callable) el); + break; + } + } + } + } + } else if (layoutElement instanceof Replication) { + List children = ((Replication)layoutElement).layoutElements; + for (Iterator iterator = children.iterator(); iterator.hasNext();) { + LayoutElement object = (LayoutElement) iterator.next(); + resolveCallsForElement(i, currentCallable, object); + } + } + } + + private AttributeLayoutElement readNextAttributeElement(StringReader stream) + throws IOException { + stream.mark(1); + int nextChar = stream.read(); + if (nextChar == -1) { + return null; + } + if (nextChar == '[') { + List body = readBody(getStreamUpToMatchingBracket(stream)); + return new Callable(body); + } else { + stream.reset(); + return readNextLayoutElement(stream); + } + } + + private LayoutElement readNextLayoutElement(StringReader stream) + throws IOException { + int nextChar = stream.read(); + if (nextChar == -1) { + return null; + } + + switch (nextChar) { + // Integrals + case 'B': + case 'H': + case 'I': + case 'V': + return new Integral(new String(new char[] { (char)nextChar })); + case 'S': + case 'F': + return new Integral(new String(new char[] { (char)nextChar, + (char) stream.read() })); + case 'P': + stream.mark(1); + if (stream.read() != 'O') { + stream.reset(); + lastPIntegral = new Integral("P" + (char) stream.read()); + return lastPIntegral; + } else { + lastPIntegral = new Integral("PO" + (char) stream.read(), lastPIntegral); + return lastPIntegral; + } + case 'O': + stream.mark(1); + if (stream.read() != 'S') { + stream.reset(); + return new Integral("O" + (char) stream.read(), lastPIntegral); + } else { + return new Integral("OS" + (char) stream.read(), lastPIntegral); + } + + // Replication + case 'N': + char uint_type = (char) stream.read(); + stream.read(); // '[' + String str = readUpToMatchingBracket(stream); + return new Replication("" + uint_type, str); + + // Union + case 'T': + String int_type = "" + (char) stream.read(); + if (int_type.equals("S")) { + int_type += (char) stream.read(); + } + List unionCases = new ArrayList(); + UnionCase c; + while ((c = readNextUnionCase(stream)) != null) { + unionCases.add(c); + } + stream.read(); // '(' + stream.read(); // ')' + stream.read(); // '[' + List body = null; + stream.mark(1); + char next = (char) stream.read(); + if (next != ']') { + stream.reset(); + body = readBody(getStreamUpToMatchingBracket(stream)); + } + return new Union(int_type, unionCases, body); + + // Call + case '(': + int number = readNumber(stream).intValue(); + stream.read(); // ')' + return new Call(number); + // Reference + case 'K': + case 'R': + String string = "" + (char)nextChar + (char) stream.read(); + char nxt = (char) stream.read(); + string += nxt; + if (nxt == 'N') { + string += (char) stream.read(); + } + return new Reference(string); + } + return null; + } + + /** + * Read a UnionCase from the stream + * + * @param stream + * @return + * @throws IOException + */ + private UnionCase readNextUnionCase(StringReader stream) throws IOException { + stream.mark(2); + stream.read(); // '(' + char next = (char) stream.read(); + if (next == ')') { + stream.reset(); + return null; + } else { + stream.reset(); + stream.read(); // '(' + } + List tags = new ArrayList(); + Integer nextTag; + do { + nextTag = readNumber(stream); + if(nextTag != null) { + tags.add(nextTag); + stream.read(); // ',' or ')' + } + } while (nextTag != null); + stream.read(); // '[' + stream.mark(1); + next = (char) stream.read(); + if (next == ']') { + return new UnionCase(tags); + } else { + stream.reset(); + return new UnionCase(tags, + readBody(getStreamUpToMatchingBracket(stream))); + } + } + + /** + * An AttributeLayoutElement is a part of an attribute layout and has one or + * more bands associated with it, which transmit the AttributeElement data + * for successive Attributes of this type. + */ + public interface AttributeLayoutElement { + + public void addAttributeToBand(NewAttribute attribute, InputStream stream); + + public void pack(OutputStream out) throws IOException, Pack200Exception; + + public void renumberBci(IntList bciRenumbering, Map labelsToOffsets); + + } + + public abstract class LayoutElement implements AttributeLayoutElement { + + protected int getLength(char uint_type) { + int length = 0; + switch (uint_type) { + case 'B': + length = 1; + break; + case 'H': + length = 2; + break; + case 'I': + length = 4; + break; + case 'V': + length = 0; + break; + } + return length; + } + } + + public class Integral extends LayoutElement { + + private final String tag; + + private final List band = new ArrayList(); + private final BHSDCodec defaultCodec; + + // used for bytecode offsets (OH and POH) + private Integral previousIntegral; + private int previousPValue; + + public Integral(String tag) { + this.tag = tag; + this.defaultCodec = getCodec(tag); + } + + public Integral(String tag, Integral previousIntegral) { + this.tag = tag; + this.defaultCodec = getCodec(tag); + this.previousIntegral = previousIntegral; + } + + public String getTag() { + return tag; + } + + public void addAttributeToBand(NewAttribute attribute, + InputStream stream) { + Object val = null; + int value = 0; + if (tag.equals("B") || tag.equals("FB")) { + value = readInteger(1, stream) & 0xFF; // unsigned byte + } else if (tag.equals("SB")) { + value = readInteger(1, stream); + } else if (tag.equals("H") || tag.equals("FH")) { + value = readInteger(2, stream) & 0xFFFF; // unsigned short + } else if (tag.equals("SH")) { + value = readInteger(2, stream); + } else if (tag.equals("I") || tag.equals("FI")) { + value = readInteger(4, stream); + } else if (tag.equals("SI")) { + value = readInteger(4, stream); + } else if (tag.equals("V") || tag.equals("FV") || tag.equals("SV")) { + // Not currently supported + } else if (tag.startsWith("PO") || tag.startsWith("OS")) { + char uint_type = tag.substring(2).toCharArray()[0]; + int length = getLength(uint_type); + value = readInteger(length, stream); + value += previousIntegral.previousPValue; + val = attribute.getLabel(value); + previousPValue = value; + } else if (tag.startsWith("P")) { + char uint_type = tag.substring(1).toCharArray()[0]; + int length = getLength(uint_type); + value = readInteger(length, stream); + val = attribute.getLabel(value); + previousPValue = value; + } else if (tag.startsWith("O")) { + char uint_type = tag.substring(1).toCharArray()[0]; + int length = getLength(uint_type); + value = readInteger(length, stream); + value += previousIntegral.previousPValue; + val = attribute.getLabel(value); + previousPValue = value; + } + if(val == null) { + val = new Integer(value); + } + band.add(val); + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + PackingUtils.log("Writing new attribute bands..."); + byte[] encodedBand = encodeBandInt(tag, integerListToArray(band), + defaultCodec); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + tag + "[" + band.size() + "]"); + } + + public int latestValue() { + return ((Integer)band.get(band.size() - 1)).intValue(); + } + + public void renumberBci(IntList bciRenumbering, Map labelsToOffsets) { + if(tag.startsWith("O") || tag.startsWith("PO")) { + renumberOffsetBci(previousIntegral.band, bciRenumbering, labelsToOffsets); + } else if (tag.startsWith("P")) { + for (int i = band.size() - 1; i >= 0; i--) { + Object label = band.get(i); + if (label instanceof Integer) { + break; + } else if (label instanceof Label) { + band.remove(i); + Integer bytecodeIndex = (Integer) labelsToOffsets + .get(label); + band.add(i, new Integer(bciRenumbering.get(bytecodeIndex + .intValue()))); + } + } + } + } + + private void renumberOffsetBci(List relative, + IntList bciRenumbering, Map labelsToOffsets) { + for (int i = band.size() - 1; i >= 0; i--) { + Object label = band.get(i); + if (label instanceof Integer) { + break; + } else if (label instanceof Label) { + band.remove(i); + Integer bytecodeIndex = (Integer) labelsToOffsets.get(label); + Integer renumberedOffset = new Integer(bciRenumbering + .get(bytecodeIndex.intValue()) + - ((Integer) relative.get(i)).intValue()); + band.add(i, renumberedOffset); + } + } + } + + } + + /** + * A replication is an array of layout elements, with an associated count + */ + public class Replication extends LayoutElement { + + private final Integral countElement; + + private final List layoutElements = new ArrayList(); + + public Integral getCountElement() { + return countElement; + } + + public List getLayoutElements() { + return layoutElements; + } + + public Replication(String tag, String contents) throws IOException { + this.countElement = new Integral(tag); + StringReader stream = new StringReader(contents); + LayoutElement e; + while ((e = readNextLayoutElement(stream)) != null) { + layoutElements.add(e); + } + } + + public void addAttributeToBand(NewAttribute attribute, + InputStream stream) { + countElement.addAttributeToBand(attribute, stream); + int count = countElement.latestValue(); + for (int i = 0; i < count; i++) { + for (Iterator iterator = layoutElements.iterator(); iterator.hasNext();) { + AttributeLayoutElement layoutElement = (AttributeLayoutElement) iterator.next(); + layoutElement.addAttributeToBand(attribute, stream); + } + } + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + countElement.pack(out); + for (Iterator iterator = layoutElements.iterator(); iterator.hasNext();) { + AttributeLayoutElement layoutElement = (AttributeLayoutElement) iterator.next(); + layoutElement.pack(out); + } + } + + public void renumberBci(IntList bciRenumbering, Map labelsToOffsets) { + for (Iterator iterator = layoutElements.iterator(); iterator.hasNext();) { + AttributeLayoutElement layoutElement = (AttributeLayoutElement) iterator.next(); + layoutElement.renumberBci(bciRenumbering, labelsToOffsets); + } + } + } + + /** + * A Union is a type of layout element where the tag value acts as a + * selector for one of the union cases + */ + public class Union extends LayoutElement { + + private final Integral unionTag; + private final List unionCases; + private final List defaultCaseBody; + + public Union(String tag, List unionCases, List body) { + this.unionTag = new Integral(tag); + this.unionCases = unionCases; + this.defaultCaseBody = body; + } + + public void addAttributeToBand(NewAttribute attribute, + InputStream stream) { + unionTag.addAttributeToBand(attribute, stream); + long tag = unionTag.latestValue(); + boolean defaultCase = true; + for (int i = 0; i < unionCases.size(); i++) { + UnionCase element = (UnionCase) unionCases.get(i); + if (element.hasTag(tag)) { + defaultCase = false; + element.addAttributeToBand(attribute, stream); + } + } + if (defaultCase) { + for (int i = 0; i < defaultCaseBody.size(); i++) { + LayoutElement element = (LayoutElement) defaultCaseBody + .get(i); + element.addAttributeToBand(attribute, stream); + } + } + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + unionTag.pack(out); + for (Iterator iterator = unionCases.iterator(); iterator.hasNext();) { + UnionCase unionCase = (UnionCase) iterator.next(); + unionCase.pack(out); + } + for (Iterator iterator = defaultCaseBody.iterator(); iterator + .hasNext();) { + AttributeLayoutElement layoutElement = (AttributeLayoutElement) iterator + .next(); + layoutElement.pack(out); + } + } + + public void renumberBci(IntList bciRenumbering, Map labelsToOffsets) { + for (Iterator iterator = unionCases.iterator(); iterator.hasNext();) { + UnionCase unionCase = (UnionCase) iterator.next(); + unionCase.renumberBci(bciRenumbering, labelsToOffsets); + } + for (Iterator iterator = defaultCaseBody.iterator(); iterator + .hasNext();) { + AttributeLayoutElement layoutElement = (AttributeLayoutElement) iterator + .next(); + layoutElement.renumberBci(bciRenumbering, labelsToOffsets); + } + } + + public Integral getUnionTag() { + return unionTag; + } + + public List getUnionCases() { + return unionCases; + } + + public List getDefaultCaseBody() { + return defaultCaseBody; + } + } + + public class Call extends LayoutElement { + + private final int callableIndex; + private Callable callable; + + public Call(int callableIndex) { + this.callableIndex = callableIndex; + } + + public void setCallable(Callable callable) { + this.callable = callable; + if (callableIndex < 1) { + callable.setBackwardsCallable(); + } + } + + public void addAttributeToBand(NewAttribute attribute, + InputStream stream) { + callable.addAttributeToBand(attribute, stream); + if(callableIndex < 1) { + callable.addBackwardsCall(); + } + } + + public void pack(OutputStream out) { + // do nothing here as pack will be called on the callable at another time + } + + public void renumberBci(IntList bciRenumbering, Map labelsToOffsets) { + // do nothing here as renumberBci will be called on the callable at another time + } + + public int getCallableIndex() { + return callableIndex; + } + + public Callable getCallable() { + return callable; + } + } + + /** + * Constant Pool Reference + */ + public class Reference extends LayoutElement { + + private final String tag; + + private List band; + + private final int length; + + private boolean nullsAllowed = false; + + public Reference(String tag) { + this.tag = tag; + length = getLength(tag.charAt(tag.length() - 1)); + nullsAllowed = tag.indexOf('N') != -1; + } + + public void addAttributeToBand(NewAttribute attribute, + InputStream stream) { + int index = readInteger(4, stream); + if(tag.startsWith("RC")) { // Class + band.add(cpBands.getCPClass(attribute.readClass(index))); + } else if (tag.startsWith("RU")) { // UTF8 String + band.add(cpBands.getCPUtf8(attribute.readUTF8(index))); + } else if (tag.startsWith("RS")) { // Signature + band.add(cpBands.getCPSignature(attribute.readUTF8(index))); + } else { // Constant + band.add(cpBands.getConstant(attribute.readConst(index))); + } + // TODO method and field references + } + + public String getTag() { + return tag; + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + int[] ints; + if(nullsAllowed) { + ints = cpEntryOrNullListToArray(band); + } else { + ints = cpEntryListToArray(band); + } + byte[] encodedBand = encodeBandInt(tag, ints, Codec.UNSIGNED5); + out.write(encodedBand); + PackingUtils.log("Wrote " + encodedBand.length + " bytes from " + + tag + "[" + ints.length + "]"); + } + + public void renumberBci(IntList bciRenumbering, Map labelsToOffsets) { + // nothing to do here + } + + } + + public class Callable implements AttributeLayoutElement { + + private final List body; + + private boolean isBackwardsCallable; + + private int backwardsCallableIndex; + + public Callable(List body) throws IOException { + this.body = body; + } + + public void setBackwardsCallableIndex(int backwardsCallableIndex) { + this.backwardsCallableIndex = backwardsCallableIndex; + } + + public void addBackwardsCall() { + backwardsCallCounts[backwardsCallableIndex]++; + } + + public boolean isBackwardsCallable() { + return isBackwardsCallable; + } + + /** + * Tells this Callable that it is a backwards callable + */ + public void setBackwardsCallable() { + this.isBackwardsCallable = true; + } + + public void addAttributeToBand(NewAttribute attribute, + InputStream stream) { + for (Iterator iterator = body.iterator(); iterator.hasNext();) { + AttributeLayoutElement layoutElement = (AttributeLayoutElement) iterator.next(); + layoutElement.addAttributeToBand(attribute, stream); + } + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + for (Iterator iterator = body.iterator(); iterator.hasNext();) { + AttributeLayoutElement layoutElement = (AttributeLayoutElement) iterator.next(); + layoutElement.pack(out); + } + } + + public void renumberBci(IntList bciRenumbering, Map labelsToOffsets) { + for (Iterator iterator = body.iterator(); iterator.hasNext();) { + AttributeLayoutElement layoutElement = (AttributeLayoutElement) iterator.next(); + layoutElement.renumberBci(bciRenumbering, labelsToOffsets); + } + } + + public List getBody() { + return body; + } + } + + /** + * A Union case + */ + public class UnionCase extends LayoutElement { + + private final List body; + + private final List tags; + + public UnionCase(List tags) { + this.tags = tags; + this.body = Collections.EMPTY_LIST; + } + + public boolean hasTag(long l) { + return tags.contains(new Integer((int) l)); + } + + public UnionCase(List tags, List body) throws IOException { + this.tags = tags; + this.body = body; + } + + public void addAttributeToBand(NewAttribute attribute, + InputStream stream) { + for (int i = 0; i < body.size(); i++) { + LayoutElement element = (LayoutElement) body.get(i); + element.addAttributeToBand(attribute, stream); + } + } + + public void pack(OutputStream out) throws IOException, Pack200Exception { + for (int i = 0; i < body.size(); i++) { + LayoutElement element = (LayoutElement) body.get(i); + element.pack(out); + } + } + + public void renumberBci(IntList bciRenumbering, Map labelsToOffsets) { + for (int i = 0; i < body.size(); i++) { + LayoutElement element = (LayoutElement) body.get(i); + element.renumberBci(bciRenumbering, labelsToOffsets); + } + } + + public List getBody() { + return body; + } + } + + /** + * Utility method to get the contents of the given stream, up to the next + * ']', (ignoring pairs of brackets '[' and ']') + * + * @param stream + * @return + * @throws IOException + */ + private StringReader getStreamUpToMatchingBracket(StringReader stream) + throws IOException { + StringBuffer sb = new StringBuffer(); + int foundBracket = -1; + while (foundBracket != 0) { + char c = (char) stream.read(); + if (c == ']') { + foundBracket++; + } + if (c == '[') { + foundBracket--; + } + if (!(foundBracket == 0)) { + sb.append(c); + } + } + return new StringReader(sb.toString()); + } + + private int readInteger(int i, InputStream stream) { + int result = 0; + for (int j = 0; j < i; j++) { + try { + result = result << 8 | stream.read(); + } catch (IOException e) { + throw new RuntimeException("Error reading unknown attribute"); + } + } + // use casting to preserve sign + if(i == 1) result = (byte) result; + if(i == 2) result = (short) result; + return result; + } + + /** + * Returns the {@link BHSDCodec} that should be used for the given layout + * element + * + * @param layoutElement + */ + private BHSDCodec getCodec(String layoutElement) { + if (layoutElement.indexOf('O') >= 0) { + return Codec.BRANCH5; + } else if (layoutElement.indexOf('P') >= 0) { + return Codec.BCI5; + } else if (layoutElement.indexOf('S') >= 0 && layoutElement.indexOf("KS") < 0 //$NON-NLS-1$ + && layoutElement.indexOf("RS") < 0) { //$NON-NLS-1$ + return Codec.SIGNED5; + } else if (layoutElement.indexOf('B') >= 0) { + return Codec.BYTE1; + } else { + return Codec.UNSIGNED5; + } + } + + /** + * Utility method to get the contents of the given stream, up to the next + * ']', (ignoring pairs of brackets '[' and ']') + * + * @param stream + * @return + * @throws IOException + */ + private String readUpToMatchingBracket(StringReader stream) + throws IOException { + StringBuffer sb = new StringBuffer(); + int foundBracket = -1; + while (foundBracket != 0) { + char c = (char) stream.read(); + if (c == ']') { + foundBracket++; + } + if (c == '[') { + foundBracket--; + } + if (!(foundBracket == 0)) { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * Read a number from the stream and return it + * + * @param stream + * @return + * @throws IOException + */ + private Integer readNumber(StringReader stream) throws IOException { + stream.mark(1); + char first = (char) stream.read(); + boolean negative = first == '-'; + if (!negative) { + stream.reset(); + } + stream.mark(100); + int i; + int length = 0; + while ((i = (stream.read())) != -1 && Character.isDigit((char) i)) { + length++; + } + stream.reset(); + if(length == 0) { + return null; + } + char[] digits = new char[length]; + int read = stream.read(digits); + if (read != digits.length) { + throw new IOException("Error reading from the input stream"); + } + return new Integer(Integer.parseInt((negative ? "-" : "") + new String(digits))); + } + + /** + * Read a 'body' section of the layout from the given stream + * + * @param stream + * @return List of LayoutElements + * @throws IOException + */ + private List readBody(StringReader stream) throws IOException { + List layoutElements = new ArrayList(); + LayoutElement e; + while ((e = readNextLayoutElement(stream)) != null) { + layoutElements.add(e); + } + return layoutElements; + } + + /** + * Renumber any bytecode indexes or offsets as described in section 5.5.2 of + * the pack200 specification + * + * @param bciRenumbering + * @param labelsToOffsets + */ + public void renumberBci(IntList bciRenumbering, Map labelsToOffsets) { + for (Iterator iterator = attributeLayoutElements.iterator(); iterator.hasNext();) { + AttributeLayoutElement element = (AttributeLayoutElement) iterator.next(); + element.renumberBci(bciRenumbering, labelsToOffsets); + } + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/Pack200ClassReader.java b/src/main/java/org/apache/harmony/pack200/Pack200ClassReader.java new file mode 100644 index 0000000..78ded58 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/Pack200ClassReader.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.InputStream; + +import org.objectweb.asm.ClassReader; + +/** + * Wrapper for ClassReader that enables pack200 to obtain extra class file + * information + */ +public class Pack200ClassReader extends ClassReader { + + private boolean lastConstantHadWideIndex; + private int lastUnsignedShort; + private boolean anySyntheticAttributes; + private String fileName; + + /** + * @param b + * the contents of class file in the format of bytes + */ + public Pack200ClassReader(byte[] b) { + super(b); + } + + /** + * @param is + * the input stream of class file + * @throws IOException + */ + public Pack200ClassReader(InputStream is) throws IOException { + super(is); + } + + /** + * @param name + * @throws IOException + */ + public Pack200ClassReader(String name) throws IOException { + super(name); + } + + /** + * @param b + * @param off + * @param len + */ + public Pack200ClassReader(byte[] b, int off, int len) { + super(b, off, len); + } + + public int readUnsignedShort(int index) { + // Doing this to check whether last load-constant instruction was ldc (18) or ldc_w (19) + // TODO: Assess whether this impacts on performance + int unsignedShort = super.readUnsignedShort(index); + if(b[index - 1] == 19) { + lastUnsignedShort = unsignedShort; + } else { + lastUnsignedShort = Short.MIN_VALUE; + } + return unsignedShort; + } + + public Object readConst(int item, char[] buf) { + lastConstantHadWideIndex = item == lastUnsignedShort; + return super.readConst(item, buf); + } + + public String readUTF8(int arg0, char[] arg1) { + String utf8 = super.readUTF8(arg0, arg1); + if(!anySyntheticAttributes && "Synthetic".equals(utf8)) { + anySyntheticAttributes = true; + } + return utf8; + } + + public boolean lastConstantHadWideIndex() { + return lastConstantHadWideIndex; + } + + public boolean hasSyntheticAttributes() { + return anySyntheticAttributes; + } + + public void setFileName(String name) { + this.fileName = name; + } + + public String getFileName() { + return fileName; + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/Pack200Exception.java b/src/main/java/org/apache/harmony/pack200/Pack200Exception.java new file mode 100644 index 0000000..8f64351 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/Pack200Exception.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +/** + * Represents a problem with a Pack200 coding/decoding issue. + */ +public class Pack200Exception extends Exception { + + private static final long serialVersionUID = 5168177401552611803L; + + /** + * Create a new Pack200 exception with the given message + * + * @param message + * the text message to display + */ + public Pack200Exception(String message) { + super(message); + } + + /** + * Create a new Pack200 exception with the given message and cause + * + * @param message + * the text message to display + * @param cause + * the {@link Throwable} that caused this problem + */ + public Pack200Exception(String message, Throwable cause) { + super(message, cause); + } + + /** + * Create a new Pack200 exception with the given cause + * + * @param cause + * the {@link Throwable} that caused this problem + */ + public Pack200Exception(Throwable cause) { + super(cause); + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/PackingOptions.java b/src/main/java/org/apache/harmony/pack200/PackingOptions.java new file mode 100644 index 0000000..580c8a4 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/PackingOptions.java @@ -0,0 +1,369 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.objectweb.asm.Attribute; + +/** + * Utility class to manage the various options available for pack200 + */ +public class PackingOptions { + + public static final String STRIP = "strip"; + public static final String ERROR = "error"; + public static final String PASS = "pass"; + public static final String KEEP = "keep"; + + // All options are initially set to their defaults + private boolean repack = false; + private boolean gzip = true; + private boolean stripDebug = false; + private boolean keepFileOrder = true; + private long segmentLimit = 1000000L; + private int effort = 5; + private String deflateHint = KEEP; + private String modificationTime = KEEP; + private List passFiles; + private String unknownAttributeAction = PASS; + private Map classAttributeActions; + private Map fieldAttributeActions; + private Map methodAttributeActions; + private Map codeAttributeActions; + private boolean verbose = false; + private boolean quiet = true; + private String logFile; + + private Attribute[] unknownAttributeTypes; + + public boolean isRepack() { + return repack; + } + + public void setRepack(boolean repack) { + this.repack = repack; + } + + public boolean isGzip() { + return gzip; + } + + public void setGzip(boolean gzip) { + this.gzip = gzip; + } + + public boolean isStripDebug() { + return stripDebug; + } + + /** + * Set strip debug attributes. If true, all debug attributes (i.e. + * LineNumberTable, SourceFile, LocalVariableTable and + * LocalVariableTypeTable attributes) are stripped when reading the input + * class files and not included in the output archive. + * + * @param stripDebug + */ + public void setStripDebug(boolean stripDebug) { + this.stripDebug = stripDebug; + } + + public boolean isKeepFileOrder() { + return keepFileOrder; + } + + public void setKeepFileOrder(boolean keepFileOrder) { + this.keepFileOrder = keepFileOrder; + } + + public long getSegmentLimit() { + return segmentLimit; + } + + /** + * Set the segment limit (equivalent to -S command line option) + * @param segmentLimit - the limit in bytes + */ + public void setSegmentLimit(long segmentLimit) { + this.segmentLimit = segmentLimit; + } + + public int getEffort() { + return effort; + } + + /** + * Set the compression effort level (0-9, equivalent to -E command line option) + * @param effort + */ + public void setEffort(int effort) { + this.effort = effort; + } + + public String getDeflateHint() { + return deflateHint; + } + + public boolean isKeepDeflateHint() { + return KEEP.equals(deflateHint); + } + + public void setDeflateHint(String deflateHint) { + this.deflateHint = deflateHint; + } + + public String getModificationTime() { + return modificationTime; + } + + public void setModificationTime(String modificationTime) { + if (!KEEP.equals(modificationTime) + && !"latest".equals(modificationTime)) { + throw new IllegalArgumentException( + "Bad argument: -m " + + modificationTime + + " ? transmit modtimes should be either latest or keep (default)"); + } + this.modificationTime = modificationTime; + } + + public boolean isPassFile(String passFileName) { + if (passFiles != null) { + for (Iterator iterator = passFiles.iterator(); iterator.hasNext();) { + String pass = (String) iterator.next(); + if (passFileName.equals(pass)) { + return true; + } else if (!pass.endsWith(".class")) { // a whole directory is + // passed + if (!pass.endsWith("/")) { + // Make sure we don't get any false positives (e.g. + // exclude "org/apache/harmony/pack" should not match + // files under "org/apache/harmony/pack200/") + pass = pass + "/"; + } + return passFileName.startsWith(pass); + } + } + } + return false; + } + + /** + * Tell the compressor to pass the file with the given name, or if the name + * is a directory name all files under that directory will be passed. + * + * @param passFileName + * the file name + */ + public void addPassFile(String passFileName) { + if(passFiles == null) { + passFiles = new ArrayList(); + } + String fileSeparator = System.getProperty("file.separator"); + if(fileSeparator.equals("\\")) { + // Need to escape backslashes for replaceAll(), which uses regex + fileSeparator += "\\"; + } + passFileName = passFileName.replaceAll(fileSeparator, "/"); + passFiles.add(passFileName); + } + + public void removePassFile(String passFileName) { + passFiles.remove(passFileName); + } + + public String getUnknownAttributeAction() { + return unknownAttributeAction; + } + + /** + * Tell the compressor what to do if an unknown attribute is encountered + * @param unknownAttributeAction - the action to perform + */ + public void setUnknownAttributeAction(String unknownAttributeAction) { + this.unknownAttributeAction = unknownAttributeAction; + if (!PASS.equals(unknownAttributeAction) + && !ERROR.equals(unknownAttributeAction) + && !STRIP.equals(unknownAttributeAction)) { + throw new RuntimeException("Incorrect option for -U, " + + unknownAttributeAction); + } + } + + public Map getClassAttributeActions() { + return classAttributeActions; + } + + public void addClassAttributeAction(String attributeName, String action) { + if(classAttributeActions == null) { + classAttributeActions = new HashMap(); + } + classAttributeActions.put(attributeName, action); + } + + public Map getFieldAttributeActions() { + return fieldAttributeActions; + } + + public void addFieldAttributeAction(String attributeName, String action) { + if(fieldAttributeActions == null) { + fieldAttributeActions = new HashMap(); + } + fieldAttributeActions.put(attributeName, action); + } + + public Map getMethodAttributeActions() { + return methodAttributeActions; + } + + public void addMethodAttributeAction(String attributeName, String action) { + if(methodAttributeActions == null) { + methodAttributeActions = new HashMap(); + } + methodAttributeActions.put(attributeName, action); + } + + public Map getCodeAttributeActions() { + return codeAttributeActions; + } + + public void addCodeAttributeAction(String attributeName, String action) { + if(codeAttributeActions == null) { + codeAttributeActions = new HashMap(); + } + codeAttributeActions.put(attributeName, action); + } + + public boolean isVerbose() { + return verbose; + } + + public void setVerbose(boolean verbose) { + this.verbose = verbose; + } + + public boolean isQuiet() { + return quiet; + } + + public void setQuiet(boolean quiet) { + this.quiet = quiet; + } + + public String getLogFile() { + return logFile; + } + + public void setLogFile(String logFile) { + this.logFile = logFile; + } + + private void addOrUpdateAttributeActions(List prototypes, Map attributeActions, + int tag) { + if (attributeActions != null) { + if (attributeActions.size() > 0) { + String name, action; + boolean prototypeExists; + NewAttribute newAttribute; + for (Iterator iteratorI = attributeActions.keySet().iterator(); iteratorI + .hasNext();) { + name = (String) iteratorI.next(); + action = (String) attributeActions.get(name); + if (!ERROR.equals(action) && !STRIP.equals(action) + && !PASS.equals(action)) { + prototypeExists = false; + for (Iterator iteratorJ = prototypes.iterator(); iteratorJ + .hasNext();) { + newAttribute = (NewAttribute) iteratorJ.next(); + if (newAttribute.type.equals(name)) { + // if the attribute exists, update its context + newAttribute.addContext(tag); + prototypeExists = true; + break; + } + // if no attribute is found, add a new attribute + if (!prototypeExists) { + newAttribute = new NewAttribute(name, action, + tag); + prototypes.add(newAttribute); + } + } + } + } + } + } + } + + public Attribute[] getUnknownAttributePrototypes() { + if (unknownAttributeTypes == null) { + List prototypes = new ArrayList(); + addOrUpdateAttributeActions(prototypes, classAttributeActions, + AttributeDefinitionBands.CONTEXT_CLASS); + + addOrUpdateAttributeActions(prototypes, methodAttributeActions, + AttributeDefinitionBands.CONTEXT_METHOD); + + addOrUpdateAttributeActions(prototypes, fieldAttributeActions, + AttributeDefinitionBands.CONTEXT_FIELD); + + addOrUpdateAttributeActions(prototypes, codeAttributeActions, + AttributeDefinitionBands.CONTEXT_CODE); + + unknownAttributeTypes = (Attribute[]) prototypes + .toArray(new Attribute[0]); + } + return unknownAttributeTypes; + } + + public String getUnknownClassAttributeAction(String type) { + String action = (String) classAttributeActions.get(type); + if(action == null) { + action = unknownAttributeAction; + } + return action; + } + + public String getUnknownMethodAttributeAction(String type) { + String action = (String) methodAttributeActions.get(type); + if(action == null) { + action = unknownAttributeAction; + } + return action; + } + + public String getUnknownFieldAttributeAction(String type) { + String action = (String) fieldAttributeActions.get(type); + if(action == null) { + action = unknownAttributeAction; + } + return action; + } + + public String getUnknownCodeAttributeAction(String type) { + String action = (String) codeAttributeActions.get(type); + if(action == null) { + action = unknownAttributeAction; + } + return action; + } + +} diff --git a/src/main/java/org/apache/harmony/pack200/PackingUtils.java b/src/main/java/org/apache/harmony/pack200/PackingUtils.java new file mode 100644 index 0000000..5433e83 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/PackingUtils.java @@ -0,0 +1,250 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarInputStream; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.LogRecord; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; + +import org.apache.harmony.pack200.Archive.PackingFile; + +public class PackingUtils { + + private static PackingLogger packingLogger; + + static { + packingLogger = new PackingLogger("org.harmony.apache.pack200", null); + LogManager.getLogManager().addLogger(packingLogger); + } + + private static class PackingLogger extends Logger { + + private boolean verbose = false; + + protected PackingLogger(String name, String resourceBundleName) { + super(name, resourceBundleName); + } + + public void log(LogRecord logRecord) { + if (verbose) { + super.log(logRecord); + } + } + + public void setVerbose(boolean isVerbose) { + verbose = isVerbose; + } + } + + public static void config(PackingOptions options) throws IOException { + String logFileName = options.getLogFile(); + if (logFileName != null) { + FileHandler fileHandler = new FileHandler(logFileName, false); + fileHandler.setFormatter(new SimpleFormatter()); + packingLogger.addHandler(fileHandler); + packingLogger.setUseParentHandlers(false); + } + + packingLogger.setVerbose(options.isVerbose()); + } + + public static void log(String message) { + packingLogger.log(Level.INFO, message); + } + + /** + * When effort is 0, the packer copys through the original jar input stream + * without compression + * + * @param jarInputStream + * the jar input stream + * @param jarOutputStream + * the jar output stream + * @throws IOException + */ + public static void copyThroughJar(JarInputStream jarInputStream, + OutputStream outputStream) throws IOException { + Manifest manifest = jarInputStream.getManifest(); + JarOutputStream jarOutputStream = new JarOutputStream(outputStream, + manifest); + jarOutputStream.setComment("PACK200"); + log("Packed " + JarFile.MANIFEST_NAME); + + byte[] bytes = new byte[16384]; + JarEntry jarEntry; + int bytesRead; + while ((jarEntry = jarInputStream.getNextJarEntry()) != null) { + jarOutputStream.putNextEntry(jarEntry); + while ((bytesRead = jarInputStream.read(bytes)) != -1) { + jarOutputStream.write(bytes, 0, bytesRead); + } + log("Packed " + jarEntry.getName()); + } + jarInputStream.close(); + jarOutputStream.close(); + } + + /** + * When effort is 0, the packer copys through the original jar file without + * compression + * + * @param jarFile + * the input jar file + * @param jarOutputStream + * the jar output stream + * @throws IOException + */ + public static void copyThroughJar(JarFile jarFile, OutputStream outputStream) + throws IOException { + JarOutputStream jarOutputStream = new JarOutputStream(outputStream); + jarOutputStream.setComment("PACK200"); + byte[] bytes = new byte[16384]; + Enumeration entries = jarFile.entries(); + InputStream inputStream; + JarEntry jarEntry; + int bytesRead; + while (entries.hasMoreElements()) { + jarEntry = (JarEntry) entries.nextElement(); + jarOutputStream.putNextEntry(jarEntry); + inputStream = jarFile.getInputStream(jarEntry); + while ((bytesRead = inputStream.read(bytes)) != -1) { + jarOutputStream.write(bytes, 0, bytesRead); + } + jarOutputStream.closeEntry(); + log("Packed " + jarEntry.getName()); + } + jarFile.close(); + jarOutputStream.close(); + } + + public static List getPackingFileListFromJar(JarInputStream jarInputStream, + boolean keepFileOrder) throws IOException { + List packingFileList = new ArrayList(); + + // add manifest file + Manifest manifest = jarInputStream.getManifest(); + if (manifest != null) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + manifest.write(baos); + packingFileList.add(new PackingFile(JarFile.MANIFEST_NAME, baos + .toByteArray(), 0)); + } + + // add rest of entries in the jar + JarEntry jarEntry; + byte[] bytes; + while ((jarEntry = jarInputStream.getNextJarEntry()) != null) { + bytes = readJarEntry(jarEntry, new BufferedInputStream( + jarInputStream)); + packingFileList.add(new PackingFile(bytes, jarEntry)); + } + + // check whether it need reorder packing file list + if (!keepFileOrder) { + reorderPackingFiles(packingFileList); + } + return packingFileList; + } + + public static List getPackingFileListFromJar(JarFile jarFile, + boolean keepFileOrder) throws IOException { + List packingFileList = new ArrayList(); + Enumeration jarEntries = jarFile.entries(); + JarEntry jarEntry; + byte[] bytes; + while (jarEntries.hasMoreElements()) { + jarEntry = (JarEntry) jarEntries.nextElement(); + bytes = readJarEntry(jarEntry, new BufferedInputStream(jarFile + .getInputStream(jarEntry))); + packingFileList.add(new PackingFile(bytes, jarEntry)); + } + + // check whether it need reorder packing file list + if (!keepFileOrder) { + reorderPackingFiles(packingFileList); + } + return packingFileList; + } + + private static byte[] readJarEntry(JarEntry jarEntry, + InputStream inputStream) throws IOException { + long size = jarEntry.getSize(); + if (size > Integer.MAX_VALUE) { + // TODO: Should probably allow this + throw new RuntimeException("Large Class!"); + } else if (size < 0) { + size = 0; + } + byte[] bytes = new byte[(int) size]; + if (inputStream.read(bytes) != size) { + throw new RuntimeException("Error reading from stream"); + } + return bytes; + } + + private static void reorderPackingFiles(List packingFileList) { + Iterator iterator = packingFileList.iterator(); + PackingFile packingFile; + while (iterator.hasNext()) { + packingFile = (PackingFile) iterator.next(); + if (packingFile.isDirectory()) { + // remove directory entries + iterator.remove(); + } + } + + // Sort files by name, "META-INF/MANIFEST.MF" should be put in the 1st + // position + Collections.sort(packingFileList, new Comparator() { + public int compare(Object arg0, Object arg1) { + if (arg0 instanceof PackingFile && arg1 instanceof PackingFile) { + String fileName0 = ((PackingFile) arg0).getName(); + String fileName1 = ((PackingFile) arg1).getName(); + if (fileName0.equals(fileName1)) { + return 0; + } else if (JarFile.MANIFEST_NAME.equals(fileName0)) { + return -1; + } else if (JarFile.MANIFEST_NAME.equals(fileName1)) { + return 1; + } + return fileName0.compareTo(fileName1); + } + throw new IllegalArgumentException(); + } + }); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/pack200/PopulationCodec.java b/src/main/java/org/apache/harmony/pack200/PopulationCodec.java new file mode 100644 index 0000000..48ad1e7 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/PopulationCodec.java @@ -0,0 +1,169 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.InputStream; + + +/** + * A PopulationCodec is a Codec that is well suited to encoding data that shows + * statistical or repetitive patterns, containing for example a few numbers + * which are repeated a lot throughout the set, but not necessarily + * sequentially. + */ +public class PopulationCodec extends Codec { + + private final Codec favouredCodec; + private Codec tokenCodec; + private final Codec unfavouredCodec; + private int l; + private int[] favoured; + + public PopulationCodec(Codec favouredCodec, Codec tokenCodec, + Codec unvafouredCodec) { + this.favouredCodec = favouredCodec; + this.tokenCodec = tokenCodec; + this.unfavouredCodec = unvafouredCodec; + } + + public PopulationCodec(Codec favouredCodec, int l, Codec unfavouredCodec) { + if (l >= 256 || l <= 0) { + throw new IllegalArgumentException("L must be between 1..255"); + } + this.favouredCodec = favouredCodec; + this.l = l; + this.unfavouredCodec = unfavouredCodec; + } + + public int decode(InputStream in) throws IOException, Pack200Exception { + throw new Pack200Exception( + "Population encoding does not work unless the number of elements are known"); + } + + public int decode(InputStream in, long last) throws IOException, + Pack200Exception { + throw new Pack200Exception( + "Population encoding does not work unless the number of elements are known"); + } + + public int[] decodeInts(int n, InputStream in) throws IOException, + Pack200Exception { + lastBandLength = 0; + favoured = new int[n]; // there must be <= n values, but probably a lot + // less + int result[]; + // read table of favorites first + int smallest = Integer.MAX_VALUE, absoluteSmallest; + int last = 0; + int value = 0, absoluteValue; + int k = -1; + while (true) { + value = favouredCodec.decode(in, last); + if (k > -1 && (value == smallest || value == last)) { + break; + } + favoured[++k] = value; + absoluteSmallest = Math.abs(smallest); + absoluteValue = Math.abs(value); + if (absoluteSmallest > absoluteValue) { + smallest = value; + } else if (absoluteSmallest == absoluteValue) { + // ensure that -X and +X -> +X + smallest = absoluteSmallest; + } + last = value; + } + lastBandLength += k; + // if tokenCodec needs to be derived from the T, L and K values + if (tokenCodec == null) { + if (k < 256) { + tokenCodec = Codec.BYTE1; + } else { + // if k >= 256, b >= 2 + int b = 1; + BHSDCodec codec = null; + while (++b < 5) { + codec = new BHSDCodec(b, 256 - l, 0); + if (codec.encodes(k)) { + tokenCodec = codec; + break; + } + } + if (tokenCodec == null) { + throw new Pack200Exception( + "Cannot calculate token codec from " + k + " and " + + l); + } + } + } + // read favorites + lastBandLength += n; + result = tokenCodec.decodeInts(n, in); + // read unfavorites + last = 0; + for (int i = 0; i < n; i++) { + int index = result[i]; + if (index == 0) { + lastBandLength++; + result[i] = last = unfavouredCodec.decode(in, last); + } else { + result[i] = favoured[index - 1]; + } + } + return result; + } + + public int[] getFavoured() { + return favoured; + } + + public Codec getFavouredCodec() { + return favouredCodec; + } + + public Codec getUnfavouredCodec() { + return unfavouredCodec; + } + + public byte[] encode(int value, int last) throws Pack200Exception { + throw new Pack200Exception( + "Population encoding does not work unless the number of elements are known"); + } + + public byte[] encode(int value) throws Pack200Exception { + throw new Pack200Exception( + "Population encoding does not work unless the number of elements are known"); + } + + public byte[] encode(int[] favoured, int[] tokens, int[] unfavoured) throws Pack200Exception { + byte[] favouredEncoded = favouredCodec.encode(favoured); + byte[] tokensEncoded = tokenCodec.encode(tokens); + byte[] unfavouredEncoded = unfavouredCodec.encode(unfavoured); + byte[] band = new byte[favouredEncoded.length + tokensEncoded.length + unfavouredEncoded.length]; + + return band; + } + + public Codec getTokenCodec() { + return tokenCodec; + } + + public int getL() { + return l; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/RunCodec.java b/src/main/java/org/apache/harmony/pack200/RunCodec.java new file mode 100644 index 0000000..1f45a00 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/RunCodec.java @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + + +/** + * A run codec is a grouping of two nested codecs; K values are decoded from the + * first codec, and the remaining codes are decoded from the remaining codec. + * Note that since this codec maintains state, the instances are not reusable. + */ +public class RunCodec extends Codec { + + private int k; + private final Codec aCodec; + private final Codec bCodec; + private int last; + + public RunCodec(int k, Codec aCodec, Codec bCodec) throws Pack200Exception { + if (k <= 0) { + throw new Pack200Exception( + "Cannot have a RunCodec for a negative number of numbers"); + } + if (aCodec == null || bCodec == null) { + throw new Pack200Exception("Must supply both codecs for a RunCodec"); + } + this.k = k; + this.aCodec = aCodec; + this.bCodec = bCodec; + } + + public int decode(InputStream in) throws IOException, Pack200Exception { + return decode(in, this.last); + } + + public int decode(InputStream in, long last) throws IOException, + Pack200Exception { + if (--k >= 0) { + int value = aCodec.decode(in, this.last); + this.last = (k == 0 ? 0 : value); + return normalise(value, aCodec); + } else { + this.last = bCodec.decode(in, this.last); + return normalise(this.last, bCodec); + } + } + + private int normalise(int value, Codec codecUsed) { + if (codecUsed instanceof BHSDCodec) { + BHSDCodec bhsd = (BHSDCodec) codecUsed; + if (bhsd.isDelta()) { + long cardinality = bhsd.cardinality(); + while (value > bhsd.largest()) { + value -= cardinality; + } + while (value < bhsd.smallest()) { + value += cardinality; + } + } + } + return value; + } + + public int[] decodeInts(int n, InputStream in) throws IOException, + Pack200Exception { + int[] band = new int[n]; + int[] aValues = aCodec.decodeInts(k, in); + normalise(aValues, aCodec); + int[] bValues = bCodec.decodeInts(n - k, in); + normalise(bValues, bCodec); + System.arraycopy(aValues, 0, band, 0, k); + System.arraycopy(bValues, 0, band, k, n - k); + lastBandLength = aCodec.lastBandLength + bCodec.lastBandLength; + return band; + } + + private void normalise(int[] band, Codec codecUsed) { + if (codecUsed instanceof BHSDCodec) { + BHSDCodec bhsd = (BHSDCodec) codecUsed; + if (bhsd.isDelta()) { + long cardinality = bhsd.cardinality(); + for (int i = 0; i < band.length; i++) { + while (band[i] > bhsd.largest()) { + band[i] -= cardinality; + } + while (band[i] < bhsd.smallest()) { + band[i] += cardinality; + } + } + } + } else if (codecUsed instanceof PopulationCodec) { + PopulationCodec popCodec = (PopulationCodec) codecUsed; + int[] favoured = (int[]) popCodec.getFavoured().clone(); + Arrays.sort(favoured); + for (int i = 0; i < band.length; i++) { + boolean favouredValue = Arrays.binarySearch(favoured, band[i]) > -1; + Codec theCodec = favouredValue ? popCodec.getFavouredCodec() + : popCodec.getUnfavouredCodec(); + if (theCodec instanceof BHSDCodec) { + BHSDCodec bhsd = (BHSDCodec) theCodec; + if (bhsd.isDelta()) { + long cardinality = bhsd.cardinality(); + while (band[i] > bhsd.largest()) { + band[i] -= cardinality; + } + while (band[i] < bhsd.smallest()) { + band[i] += cardinality; + } + } + } + } + } + } + + public String toString() { + return "RunCodec[k=" + k + ";aCodec=" + aCodec + "bCodec=" + bCodec + + "]"; + } + + public byte[] encode(int value, int last) throws Pack200Exception { + // TODO Auto-generated method stub + return null; + } + + public byte[] encode(int value) throws Pack200Exception { + // TODO Auto-generated method stub + return null; + } + + public int getK() { + return k; + } + + public Codec getACodec() { + return aCodec; + } + + public Codec getBCodec() { + return bCodec; + } +} diff --git a/src/main/java/org/apache/harmony/pack200/Segment.java b/src/main/java/org/apache/harmony/pack200/Segment.java new file mode 100644 index 0000000..2f748c0 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/Segment.java @@ -0,0 +1,676 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.harmony.pack200; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.harmony.pack200.Archive.PackingFile; +import org.apache.harmony.pack200.Archive.SegmentUnit; +import org.objectweb.asm.AnnotationVisitor; +import org.objectweb.asm.Attribute; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.FieldVisitor; +import org.objectweb.asm.Label; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Type; + +/** + * A Pack200 archive consists of one or more Segments. + */ +public class Segment implements ClassVisitor { + + private SegmentHeader segmentHeader; + private CpBands cpBands; + private AttributeDefinitionBands attributeDefinitionBands; + private IcBands icBands; + private ClassBands classBands; + private BcBands bcBands; + private FileBands fileBands; + + private final SegmentFieldVisitor fieldVisitor = new SegmentFieldVisitor(); + private final SegmentMethodVisitor methodVisitor = new SegmentMethodVisitor(); + private Pack200ClassReader currentClassReader; + private PackingOptions options; + private boolean stripDebug; + private Attribute[] nonStandardAttributePrototypes; + + /** + * The main method on Segment. Reads in all the class files, packs them and + * then writes the packed segment out to the given OutputStream. + * + * @param classes + * List of Pack200ClassReaders, one for each class file in the + * segment + * @param files + * List of Archive.Files, one for each file in the segment + * @param out + * the OutputStream to write the packed Segment to + * @param options + * packing options + * @throws IOException + * @throws Pack200Exception + */ + public void pack(SegmentUnit segmentUnit, OutputStream out, PackingOptions options) + throws IOException, Pack200Exception { + this.options = options; + this.stripDebug = options.isStripDebug(); + int effort = options.getEffort(); + nonStandardAttributePrototypes = options.getUnknownAttributePrototypes(); + + PackingUtils.log("Start to pack a new segment with " + + segmentUnit.fileListSize() + " files including " + + segmentUnit.classListSize() + " classes"); + + PackingUtils.log("Initialize a header for the segment"); + segmentHeader = new SegmentHeader(); + segmentHeader.setFile_count(segmentUnit.fileListSize()); + segmentHeader.setHave_all_code_flags(!stripDebug); + if (!options.isKeepDeflateHint()) { + segmentHeader.setDeflate_hint("true".equals(options + .getDeflateHint())); + } + + PackingUtils.log("Setup constant pool bands for the segment"); + cpBands = new CpBands(this, effort); + + PackingUtils.log("Setup attribute definition bands for the segment"); + attributeDefinitionBands = new AttributeDefinitionBands(this, effort, nonStandardAttributePrototypes); + + PackingUtils.log("Setup internal class bands for the segment"); + icBands = new IcBands(segmentHeader, cpBands, effort); + + PackingUtils.log("Setup class bands for the segment"); + classBands = new ClassBands(this, segmentUnit.classListSize(), effort, stripDebug); + + PackingUtils.log("Setup byte code bands for the segment"); + bcBands = new BcBands(cpBands, this, effort); + + PackingUtils.log("Setup file bands for the segment"); + fileBands = new FileBands(cpBands, segmentHeader, options, segmentUnit, effort); + + processClasses(segmentUnit); + + cpBands.finaliseBands(); + attributeDefinitionBands.finaliseBands(); + icBands.finaliseBands(); + classBands.finaliseBands(); + bcBands.finaliseBands(); + fileBands.finaliseBands(); + + // Using a temporary stream because we have to pack the other bands + // before segmentHeader because the band_headers band is only created + // when the other bands are packed, but comes before them in the packed + // file. + ByteArrayOutputStream bandsOutputStream = new ByteArrayOutputStream(); + + PackingUtils.log("Packing..."); + cpBands.pack(bandsOutputStream); + attributeDefinitionBands.pack(bandsOutputStream); + icBands.pack(bandsOutputStream); + classBands.pack(bandsOutputStream); + bcBands.pack(bandsOutputStream); + fileBands.pack(bandsOutputStream); + + ByteArrayOutputStream headerOutputStream = new ByteArrayOutputStream(); + segmentHeader.pack(headerOutputStream); + + headerOutputStream.writeTo(out); + bandsOutputStream.writeTo(out); + + segmentUnit.addPackedByteAmount(headerOutputStream.size()); + segmentUnit.addPackedByteAmount(bandsOutputStream.size()); + + PackingUtils.log("Wrote total of " + segmentUnit.getPackedByteAmount() + + " bytes"); + PackingUtils.log("Transmitted " + segmentUnit.fileListSize() + " files of " + + segmentUnit.getByteAmount() + " input bytes in a segment of " + + segmentUnit.getPackedByteAmount() + " bytes"); + } + + private void processClasses(SegmentUnit segmentUnit) throws Pack200Exception { + segmentHeader.setClass_count(segmentUnit.classListSize()); + for (Iterator iterator = segmentUnit.getClassList().iterator(); iterator.hasNext();) { + Pack200ClassReader classReader = (Pack200ClassReader) iterator + .next(); + currentClassReader = classReader; + int flags = 0; + if(stripDebug) { + flags |= ClassReader.SKIP_DEBUG; + } + try { + classReader.accept(this, flags); + } catch (PassException pe) { + // Pass this class through as-is rather than packing it + // TODO: probably need to deal with any inner classes + classBands.removeCurrentClass(); + String name = classReader.getFileName(); + boolean found = false; + for (Iterator iterator2 = segmentUnit.getFileList().iterator(); iterator2 + .hasNext();) { + PackingFile file = (PackingFile) iterator2.next(); + if(file.getName().equals(name)) { + found = true; + file.setContents(classReader.b); + break; + } + } + if(!found) { + throw new Pack200Exception("Error passing file " + name); + } + } + } + } + + public void visit(int version, int access, String name, String signature, + String superName, String[] interfaces) { + bcBands.setCurrentClass(name, superName); + segmentHeader.addMajorVersion(version); + classBands.addClass(version, access, name, signature, superName, + interfaces); + } + + public void visitSource(String source, String debug) { + if(!stripDebug) { + classBands.addSourceFile(source); + } + } + + public void visitOuterClass(String owner, String name, String desc) { + classBands.addEnclosingMethod(owner, name, desc); + + } + + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + return new SegmentAnnotationVisitor(MetadataBandGroup.CONTEXT_CLASS, + desc, visible); + } + + public void visitAttribute(Attribute attribute) { + if(attribute.isUnknown()) { + String action = options.getUnknownAttributeAction(); + if(action.equals(PackingOptions.PASS)) { + passCurrentClass(); + } else if (action.equals(PackingOptions.ERROR)) { + throw new Error("Unknown attribute encountered"); + } // else skip + } else { + if(attribute instanceof NewAttribute) { + NewAttribute newAttribute = (NewAttribute) attribute; + if(newAttribute.isUnknown(AttributeDefinitionBands.CONTEXT_CLASS)) { + String action = options.getUnknownClassAttributeAction(newAttribute.type); + if(action.equals(PackingOptions.PASS)) { + passCurrentClass(); + } else if (action.equals(PackingOptions.ERROR)) { + throw new Error("Unknown attribute encountered"); + } // else skip + } + classBands.addClassAttribute(newAttribute); + } else { + throw new RuntimeException("Unexpected attribute encountered: " + attribute.type); + } + } + } + + public void visitInnerClass(String name, String outerName, + String innerName, int flags) { + icBands.addInnerClass(name, outerName, innerName, flags); + } + + public FieldVisitor visitField(int flags, String name, String desc, + String signature, Object value) { + classBands.addField(flags, name, desc, signature, value); + return fieldVisitor; + } + + public MethodVisitor visitMethod(int flags, String name, String desc, + String signature, String[] exceptions) { + classBands.addMethod(flags, name, desc, signature, exceptions); + return methodVisitor; + } + + public void visitEnd() { + classBands.endOfClass(); + } + + /** + * This class implements MethodVisitor to visit the contents and metadata + * related to methods in a class file. + * + * It delegates to BcBands for bytecode related visits and to ClassBands for + * everything else. + */ + public class SegmentMethodVisitor implements MethodVisitor { + + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + return new SegmentAnnotationVisitor( + MetadataBandGroup.CONTEXT_METHOD, desc, visible); + } + + public AnnotationVisitor visitAnnotationDefault() { + return new SegmentAnnotationVisitor(MetadataBandGroup.CONTEXT_METHOD); + } + + public void visitAttribute(Attribute attribute) { + if(attribute.isUnknown()) { + String action = options.getUnknownAttributeAction(); + if(action.equals(PackingOptions.PASS)) { + passCurrentClass(); + } else if (action.equals(PackingOptions.ERROR)) { + throw new Error("Unknown attribute encountered"); + } // else skip + } else { + if(attribute instanceof NewAttribute) { + NewAttribute newAttribute = (NewAttribute) attribute; + if (attribute.isCodeAttribute()) { + if (newAttribute.isUnknown(AttributeDefinitionBands.CONTEXT_CODE)) { + String action = options + .getUnknownCodeAttributeAction(newAttribute.type); + if (action.equals(PackingOptions.PASS)) { + passCurrentClass(); + } else if (action.equals(PackingOptions.ERROR)) { + throw new Error("Unknown attribute encountered"); + } // else skip + } + classBands.addCodeAttribute(newAttribute); + } else { + if (newAttribute.isUnknown(AttributeDefinitionBands.CONTEXT_METHOD)) { + String action = options + .getUnknownMethodAttributeAction(newAttribute.type); + if (action.equals(PackingOptions.PASS)) { + passCurrentClass(); + } else if (action.equals(PackingOptions.ERROR)) { + throw new Error("Unknown attribute encountered"); + } // else skip + } + classBands.addMethodAttribute(newAttribute); + } + } else { + throw new RuntimeException("Unexpected attribute encountered: " + attribute.type); + } + } + } + + public void visitCode() { + classBands.addCode(); + } + + public void visitFrame(int arg0, int arg1, Object[] arg2, int arg3, + Object[] arg4) { + // TODO: Java 6 - implement support for this + + } + + public void visitLabel(Label label) { + bcBands.visitLabel(label); + } + + public void visitLineNumber(int line, Label start) { + if(!stripDebug) { + classBands.addLineNumber(line, start); + } + } + + public void visitLocalVariable(String name, String desc, + String signature, Label start, Label end, int index) { + if(!stripDebug) { + classBands.addLocalVariable(name, desc, signature, start, end, + index); + } + } + + public void visitMaxs(int maxStack, int maxLocals) { + classBands.addMaxStack(maxStack, maxLocals); + } + + public AnnotationVisitor visitParameterAnnotation(int parameter, + String desc, boolean visible) { + return new SegmentAnnotationVisitor( + MetadataBandGroup.CONTEXT_METHOD, parameter, desc, visible); + } + + public void visitTryCatchBlock(Label start, Label end, Label handler, + String type) { + classBands.addHandler(start, end, handler, type); + } + + public void visitEnd() { + classBands.endOfMethod(); + bcBands.visitEnd(); + } + + public void visitFieldInsn(int opcode, String owner, String name, + String desc) { + bcBands.visitFieldInsn(opcode, owner, name, desc); + } + + public void visitIincInsn(int var, int increment) { + bcBands.visitIincInsn(var, increment); + } + + public void visitInsn(int opcode) { + bcBands.visitInsn(opcode); + } + + public void visitIntInsn(int opcode, int operand) { + bcBands.visitIntInsn(opcode, operand); + } + + public void visitJumpInsn(int opcode, Label label) { + bcBands.visitJumpInsn(opcode, label); + } + + public void visitLdcInsn(Object cst) { + bcBands.visitLdcInsn(cst); + } + + public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) { + bcBands.visitLookupSwitchInsn(dflt, keys, labels); + } + + public void visitMethodInsn(int opcode, String owner, String name, + String desc) { + bcBands.visitMethodInsn(opcode, owner, name, desc); + } + + public void visitMultiANewArrayInsn(String desc, int dimensions) { + bcBands.visitMultiANewArrayInsn(desc, dimensions); + } + + public void visitTableSwitchInsn(int min, int max, Label dflt, + Label[] labels) { + bcBands.visitTableSwitchInsn(min, max, dflt, labels); + } + + public void visitTypeInsn(int opcode, String type) { + bcBands.visitTypeInsn(opcode, type); + } + + public void visitVarInsn(int opcode, int var) { + bcBands.visitVarInsn(opcode, var); + } + + } + + public ClassBands getClassBands() { + return classBands; + } + + /** + * SegmentAnnotationVisitor implements AnnotationVisitor to + * visit Annotations found in a class file. + */ + public class SegmentAnnotationVisitor implements AnnotationVisitor { + + private int context = -1; + private int parameter = -1; + private String desc; + private boolean visible; + + private final List nameRU = new ArrayList(); + private final List T = new ArrayList(); // tags + private final List values = new ArrayList(); + private final List caseArrayN = new ArrayList(); + private final List nestTypeRS = new ArrayList(); + private final List nestNameRU = new ArrayList(); + private final List nestPairN = new ArrayList(); + + public SegmentAnnotationVisitor(int context, String desc, + boolean visible) { + this.context = context; + this.desc = desc; + this.visible = visible; + } + + public SegmentAnnotationVisitor(int context) { + this.context = context; + } + + public SegmentAnnotationVisitor(int context, int parameter, + String desc, boolean visible) { + this.context = context; + this.parameter = parameter; + this.desc = desc; + this.visible = visible; + } + + public void visit(String name, Object value) { + if (name == null) { + name = ""; + } + nameRU.add(name); + values.add(value); + addTag(value); + } + + private void addTag(Object value) { + if(value instanceof Integer) { + T.add("I"); + } else if (value instanceof Double) { + T.add("D"); + } else if (value instanceof Float) { + T.add("F"); + } else if (value instanceof Long) { + T.add("J"); + } else if (value instanceof Byte) { + T.add("B"); + } else if (value instanceof Character) { + T.add("C"); + } else if (value instanceof Short) { + T.add("S"); + } else if (value instanceof Boolean) { + T.add("Z"); + } else if (value instanceof String) { + T.add("s"); + } else if (value instanceof Type) { + T.add("c"); + } + } + + public AnnotationVisitor visitAnnotation(String name, String desc) { + T.add("@"); + if (name == null) { + name = ""; + } + nameRU.add(name); + nestTypeRS.add(desc); + nestPairN.add(new Integer(0)); + return new AnnotationVisitor() { + public void visit(String name, Object value) { + Integer numPairs = (Integer) nestPairN.remove(nestPairN.size() - 1); + nestPairN.add(new Integer(numPairs.intValue() + 1)); + nestNameRU.add(name); + values.add(value); + addTag(value); + } + + public AnnotationVisitor visitAnnotation(String arg0, + String arg1) { + throw new RuntimeException("Not yet supported"); +// return null; + } + + public AnnotationVisitor visitArray(String arg0) { + throw new RuntimeException("Not yet supported"); +// return null; + } + + public void visitEnd() { + } + + public void visitEnum(String name, String desc, String value) { + Integer numPairs = (Integer) nestPairN.remove(nestPairN.size() - 1); + nestPairN.add(new Integer(numPairs.intValue() + 1)); + T.add("e"); + nestNameRU.add(name); + values.add(desc); + values.add(value); + } + }; + } + + public AnnotationVisitor visitArray(String name) { + T.add("["); + if (name == null) { + name = ""; + } + nameRU.add(name); + caseArrayN.add(new Integer(0)); + return new AnnotationVisitor() { + public void visit(String name, Object value) { + Integer numCases = (Integer) caseArrayN.remove(caseArrayN.size() - 1); + caseArrayN.add(new Integer(numCases.intValue() + 1)); + if (name == null) { + name = ""; + } + nameRU.add(name); + values.add(value); + addTag(value); + } + + public AnnotationVisitor visitAnnotation(String arg0, + String arg1) { + throw new RuntimeException("Not yet supported"); + } + + public AnnotationVisitor visitArray(String arg0) { + throw new RuntimeException("Not yet supported"); +// return null; + } + + public void visitEnd() { + } + + public void visitEnum(String name, String desc, String value) { + Integer numCases = (Integer) caseArrayN.remove(caseArrayN.size() - 1); + caseArrayN.add(new Integer(numCases.intValue() + 1)); + T.add("e"); + if(name == null) { + name = ""; + } + nameRU.add(name); + values.add(desc); + values.add(value); + } + }; + } + + public void visitEnd() { + if (desc == null) { + Segment.this.classBands.addAnnotationDefault(nameRU, T, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + } else if(parameter != -1) { + Segment.this.classBands.addParameterAnnotation(parameter, desc, visible, nameRU, T, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + } else { + Segment.this.classBands.addAnnotation(context, desc, visible, nameRU, T, values, caseArrayN, nestTypeRS, nestNameRU, nestPairN); + } + } + + public void visitEnum(String name, String desc, String value) { + T.add("e"); + if (name == null) { + name = ""; + } + nameRU.add(name); + values.add(desc); + values.add(value); + } + } + + /** + * SegmentFieldVisitor implements FieldVisitor to visit the + * metadata relating to fields in a class file. + */ + public class SegmentFieldVisitor implements FieldVisitor { + + public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + return new SegmentAnnotationVisitor(MetadataBandGroup.CONTEXT_FIELD, + desc, visible); + } + + public void visitAttribute(Attribute attribute) { + if(attribute.isUnknown()) { + String action = options.getUnknownAttributeAction(); + if(action.equals(PackingOptions.PASS)) { + passCurrentClass(); + } else if (action.equals(PackingOptions.ERROR)) { + throw new Error("Unknown attribute encountered"); + } // else skip + } else { + if(attribute instanceof NewAttribute) { + NewAttribute newAttribute = (NewAttribute) attribute; + if(newAttribute.isUnknown(AttributeDefinitionBands.CONTEXT_FIELD)) { + String action = options.getUnknownFieldAttributeAction(newAttribute.type); + if(action.equals(PackingOptions.PASS)) { + passCurrentClass(); + } else if (action.equals(PackingOptions.ERROR)) { + throw new Error("Unknown attribute encountered"); + } // else skip + } + classBands.addFieldAttribute(newAttribute); + } else { + throw new RuntimeException("Unexpected attribute encountered: " + attribute.type); + } + } + } + + public void visitEnd() { + } + } + + public boolean lastConstantHadWideIndex() { + return currentClassReader.lastConstantHadWideIndex(); + } + + public CpBands getCpBands() { + return cpBands; + } + + public SegmentHeader getSegmentHeader() { + return segmentHeader; + } + + public AttributeDefinitionBands getAttrBands() { + return attributeDefinitionBands; + } + + public IcBands getIcBands() { + return icBands; + } + + public Pack200ClassReader getCurrentClassReader() { + return currentClassReader; + } + + private void passCurrentClass() { + throw new PassException(); + } + + /** + * Exception indicating that the class currently being visited contains an + * unknown attribute, which means that by default the class file needs to be + * passed through as-is in the file_bands rather than being packed with + * pack200. + */ + public class PassException extends RuntimeException { + + } +} diff --git a/src/main/java/org/apache/harmony/pack200/SegmentHeader.java b/src/main/java/org/apache/harmony/pack200/SegmentHeader.java new file mode 100644 index 0000000..c06f985 --- /dev/null +++ b/src/main/java/org/apache/harmony/pack200/SegmentHeader.java @@ -0,0 +1,392 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * SegmentHeader is the header band of a {@link Segment}. Corresponds to + * segment_header in the pack200 specification. + */ +public class SegmentHeader extends BandSet { + + /** + * Create a new SegmentHeader + */ + public SegmentHeader() { + super(1, null); // Pass 1 for effort because bands in the segment header + // should always use the default encoding + } + + private static final int[] magic = { 0xCA, 0xFE, 0xD0, 0x0D }; + private static final int archive_minver = 7; + private static final int archive_majver = 150; + + private int archive_options; + + private int cp_Utf8_count; + private int cp_Int_count; + private int cp_Float_count; + private int cp_Long_count; + private int cp_Double_count; + private int cp_String_count; + private int cp_Class_count; + private int cp_Signature_count; + private int cp_Descr_count; + private int cp_Field_count; + private int cp_Method_count; + private int cp_Imethod_count; + + private int attribute_definition_count; + private final IntList band_headers = new IntList(); + + private boolean have_all_code_flags = true; // true by default + + private int archive_size_hi; + private int archive_size_lo; + private int archive_next_count; + private int archive_modtime; + private int file_count; + + private boolean deflate_hint; + private boolean have_file_modtime = true; + private boolean have_file_options = true; + private boolean have_file_size_hi; + private boolean have_class_flags_hi; + private boolean have_field_flags_hi; + private boolean have_method_flags_hi; + private boolean have_code_flags_hi; + + private int ic_count; + private int class_count; + private final Counter majverCounter = new Counter(); + + /** + * Encode and write the SegmentHeader bands to the OutputStream + */ + public void pack(OutputStream out) throws IOException, Pack200Exception { + out.write(encodeScalar(magic, Codec.BYTE1)); + out.write(encodeScalar(archive_minver, Codec.UNSIGNED5)); + out.write(encodeScalar(archive_majver, Codec.UNSIGNED5)); + calculateArchiveOptions(); + out.write(encodeScalar(archive_options, Codec.UNSIGNED5)); + writeArchiveFileCounts(out); + writeArchiveSpecialCounts(out); + writeCpCounts(out); + writeClassCounts(out); + if (band_headers.size()> 0) { + out.write(encodeScalar(band_headers.toArray(), BHSDCodec.BYTE1)); + } + } + + private void calculateArchiveOptions() { + if (attribute_definition_count > 0 || band_headers.size() > 0) { + archive_options |= 1; + } + if (cp_Int_count > 0 || cp_Float_count > 0 || cp_Long_count > 0 + || cp_Double_count > 0) { + archive_options |= (1 << 1); + } + if (have_all_code_flags) { + archive_options |= (1 << 2); + } + if (file_count > 0) { + archive_options |= (1 << 4); + } + if (deflate_hint) { + archive_options |= (1 << 5); + } + if (have_file_modtime) { + archive_options |= (1 << 6); + } + if (have_file_options) { + archive_options |= (1 << 7); + } + if (have_file_size_hi) { + archive_options |= (1 << 8); + } + if (have_class_flags_hi) { + archive_options |= (1 << 9); + } + if (have_field_flags_hi) { + archive_options |= (1 << 10); + } + if (have_method_flags_hi) { + archive_options |= (1 << 11); + } + if (have_code_flags_hi) { + archive_options |= (1 << 12); + } + } + + public void setCp_Utf8_count(int count) { + cp_Utf8_count = count; + } + + public void setCp_Int_count(int count) { + cp_Int_count = count; + } + + public void setCp_Float_count(int count) { + cp_Float_count = count; + } + + public void setCp_Long_count(int count) { + cp_Long_count = count; + } + + public void setCp_Double_count(int count) { + cp_Double_count = count; + } + + public void setCp_String_count(int count) { + cp_String_count = count; + } + + public void setCp_Class_count(int count) { + cp_Class_count = count; + } + + public void setCp_Signature_count(int count) { + cp_Signature_count = count; + } + + public void setCp_Descr_count(int count) { + cp_Descr_count = count; + } + + public void setCp_Field_count(int count) { + cp_Field_count = count; + } + + public void setCp_Method_count(int count) { + cp_Method_count = count; + } + + public void setCp_Imethod_count(int count) { + cp_Imethod_count = count; + } + + public void setAttribute_definition_count(int attribute_definition_count) { + this.attribute_definition_count = attribute_definition_count; + } + + public void setHave_all_code_flags(boolean have_all_code_flags) { + this.have_all_code_flags = have_all_code_flags; + } + + public void setArchive_size_hi(int archive_size_hi) { + this.archive_size_hi = archive_size_hi; + } + + public void setArchive_size_lo(int archive_size_lo) { + this.archive_size_lo = archive_size_lo; + } + + public void setArchive_next_count(int archive_next_count) { + this.archive_next_count = archive_next_count; + } + + public void setArchive_modtime(int archive_modtime) { + this.archive_modtime = archive_modtime; + } + + public int getArchive_modtime() { + return archive_modtime; + } + + public void setFile_count(int file_count) { + this.file_count = file_count; + } + + public void setDeflate_hint(boolean deflate_hint) { + this.deflate_hint = deflate_hint; + } + + public void setHave_file_modtime(boolean have_file_modtime) { + this.have_file_modtime = have_file_modtime; + } + + public void setHave_file_options(boolean have_file_options) { + this.have_file_options = have_file_options; + } + + public void setHave_file_size_hi(boolean have_file_size_hi) { + this.have_file_size_hi = have_file_size_hi; + } + + public void setHave_class_flags_hi(boolean have_class_flags_hi) { + this.have_class_flags_hi = have_class_flags_hi; + } + + public void setHave_field_flags_hi(boolean have_field_flags_hi) { + this.have_field_flags_hi = have_field_flags_hi; + } + + public void setHave_method_flags_hi(boolean have_method_flags_hi) { + this.have_method_flags_hi = have_method_flags_hi; + } + + public void setHave_code_flags_hi(boolean have_code_flags_hi) { + this.have_code_flags_hi = have_code_flags_hi; + } + + public boolean have_class_flags_hi() { + return have_class_flags_hi; + } + + public boolean have_field_flags_hi() { + return have_field_flags_hi; + } + + public boolean have_method_flags_hi() { + return have_method_flags_hi; + } + + public boolean have_code_flags_hi() { + return have_code_flags_hi; + } + + public void setIc_count(int ic_count) { + this.ic_count = ic_count; + } + + public void setClass_count(int class_count) { + this.class_count = class_count; + } + + private void writeCpCounts(OutputStream out) throws IOException, + Pack200Exception { + out.write(encodeScalar(cp_Utf8_count, Codec.UNSIGNED5)); + if ((archive_options & (1 << 1)) != 0) { // have_cp_numbers + out.write(encodeScalar(cp_Int_count, Codec.UNSIGNED5)); + out.write(encodeScalar(cp_Float_count, Codec.UNSIGNED5)); + out.write(encodeScalar(cp_Long_count, Codec.UNSIGNED5)); + out.write(encodeScalar(cp_Double_count, Codec.UNSIGNED5)); + } + out.write(encodeScalar(cp_String_count, Codec.UNSIGNED5)); + out.write(encodeScalar(cp_Class_count, Codec.UNSIGNED5)); + out.write(encodeScalar(cp_Signature_count, Codec.UNSIGNED5)); + out.write(encodeScalar(cp_Descr_count, Codec.UNSIGNED5)); + out.write(encodeScalar(cp_Field_count, Codec.UNSIGNED5)); + out.write(encodeScalar(cp_Method_count, Codec.UNSIGNED5)); + out.write(encodeScalar(cp_Imethod_count, Codec.UNSIGNED5)); + } + + private void writeClassCounts(OutputStream out) throws IOException, + Pack200Exception { + int default_class_minver = 0; + int default_class_majver = majverCounter.getMostCommon(); + out.write(encodeScalar(ic_count, Codec.UNSIGNED5)); + out.write(encodeScalar(default_class_minver, Codec.UNSIGNED5)); + out.write(encodeScalar(default_class_majver, Codec.UNSIGNED5)); + out.write(encodeScalar(class_count, Codec.UNSIGNED5)); + } + + private void writeArchiveSpecialCounts(OutputStream out) + throws IOException, Pack200Exception { + if ((archive_options & 1) > 0) { // have_special_formats + out.write(encodeScalar(band_headers.size(), Codec.UNSIGNED5)); + out.write(encodeScalar(attribute_definition_count, + Codec.UNSIGNED5)); + } + } + + private void writeArchiveFileCounts(OutputStream out) throws IOException, + Pack200Exception { + if ((archive_options & (1 << 4)) > 0) { // have_file_headers + out.write(encodeScalar(archive_size_hi, Codec.UNSIGNED5)); + out.write(encodeScalar(archive_size_lo, Codec.UNSIGNED5)); + out.write(encodeScalar(archive_next_count, Codec.UNSIGNED5)); + out.write(encodeScalar(archive_modtime, Codec.UNSIGNED5)); + out.write(encodeScalar(file_count, Codec.UNSIGNED5)); + } + } + + public void addMajorVersion(int major) { + majverCounter.add(major); + } + + /** + * Counter for major/minor class file numbers so we can work out the default + */ + private class Counter { + + private final int[] objs = new int[8]; + private final int[] counts = new int[8]; + private int length; + + public void add(int obj) { + boolean found = false; + for (int i = 0; i < length; i++) { + if (objs[i] == obj) { + counts[i]++; + found = true; + } + } + if (!found) { + objs[length] = obj; + counts[length] = 1; + length++; + if (length > objs.length - 1) { + Object[] newArray = new Object[objs.length + 8]; + System.arraycopy(objs, 0, newArray, 0, length); + } + } + } + + public int getMostCommon() { + int returnIndex = 0; + for (int i = 0; i < length; i++) { + if (counts[i] > counts[returnIndex]) { + returnIndex = i; + } + } + return objs[returnIndex]; + } + } + + public int getDefaultMinorVersion() { + return 0; + } + + public int getDefaultMajorVersion() { + return majverCounter.getMostCommon(); + } + + public boolean have_file_size_hi() { + return have_file_size_hi; + } + + public boolean have_file_modtime() { + return have_file_modtime; + } + + public boolean have_file_options() { + return have_file_options; + } + + public boolean have_all_code_flags() { + return have_all_code_flags; + } + + public void appendBandCodingSpecifier(int specifier) { + band_headers.add(specifier); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/Archive.java b/src/main/java/org/apache/harmony/unpack200/Archive.java new file mode 100644 index 0000000..a9a4933 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/Archive.java @@ -0,0 +1,245 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.jar.JarEntry; +import java.util.jar.JarInputStream; +import java.util.jar.JarOutputStream; +import java.util.zip.GZIPInputStream; + +import org.apache.harmony.pack200.Pack200Exception; + +/** + * Archive is the main entry point to unpack200. An archive is constructed with + * either two file names, a pack file and an output file name or an input stream + * and an output streams. Then unpack() is called, to unpack the + * pack200 archive. + */ +public class Archive { + + private InputStream inputStream; + + private final JarOutputStream outputStream; + + private boolean removePackFile; + + private int logLevel = Segment.LOG_LEVEL_STANDARD; + + private FileOutputStream logFile; + + private boolean overrideDeflateHint; + + private boolean deflateHint; + + private String inputFileName; + + private String outputFileName; + + /** + * Creates an Archive with the given input and output file names. + * + * @param inputFile + * @param outputFile + * @throws FileNotFoundException + * if the input file does not exist + * @throws IOException + */ + public Archive(String inputFile, String outputFile) + throws FileNotFoundException, IOException { + this.inputFileName = inputFile; + this.outputFileName = outputFile; + inputStream = new FileInputStream(inputFile); + outputStream = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(outputFile))); + } + + /** + * Creates an Archive with streams for the input and output files. Note: If + * you use this method then calling {@link #setRemovePackFile(boolean)} will + * have no effect. + * + * @param inputStream + * @param outputStream + * @throws IOException + */ + public Archive(InputStream inputStream, JarOutputStream outputStream) + throws IOException { + this.inputStream = inputStream; + this.outputStream = outputStream; + } + + /** + * Unpacks the Archive from the input file to the output file + * + * @throws Pack200Exception + * @throws IOException + */ + public void unpack() throws Pack200Exception, IOException { + outputStream.setComment("PACK200"); + try { + if (!inputStream.markSupported()) { + inputStream = new BufferedInputStream(inputStream); + if (!inputStream.markSupported()) + throw new IllegalStateException(); + } + inputStream.mark(2); + if (((inputStream.read() & 0xFF) | (inputStream.read() & 0xFF) << 8) == GZIPInputStream.GZIP_MAGIC) { + inputStream.reset(); + inputStream = new BufferedInputStream(new GZIPInputStream( + inputStream)); + } else { + inputStream.reset(); + } + inputStream.mark(4); + int[] magic = { 0xCA, 0xFE, 0xD0, 0x0D }; // Magic word for + // pack200 + int word[] = new int[4]; + for (int i = 0; i < word.length; i++) { + word[i] = inputStream.read(); + } + boolean compressedWithE0 = false; + for (int m = 0; m < magic.length; m++) { + if (word[m] != magic[m]) { + compressedWithE0 = true; + } + } + inputStream.reset(); + if (compressedWithE0) { // The original Jar was not packed, so just + // copy it across + JarInputStream jarInputStream = new JarInputStream(inputStream); + JarEntry jarEntry; + while ((jarEntry = jarInputStream.getNextJarEntry()) != null) { + outputStream.putNextEntry(jarEntry); + byte[] bytes = new byte[16384]; + int bytesRead = jarInputStream.read(bytes); + while (bytesRead != -1) { + outputStream.write(bytes, 0, bytesRead); + bytesRead = jarInputStream.read(bytes); + } + outputStream.closeEntry(); + } + } else { + int i = 0; + while (available(inputStream)) { + i++; + Segment segment = new Segment(); + segment.setLogLevel(logLevel); + segment + .setLogStream(logFile != null ? (OutputStream) logFile + : (OutputStream) System.out); + segment.setPreRead(false); + + if (i == 1) { + segment.log(Segment.LOG_LEVEL_VERBOSE, + "Unpacking from " + inputFileName + " to " + + outputFileName); + } + segment.log(Segment.LOG_LEVEL_VERBOSE, "Reading segment " + + i); + if (overrideDeflateHint) { + segment.overrideDeflateHint(deflateHint); + } + segment.unpack(inputStream, outputStream); + outputStream.flush(); + + if (inputStream instanceof FileInputStream) { + inputFileName = ((FileInputStream) inputStream).getFD() + .toString(); + } + } + } + } finally { + try { + inputStream.close(); + } catch (Exception e) { + } + try { + outputStream.close(); + } catch (Exception e) { + } + if (logFile != null) { + try { + logFile.close(); + } catch (Exception e) { + } + } + } + if (removePackFile) { + File file = new File(inputFileName); + boolean deleted = file.delete(); + if (!deleted) { + throw new Pack200Exception("Failed to delete the input file."); + } + } + } + + private boolean available(InputStream inputStream) throws IOException { + inputStream.mark(1); + int check = inputStream.read(); + inputStream.reset(); + return check != -1; + } + + /** + * If removePackFile is set to true, the input file is deleted after + * unpacking + * + * @param removePackFile + */ + public void setRemovePackFile(boolean removePackFile) { + this.removePackFile = removePackFile; + } + + public void setVerbose(boolean verbose) { + if (verbose) { + logLevel = Segment.LOG_LEVEL_VERBOSE; + } else if (logLevel == Segment.LOG_LEVEL_VERBOSE) { + logLevel = Segment.LOG_LEVEL_STANDARD; + } + } + + public void setQuiet(boolean quiet) { + if (quiet) { + logLevel = Segment.LOG_LEVEL_QUIET; + } else if (logLevel == Segment.LOG_LEVEL_QUIET) { + logLevel = Segment.LOG_LEVEL_QUIET; + } + } + + public void setLogFile(String logFileName) throws FileNotFoundException { + this.logFile = new FileOutputStream(logFileName); + } + + public void setLogFile(String logFileName, boolean append) + throws FileNotFoundException { + logFile = new FileOutputStream(logFileName, true); + } + + public void setDeflateHint(boolean deflateHint) { + overrideDeflateHint = true; + this.deflateHint = deflateHint; + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/AttrDefinitionBands.java b/src/main/java/org/apache/harmony/unpack200/AttrDefinitionBands.java new file mode 100644 index 0000000..709cd24 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/AttrDefinitionBands.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.AnnotationDefaultAttribute; +import org.apache.harmony.unpack200.bytecode.CodeAttribute; +import org.apache.harmony.unpack200.bytecode.ConstantValueAttribute; +import org.apache.harmony.unpack200.bytecode.DeprecatedAttribute; +import org.apache.harmony.unpack200.bytecode.EnclosingMethodAttribute; +import org.apache.harmony.unpack200.bytecode.ExceptionsAttribute; +import org.apache.harmony.unpack200.bytecode.InnerClassesAttribute; +import org.apache.harmony.unpack200.bytecode.LineNumberTableAttribute; +import org.apache.harmony.unpack200.bytecode.LocalVariableTableAttribute; +import org.apache.harmony.unpack200.bytecode.LocalVariableTypeTableAttribute; +import org.apache.harmony.unpack200.bytecode.SignatureAttribute; +import org.apache.harmony.unpack200.bytecode.SourceFileAttribute; + +/** + * Attribute definition bands are the set of bands used to define extra + * attributes transmitted in the archive. + */ +public class AttrDefinitionBands extends BandSet { + + private int[] attributeDefinitionHeader; + + private String[] attributeDefinitionLayout; + + private String[] attributeDefinitionName; + + private AttributeLayoutMap attributeDefinitionMap; + + private final String[] cpUTF8; + + public AttrDefinitionBands(Segment segment) { + super(segment); + this.cpUTF8 = segment.getCpBands().getCpUTF8(); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.BandSet#unpack(java.io.InputStream) + */ + public void read(InputStream in) throws IOException, Pack200Exception { + int attributeDefinitionCount = header.getAttributeDefinitionCount(); + attributeDefinitionHeader = decodeBandInt("attr_definition_headers", + in, Codec.BYTE1, attributeDefinitionCount); + attributeDefinitionName = parseReferences("attr_definition_name", in, + Codec.UNSIGNED5, attributeDefinitionCount, cpUTF8); + attributeDefinitionLayout = parseReferences("attr_definition_layout", + in, Codec.UNSIGNED5, attributeDefinitionCount, cpUTF8); + + attributeDefinitionMap = new AttributeLayoutMap(); + + int overflowIndex = 32; + if (segment.getSegmentHeader().getOptions().hasClassFlagsHi()) { + overflowIndex = 63; + } + for (int i = 0; i < attributeDefinitionCount; i++) { + int context = attributeDefinitionHeader[i] & 0x03; + int index = (attributeDefinitionHeader[i] >> 2) - 1; + if (index == -1) { + index = overflowIndex++; + } + AttributeLayout layout = new AttributeLayout( + attributeDefinitionName[i], context, + attributeDefinitionLayout[i], index, false); + NewAttributeBands newBands = new NewAttributeBands(segment, layout); + attributeDefinitionMap.add(layout, newBands); + } + attributeDefinitionMap.checkMap(); + setupDefaultAttributeNames(); + } + + public void unpack() throws Pack200Exception, IOException { + + } + + private void setupDefaultAttributeNames() { + AnnotationDefaultAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("AnnotationDefault")); //$NON-NLS-1$ + CodeAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("Code")); //$NON-NLS-1$ + ConstantValueAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("ConstantValue")); //$NON-NLS-1$ + DeprecatedAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("Deprecated")); //$NON-NLS-1$ + EnclosingMethodAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("EnclosingMethod")); //$NON-NLS-1$ + ExceptionsAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("Exceptions")); //$NON-NLS-1$ + InnerClassesAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("InnerClasses")); //$NON-NLS-1$ + LineNumberTableAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("LineNumberTable")); //$NON-NLS-1$ + LocalVariableTableAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("LocalVariableTable")); //$NON-NLS-1$ + LocalVariableTypeTableAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("LocalVariableTypeTable")); //$NON-NLS-1$ + SignatureAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("Signature")); //$NON-NLS-1$ + SourceFileAttribute.setAttributeName(segment.getCpBands().cpUTF8Value("SourceFile")); //$NON-NLS-1$ + MetadataBandGroup.setRvaAttributeName(segment.getCpBands().cpUTF8Value("RuntimeVisibleAnnotations")); + MetadataBandGroup.setRiaAttributeName(segment.getCpBands().cpUTF8Value("RuntimeInvisibleAnnotations")); + MetadataBandGroup.setRvpaAttributeName(segment.getCpBands().cpUTF8Value("RuntimeVisibleParameterAnnotations")); + MetadataBandGroup.setRipaAttributeName(segment.getCpBands().cpUTF8Value("RuntimeInvisibleParameterAnnotations")); + } + + public AttributeLayoutMap getAttributeDefinitionMap() { + return attributeDefinitionMap; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/AttributeLayout.java b/src/main/java/org/apache/harmony/unpack200/AttributeLayout.java new file mode 100644 index 0000000..c263963 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/AttributeLayout.java @@ -0,0 +1,286 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; + +/** + * AttributeLayout defines a layout that describes how an attribute will be + * transmitted. + */ +public class AttributeLayout implements IMatcher { + + public static final String ACC_ABSTRACT = "ACC_ABSTRACT"; //$NON-NLS-1$ + public static final String ACC_ANNOTATION = "ACC_ANNOTATION"; //$NON-NLS-1$ + public static final String ACC_ENUM = "ACC_ENUM"; //$NON-NLS-1$ + public static final String ACC_FINAL = "ACC_FINAL"; //$NON-NLS-1$ + public static final String ACC_INTERFACE = "ACC_INTERFACE"; //$NON-NLS-1$ + public static final String ACC_NATIVE = "ACC_NATIVE"; //$NON-NLS-1$ + public static final String ACC_PRIVATE = "ACC_PRIVATE"; //$NON-NLS-1$ + public static final String ACC_PROTECTED = "ACC_PROTECTED"; //$NON-NLS-1$ + public static final String ACC_PUBLIC = "ACC_PUBLIC"; //$NON-NLS-1$ + public static final String ACC_STATIC = "ACC_STATIC"; //$NON-NLS-1$ + public static final String ACC_STRICT = "ACC_STRICT"; //$NON-NLS-1$ + public static final String ACC_SYNCHRONIZED = "ACC_SYNCHRONIZED"; //$NON-NLS-1$ + public static final String ACC_SYNTHETIC = "ACC_SYNTHETIC"; //$NON-NLS-1$ + public static final String ACC_TRANSIENT = "ACC_TRANSIENT"; //$NON-NLS-1$ + public static final String ACC_VOLATILE = "ACC_VOLATILE"; //$NON-NLS-1$ + public static final String ATTRIBUTE_ANNOTATION_DEFAULT = "AnnotationDefault"; //$NON-NLS-1$ + public static final String ATTRIBUTE_CLASS_FILE_VERSION = "class-file version"; //$NON-NLS-1$ + public static final String ATTRIBUTE_CODE = "Code"; //$NON-NLS-1$ + public static final String ATTRIBUTE_CONSTANT_VALUE = "ConstantValue"; //$NON-NLS-1$ + public static final String ATTRIBUTE_DEPRECATED = "Deprecated"; //$NON-NLS-1$ + public static final String ATTRIBUTE_ENCLOSING_METHOD = "EnclosingMethod"; //$NON-NLS-1$ + public static final String ATTRIBUTE_EXCEPTIONS = "Exceptions"; //$NON-NLS-1$ + public static final String ATTRIBUTE_INNER_CLASSES = "InnerClasses"; //$NON-NLS-1$ + public static final String ATTRIBUTE_LINE_NUMBER_TABLE = "LineNumberTable"; //$NON-NLS-1$ + public static final String ATTRIBUTE_LOCAL_VARIABLE_TABLE = "LocalVariableTable"; //$NON-NLS-1$ + public static final String ATTRIBUTE_LOCAL_VARIABLE_TYPE_TABLE = "LocalVariableTypeTable"; //$NON-NLS-1$ + public static final String ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS = "RuntimeInvisibleAnnotations"; //$NON-NLS-1$ + public static final String ATTRIBUTE_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS = "RuntimeInvisibleParameterAnnotations"; //$NON-NLS-1$ + public static final String ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS = "RuntimeVisibleAnnotations"; //$NON-NLS-1$ + public static final String ATTRIBUTE_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = "RuntimeVisibleParameterAnnotations"; //$NON-NLS-1$ + public static final String ATTRIBUTE_SIGNATURE = "Signature"; //$NON-NLS-1$ + public static final String ATTRIBUTE_SOURCE_FILE = "SourceFile"; //$NON-NLS-1$ + public static final int CONTEXT_CLASS = 0; + public static final int CONTEXT_CODE = 3; + public static final int CONTEXT_FIELD = 1; + public static final int CONTEXT_METHOD = 2; + public static final String[] contextNames = { "Class", "Field", "Method", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "Code", }; //$NON-NLS-1$ + + private static ClassFileEntry getValue(String layout, long value, + SegmentConstantPool pool) throws Pack200Exception { + if (layout.startsWith("R")) { //$NON-NLS-1$ + // references + if (layout.indexOf('N') != -1) + value--; + if (layout.startsWith("RU")) { //$NON-NLS-1$ + return pool.getValue(SegmentConstantPool.UTF_8, value); + } else if (layout.startsWith("RS")) { //$NON-NLS-1$ + return pool.getValue(SegmentConstantPool.SIGNATURE, value); + } + } else if (layout.startsWith("K")) { //$NON-NLS-1$ + char type = layout.charAt(1); + switch (type) { + case 'S': // String + return pool.getValue(SegmentConstantPool.CP_STRING, value); + case 'I': // Int (or byte or short) + case 'C': // Char + return pool.getValue(SegmentConstantPool.CP_INT, value); + case 'F': // Float + return pool.getValue(SegmentConstantPool.CP_FLOAT, value); + case 'J': // Long + return pool.getValue(SegmentConstantPool.CP_LONG, value); + case 'D': // Double + return pool.getValue(SegmentConstantPool.CP_DOUBLE, value); + } + } + throw new Pack200Exception("Unknown layout encoding: " + layout); + } + + private final int context; + + private final int index; + + private final String layout; + + private long mask; + + private final String name; + private final boolean isDefault; + private int backwardsCallCount; + + /** + * Construct a default AttributeLayout (equivalent to + * new AttributeLayout(name, context, layout, index, true);) + * + * @param name + * @param context + * @param layout + * @param index + * @throws Pack200Exception + */ + public AttributeLayout(String name, int context, String layout, int index) + throws Pack200Exception { + this(name, context, layout, index, true); + } + + public AttributeLayout(String name, int context, String layout, int index, + boolean isDefault) throws Pack200Exception { + super(); + this.index = index; + this.context = context; + if (index >= 0) { + this.mask = 1L << index; + } else { + this.mask = 0; + } + if (context != CONTEXT_CLASS && context != CONTEXT_CODE + && context != CONTEXT_FIELD && context != CONTEXT_METHOD) + throw new Pack200Exception("Attribute context out of range: " + + context); + if (layout == null) // || layout.length() == 0) + throw new Pack200Exception("Cannot have a null layout"); + if (name == null || name.length() == 0) + throw new Pack200Exception("Cannot have an unnamed layout"); + this.name = name; + this.layout = layout; + this.isDefault = isDefault; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final AttributeLayout other = (AttributeLayout) obj; + if (layout == null) { + if (other.layout != null) + return false; + } else if (!layout.equals(other.layout)) + return false; + if (index != other.index) + return false; + if (context != other.context) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + public Codec getCodec() { + if (layout.indexOf('O') >= 0) { + return Codec.BRANCH5; + } else if (layout.indexOf('P') >= 0) { + return Codec.BCI5; + } else if (layout.indexOf('S') >= 0 && layout.indexOf("KS") < 0 //$NON-NLS-1$ + && layout.indexOf("RS") < 0) { //$NON-NLS-1$ + return Codec.SIGNED5; + } else if (layout.indexOf('B') >= 0) { + return Codec.BYTE1; + } else { + return Codec.UNSIGNED5; + } + } + + public String getLayout() { + return layout; + } + + public ClassFileEntry getValue(long value, SegmentConstantPool pool) + throws Pack200Exception { + return getValue(layout, value, pool); + } + + public ClassFileEntry getValue(long value, String type, SegmentConstantPool pool) + throws Pack200Exception { + // TODO This really needs to be better tested, esp. the different types + // TODO This should have the ability to deal with RUN stuff too, and + // unions + if (layout.startsWith("KQ")) { //$NON-NLS-1$ + if (type.equals("Ljava/lang/String;")) { //$NON-NLS-1$ + ClassFileEntry value2 = getValue("KS", value, pool); //$NON-NLS-1$ + return value2; + } else { + return getValue("K" + type + layout.substring(2), value, //$NON-NLS-1$ + pool); + } + } else { + return getValue(layout, value, pool); + } + } + + public int hashCode() { + int PRIME = 31; + int r = 1; + if (name != null) { + r = r * PRIME + name.hashCode(); + } + if (layout != null) { + r = r * PRIME + layout.hashCode(); + } + r = r * PRIME + index; + r = r * PRIME + context; + return r; + } + + public boolean isClass() { + return context == CONTEXT_CLASS; + } + + public boolean isCode() { + return context == CONTEXT_CODE; + } + + public boolean isField() { + return context == CONTEXT_FIELD; + } + + public boolean isMethod() { + return context == CONTEXT_METHOD; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.IMatches#matches(long) + */ + public boolean matches(long value) { + return (value & mask) != 0; + } + + public String toString() { + return contextNames[context] + ": " + name; + } + + public int getContext() { + return context; + } + + public int getIndex() { + return index; + } + + public String getName() { + return name; + } + + public int numBackwardsCallables() { + if (layout == "*") { + return 1; + } else { + return backwardsCallCount; + } + } + + public boolean isDefaultLayout() { + return isDefault; + } + + public void setBackwardsCallCount(int backwardsCallCount) { + this.backwardsCallCount = backwardsCallCount; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/AttributeLayoutMap.java b/src/main/java/org/apache/harmony/unpack200/AttributeLayoutMap.java new file mode 100644 index 0000000..bc8c839 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/AttributeLayoutMap.java @@ -0,0 +1,284 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.harmony.pack200.Pack200Exception; + +/** + * Stores a mapping from attribute names to their corresponding layout types. + * Note that names of attribute layouts and their formats are not + * internationalized, and should not be translated. + */ +public class AttributeLayoutMap { + + // Create all the default AttributeLayouts here + private static AttributeLayout[] getDefaultAttributeLayouts() + throws Pack200Exception { + return new AttributeLayout[] { + new AttributeLayout(AttributeLayout.ACC_PUBLIC, + AttributeLayout.CONTEXT_CLASS, "", 0), + new AttributeLayout(AttributeLayout.ACC_PUBLIC, + AttributeLayout.CONTEXT_FIELD, "", 0), + new AttributeLayout(AttributeLayout.ACC_PUBLIC, + AttributeLayout.CONTEXT_METHOD, "", 0), + new AttributeLayout(AttributeLayout.ACC_PRIVATE, + AttributeLayout.CONTEXT_CLASS, "", 1), + new AttributeLayout(AttributeLayout.ACC_PRIVATE, + AttributeLayout.CONTEXT_FIELD, "", 1), + new AttributeLayout(AttributeLayout.ACC_PRIVATE, + AttributeLayout.CONTEXT_METHOD, "", 1), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_LINE_NUMBER_TABLE, + AttributeLayout.CONTEXT_CODE, "NH[PHH]", 1), + + new AttributeLayout(AttributeLayout.ACC_PROTECTED, + AttributeLayout.CONTEXT_CLASS, "", 2), + new AttributeLayout(AttributeLayout.ACC_PROTECTED, + AttributeLayout.CONTEXT_FIELD, "", 2), + new AttributeLayout(AttributeLayout.ACC_PROTECTED, + AttributeLayout.CONTEXT_METHOD, "", 2), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_LOCAL_VARIABLE_TABLE, + AttributeLayout.CONTEXT_CODE, "NH[PHOHRUHRSHH]", 2), + + new AttributeLayout(AttributeLayout.ACC_STATIC, + AttributeLayout.CONTEXT_CLASS, "", 3), + new AttributeLayout(AttributeLayout.ACC_STATIC, + AttributeLayout.CONTEXT_FIELD, "", 3), + new AttributeLayout(AttributeLayout.ACC_STATIC, + AttributeLayout.CONTEXT_METHOD, "", 3), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_LOCAL_VARIABLE_TYPE_TABLE, + AttributeLayout.CONTEXT_CODE, "NH[PHOHRUHRSHH]", 3), + + new AttributeLayout(AttributeLayout.ACC_FINAL, + AttributeLayout.CONTEXT_CLASS, "", 4), + new AttributeLayout(AttributeLayout.ACC_FINAL, + AttributeLayout.CONTEXT_FIELD, "", 4), + new AttributeLayout(AttributeLayout.ACC_FINAL, + AttributeLayout.CONTEXT_METHOD, "", 4), + new AttributeLayout(AttributeLayout.ACC_SYNCHRONIZED, + AttributeLayout.CONTEXT_CLASS, "", 5), + new AttributeLayout(AttributeLayout.ACC_SYNCHRONIZED, + AttributeLayout.CONTEXT_FIELD, "", 5), + new AttributeLayout(AttributeLayout.ACC_SYNCHRONIZED, + AttributeLayout.CONTEXT_METHOD, "", 5), + new AttributeLayout(AttributeLayout.ACC_VOLATILE, + AttributeLayout.CONTEXT_CLASS, "", 6), + new AttributeLayout(AttributeLayout.ACC_VOLATILE, + AttributeLayout.CONTEXT_FIELD, "", 6), + new AttributeLayout(AttributeLayout.ACC_VOLATILE, + AttributeLayout.CONTEXT_METHOD, "", 6), + new AttributeLayout(AttributeLayout.ACC_TRANSIENT, + AttributeLayout.CONTEXT_CLASS, "", 7), + new AttributeLayout(AttributeLayout.ACC_TRANSIENT, + AttributeLayout.CONTEXT_FIELD, "", 7), + new AttributeLayout(AttributeLayout.ACC_TRANSIENT, + AttributeLayout.CONTEXT_METHOD, "", 7), + new AttributeLayout(AttributeLayout.ACC_NATIVE, + AttributeLayout.CONTEXT_CLASS, "", 8), + new AttributeLayout(AttributeLayout.ACC_NATIVE, + AttributeLayout.CONTEXT_FIELD, "", 8), + new AttributeLayout(AttributeLayout.ACC_NATIVE, + AttributeLayout.CONTEXT_METHOD, "", 8), + new AttributeLayout(AttributeLayout.ACC_INTERFACE, + AttributeLayout.CONTEXT_CLASS, "", 9), + new AttributeLayout(AttributeLayout.ACC_INTERFACE, + AttributeLayout.CONTEXT_FIELD, "", 9), + new AttributeLayout(AttributeLayout.ACC_INTERFACE, + AttributeLayout.CONTEXT_METHOD, "", 9), + new AttributeLayout(AttributeLayout.ACC_ABSTRACT, + AttributeLayout.CONTEXT_CLASS, "", 10), + new AttributeLayout(AttributeLayout.ACC_ABSTRACT, + AttributeLayout.CONTEXT_FIELD, "", 10), + new AttributeLayout(AttributeLayout.ACC_ABSTRACT, + AttributeLayout.CONTEXT_METHOD, "", 10), + new AttributeLayout(AttributeLayout.ACC_STRICT, + AttributeLayout.CONTEXT_CLASS, "", 11), + new AttributeLayout(AttributeLayout.ACC_STRICT, + AttributeLayout.CONTEXT_FIELD, "", 11), + new AttributeLayout(AttributeLayout.ACC_STRICT, + AttributeLayout.CONTEXT_METHOD, "", 11), + new AttributeLayout(AttributeLayout.ACC_SYNTHETIC, + AttributeLayout.CONTEXT_CLASS, "", 12), + new AttributeLayout(AttributeLayout.ACC_SYNTHETIC, + AttributeLayout.CONTEXT_FIELD, "", 12), + new AttributeLayout(AttributeLayout.ACC_SYNTHETIC, + AttributeLayout.CONTEXT_METHOD, "", 12), + new AttributeLayout(AttributeLayout.ACC_ANNOTATION, + AttributeLayout.CONTEXT_CLASS, "", 13), + new AttributeLayout(AttributeLayout.ACC_ANNOTATION, + AttributeLayout.CONTEXT_FIELD, "", 13), + new AttributeLayout(AttributeLayout.ACC_ANNOTATION, + AttributeLayout.CONTEXT_METHOD, "", 13), + new AttributeLayout(AttributeLayout.ACC_ENUM, + AttributeLayout.CONTEXT_CLASS, "", 14), + new AttributeLayout(AttributeLayout.ACC_ENUM, + AttributeLayout.CONTEXT_FIELD, "", 14), + new AttributeLayout(AttributeLayout.ACC_ENUM, + AttributeLayout.CONTEXT_METHOD, "", 14), + new AttributeLayout(AttributeLayout.ATTRIBUTE_SOURCE_FILE, + AttributeLayout.CONTEXT_CLASS, "RUNH", 17), + new AttributeLayout(AttributeLayout.ATTRIBUTE_CONSTANT_VALUE, + AttributeLayout.CONTEXT_FIELD, "KQH", 17), + new AttributeLayout(AttributeLayout.ATTRIBUTE_CODE, + AttributeLayout.CONTEXT_METHOD, "", 17), + new AttributeLayout(AttributeLayout.ATTRIBUTE_ENCLOSING_METHOD, + AttributeLayout.CONTEXT_CLASS, "RCHRDNH", 18), + new AttributeLayout(AttributeLayout.ATTRIBUTE_EXCEPTIONS, + AttributeLayout.CONTEXT_METHOD, "NH[RCH]", 18), + new AttributeLayout(AttributeLayout.ATTRIBUTE_SIGNATURE, + AttributeLayout.CONTEXT_CLASS, "RSH", 19), + new AttributeLayout(AttributeLayout.ATTRIBUTE_SIGNATURE, + AttributeLayout.CONTEXT_FIELD, "RSH", 19), + new AttributeLayout(AttributeLayout.ATTRIBUTE_SIGNATURE, + AttributeLayout.CONTEXT_METHOD, "RSH", 19), + new AttributeLayout(AttributeLayout.ATTRIBUTE_DEPRECATED, + AttributeLayout.CONTEXT_CLASS, "", 20), + new AttributeLayout(AttributeLayout.ATTRIBUTE_DEPRECATED, + AttributeLayout.CONTEXT_FIELD, "", 20), + new AttributeLayout(AttributeLayout.ATTRIBUTE_DEPRECATED, + AttributeLayout.CONTEXT_METHOD, "", 20), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_CLASS, "*", 21), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_FIELD, "*", 21), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_METHOD, "*", 21), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_CLASS, "*", 22), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_FIELD, "*", 22), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_METHOD, "*", 22), + new AttributeLayout(AttributeLayout.ATTRIBUTE_INNER_CLASSES, + AttributeLayout.CONTEXT_CLASS, "", 23), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, + AttributeLayout.CONTEXT_METHOD, "*", 23), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_CLASS_FILE_VERSION, + AttributeLayout.CONTEXT_CLASS, "", 24), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS, + AttributeLayout.CONTEXT_METHOD, "*", 24), + new AttributeLayout( + AttributeLayout.ATTRIBUTE_ANNOTATION_DEFAULT, + AttributeLayout.CONTEXT_METHOD, "*", 25) }; + } + + private final Map classLayouts = new HashMap(); + private final Map fieldLayouts = new HashMap(); + private final Map methodLayouts = new HashMap(); + private final Map codeLayouts = new HashMap(); + + // The order of the maps in this array should not be changed as their + // indices correspond to + // the value of their context constants (AttributeLayout.CONTEXT_CLASS etc.) + private final Map[] layouts = new Map[] { classLayouts, fieldLayouts, + methodLayouts, codeLayouts }; + + private final Map layoutsToBands = new HashMap(); + + public AttributeLayoutMap() throws Pack200Exception { + AttributeLayout[] defaultAttributeLayouts = getDefaultAttributeLayouts(); + for (int i = 0; i < defaultAttributeLayouts.length; i++) { + add(defaultAttributeLayouts[i]); + } + } + + public void add(AttributeLayout layout) { + layouts[layout.getContext()] + .put(new Integer(layout.getIndex()), layout); + } + + public void add(AttributeLayout layout, NewAttributeBands newBands) { + add(layout); + layoutsToBands.put(layout, newBands); + } + + public AttributeLayout getAttributeLayout(String name, int context) + throws Pack200Exception { + Map map = layouts[context]; + for (Iterator iter = map.values().iterator(); iter.hasNext();) { + AttributeLayout layout = (AttributeLayout) iter.next(); + if (layout.getName().equals(name)) { + return layout; + } + } + return null; + } + + public AttributeLayout getAttributeLayout(int index, int context) + throws Pack200Exception { + Map map = layouts[context]; + return (AttributeLayout) map.get(new Integer(index)); + } + + /** + * The map should not contain the same layout and name combination more than + * once for each context. + * + * @throws Pack200Exception + * + */ + public void checkMap() throws Pack200Exception { + for (int i = 0; i < layouts.length; i++) { + Map map = layouts[i]; + Collection c = map.values(); + if (!(c instanceof List)) { + c = new ArrayList(c); + } + List l = (List) c; + for (int j = 0; j < l.size(); j++) { + AttributeLayout layout1 = (AttributeLayout) l.get(j); + for (int j2 = j + 1; j2 < l.size(); j2++) { + AttributeLayout layout2 = (AttributeLayout) l.get(j2); + if (layout1.getName().equals(layout2.getName()) + && layout1.getLayout().equals(layout2.getLayout())) { + throw new Pack200Exception( + "Same layout/name combination: " + + layout1.getLayout() + + "/" + + layout1.getName() + + " exists twice for context: " + + AttributeLayout.contextNames[layout1 + .getContext()]); + } + } + } + } + } + + public NewAttributeBands getAttributeBands(AttributeLayout layout) { + return (NewAttributeBands) layoutsToBands.get(layout); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/BandSet.java b/src/main/java/org/apache/harmony/unpack200/BandSet.java new file mode 100644 index 0000000..1037100 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/BandSet.java @@ -0,0 +1,551 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; + +import org.apache.harmony.pack200.BHSDCodec; +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.CodecEncoding; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.pack200.PopulationCodec; +import org.apache.harmony.unpack200.bytecode.CPClass; +import org.apache.harmony.unpack200.bytecode.CPDouble; +import org.apache.harmony.unpack200.bytecode.CPFieldRef; +import org.apache.harmony.unpack200.bytecode.CPFloat; +import org.apache.harmony.unpack200.bytecode.CPInteger; +import org.apache.harmony.unpack200.bytecode.CPInterfaceMethodRef; +import org.apache.harmony.unpack200.bytecode.CPLong; +import org.apache.harmony.unpack200.bytecode.CPMethodRef; +import org.apache.harmony.unpack200.bytecode.CPNameAndType; +import org.apache.harmony.unpack200.bytecode.CPString; +import org.apache.harmony.unpack200.bytecode.CPUTF8; + +/** + * Abstract superclass for a set of bands + */ +public abstract class BandSet { + + public abstract void read(InputStream inputStream) throws IOException, + Pack200Exception; + + public abstract void unpack() throws IOException, Pack200Exception; + + public void unpack(InputStream in) throws IOException, Pack200Exception { + read(in); + unpack(); + } + + protected Segment segment; + + protected SegmentHeader header; + + public BandSet(Segment segment) { + this.segment = segment; + this.header = segment.getSegmentHeader(); + } + + /** + * Decode a band and return an array of int values + * + * @param name + * the name of the band (primarily for logging/debugging + * purposes) + * @param in + * the InputStream to decode from + * @param codec + * the default Codec for this band + * @param count + * the number of elements to read + * @return an array of decoded int values + * @throws IOException + * if there is a problem reading from the underlying input + * stream + * @throws Pack200Exception + * if there is a problem decoding the value or that the value is + * invalid + */ + public int[] decodeBandInt(String name, InputStream in, BHSDCodec codec, + int count) throws IOException, Pack200Exception { + int[] band; + // Useful for debugging +// if(count > 0) { +// System.out.println("decoding " + name + " " + count); +// } + Codec codecUsed = codec; + if (codec.getB() == 1 || count == 0) { + return codec.decodeInts(count, in); + } + int[] getFirst = codec.decodeInts(1, in); + if (getFirst.length == 0) { + return getFirst; + } + int first = getFirst[0]; + if (codec.isSigned() && first >= -256 && first <= -1) { + // Non-default codec should be used + codecUsed = CodecEncoding.getCodec((-1 - first), header + .getBandHeadersInputStream(), codec); + band = codecUsed.decodeInts(count, in); + } else if (!codec.isSigned() && first >= codec.getL() + && first <= codec.getL() + 255) { + // Non-default codec should be used + codecUsed = CodecEncoding.getCodec(first - codec.getL(), header + .getBandHeadersInputStream(), codec); + band = codecUsed.decodeInts(count, in); + } else { + // First element should not be discarded + band = codec.decodeInts(count - 1, in, first); + } + // Useful for debugging -E options: + //if(!codecUsed.equals(codec)) { + // int bytes = codecUsed.lastBandLength; + // System.out.println(count + " " + name + " encoded with " + codecUsed + " " + bytes); + //} + if (codecUsed instanceof PopulationCodec) { + PopulationCodec popCodec = (PopulationCodec) codecUsed; + int[] favoured = (int[]) popCodec.getFavoured().clone(); + Arrays.sort(favoured); + for (int i = 0; i < band.length; i++) { + boolean favouredValue = Arrays.binarySearch(favoured, band[i]) > -1; + Codec theCodec = favouredValue ? popCodec.getFavouredCodec() + : popCodec.getUnfavouredCodec(); + if (theCodec instanceof BHSDCodec + && ((BHSDCodec) theCodec).isDelta()) { + BHSDCodec bhsd = (BHSDCodec) theCodec; + long cardinality = bhsd.cardinality(); + while (band[i] > bhsd.largest()) { + band[i] -= cardinality; + } + while (band[i] < bhsd.smallest()) { + band[i] += cardinality; + } + } + } + } + return band; + } + + /** + * Decode a band and return an array of int[] values + * + * @param name + * the name of the band (primarily for logging/debugging + * purposes) + * @param in + * the InputStream to decode from + * @param defaultCodec + * the default codec for this band + * @param counts + * the numbers of elements to read for each int array within the + * array to be returned + * @return an array of decoded int[] values + * @throws IOException + * if there is a problem reading from the underlying input + * stream + * @throws Pack200Exception + * if there is a problem decoding the value or that the value is + * invalid + */ + public int[][] decodeBandInt(String name, InputStream in, + BHSDCodec defaultCodec, int[] counts) throws IOException, + Pack200Exception { + int[][] result = new int[counts.length][]; + int totalCount = 0; + for (int i = 0; i < counts.length; i++) { + totalCount += counts[i]; + } + int[] twoDResult = decodeBandInt(name, in, defaultCodec, totalCount); + int index = 0; + for (int i = 0; i < result.length; i++) { + result[i] = new int[counts[i]]; + for (int j = 0; j < result[i].length; j++) { + result[i][j] = twoDResult[index]; + index++; + } + } + return result; + } + + public long[] parseFlags(String name, InputStream in, int count, + BHSDCodec codec, boolean hasHi) throws IOException, + Pack200Exception { + return parseFlags(name, in, new int[] { count }, + (hasHi ? codec : null), codec)[0]; + } + + public long[][] parseFlags(String name, InputStream in, int counts[], + BHSDCodec codec, boolean hasHi) throws IOException, + Pack200Exception { + return parseFlags(name, in, counts, (hasHi ? codec : null), codec); + } + + public long[] parseFlags(String name, InputStream in, int count, + BHSDCodec hiCodec, BHSDCodec loCodec) throws IOException, + Pack200Exception { + return parseFlags(name, in, new int[] { count }, hiCodec, loCodec)[0]; + } + + public long[][] parseFlags(String name, InputStream in, int counts[], + BHSDCodec hiCodec, BHSDCodec loCodec) throws IOException, + Pack200Exception { + int count = counts.length; + if (count == 0) { + return new long[][] { {} }; + } + int sum = 0; + long[][] result = new long[count][]; + for (int i = 0; i < count; i++) { + result[i] = new long[counts[i]]; + sum += counts[i]; + } + int[] hi = null; + int[] lo; + if (hiCodec != null) { + hi = decodeBandInt(name, in, hiCodec, sum); + lo = decodeBandInt(name, in, loCodec, sum); + } else { + lo = decodeBandInt(name, in, loCodec, sum); + } + + int index = 0; + for (int i = 0; i < result.length; i++) { + for (int j = 0; j < result[i].length; j++) { + if (hi != null) { + result[i][j] = ((long) hi[index] << 32) + | (lo[index] & 4294967295L); + } else { + result[i][j] = lo[index]; + } + index++; + } + } + return result; + } + + /** + * Helper method to parse count references from in, + * using codec to decode the values as indexes into + * reference (which is populated prior to this call). An + * exception is thrown if a decoded index falls outside the range + * [0..reference.length-1]. + * + * @param name + * the band name + * @param in + * the input stream to read from + * @param codec + * the BHSDCodec to use for decoding + * @param count + * the number of references to decode + * @param reference + * the array of values to use for the references + * + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * Codec + */ + public String[] parseReferences(String name, InputStream in, + BHSDCodec codec, int count, String[] reference) throws IOException, + Pack200Exception { + return parseReferences(name, in, codec, new int[] { count }, reference)[0]; + } + + /** + * Helper method to parse count references from in, + * using codec to decode the values as indexes into + * reference (which is populated prior to this call). An + * exception is thrown if a decoded index falls outside the range + * [0..reference.length-1]. Unlike the other parseReferences, this + * post-processes the result into an array of results. + * + * @param name + * TODO + * @param in + * the input stream to read from + * @param codec + * the BHSDCodec to use for decoding + * @param counts + * the numbers of references to decode for each array entry + * @param reference + * the array of values to use for the references + * + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * Codec + */ + public String[][] parseReferences(String name, InputStream in, + BHSDCodec codec, int counts[], String[] reference) + throws IOException, Pack200Exception { + int count = counts.length; + if (count == 0) { + return new String[][] { {} }; + } + String[][] result = new String[count][]; + int sum = 0; + for (int i = 0; i < count; i++) { + result[i] = new String[counts[i]]; + sum += counts[i]; + } + // TODO Merge the decode and parsing of a multiple structure into one + String[] result1 = new String[sum]; + int[] indices = decodeBandInt(name, in, codec, sum); + for (int i1 = 0; i1 < sum; i1++) { + int index = indices[i1]; + if (index < 0 || index >= reference.length) + throw new Pack200Exception( + "Something has gone wrong during parsing references, index = " + + index + ", array size = " + reference.length); + result1[i1] = reference[index]; + } + String[] refs = result1; + // TODO Merge the decode and parsing of a multiple structure into one + int pos = 0; + for (int i = 0; i < count; i++) { + int num = counts[i]; + result[i] = new String[num]; + System.arraycopy(refs, pos, result[i], 0, num); + pos += num; + } + return result; + } + + public CPInteger[] parseCPIntReferences(String name, InputStream in, + BHSDCodec codec, int count) throws IOException, Pack200Exception { + int[] reference = segment.getCpBands().getCpInt(); + int[] indices = decodeBandInt(name, in, codec, count); + CPInteger[] result = new CPInteger[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + if (index < 0 || index >= reference.length) + throw new Pack200Exception( + "Something has gone wrong during parsing references, index = " + + index + ", array size = " + reference.length); + result[i1] = segment.getCpBands().cpIntegerValue(index); + } + return result; + } + + public CPDouble[] parseCPDoubleReferences(String name, InputStream in, + BHSDCodec codec, int count) throws IOException, Pack200Exception { + int[] indices = decodeBandInt(name, in, codec, count); + CPDouble[] result = new CPDouble[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + result[i1] = segment.getCpBands().cpDoubleValue(index); + } + return result; + } + + public CPFloat[] parseCPFloatReferences(String name, InputStream in, + BHSDCodec codec, int count) throws IOException, Pack200Exception { + int[] indices = decodeBandInt(name, in, codec, count); + CPFloat[] result = new CPFloat[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + result[i1] = segment.getCpBands().cpFloatValue(index); + } + return result; + } + + public CPLong[] parseCPLongReferences(String name, InputStream in, + BHSDCodec codec, int count) throws IOException, Pack200Exception { + long[] reference = segment.getCpBands().getCpLong(); + int[] indices = decodeBandInt(name, in, codec, count); + CPLong[] result = new CPLong[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + if (index < 0 || index >= reference.length) + throw new Pack200Exception( + "Something has gone wrong during parsing references, index = " + + index + ", array size = " + reference.length); + result[i1] = segment.getCpBands().cpLongValue(index); + } + return result; + } + + public CPUTF8[] parseCPUTF8References(String name, InputStream in, + BHSDCodec codec, int count) throws IOException, Pack200Exception { + int[] indices = decodeBandInt(name, in, codec, count); + CPUTF8[] result = new CPUTF8[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + result[i1] = segment.getCpBands().cpUTF8Value(index); + } + return result; + } + + public CPUTF8[][] parseCPUTF8References(String name, InputStream in, + BHSDCodec codec, int[] counts) throws IOException, Pack200Exception { + CPUTF8[][] result = new CPUTF8[counts.length][]; + int sum = 0; + for (int i = 0; i < counts.length; i++) { + result[i] = new CPUTF8[counts[i]]; + sum += counts[i]; + } + CPUTF8[] result1 = new CPUTF8[sum]; + int[] indices = decodeBandInt(name, in, codec, sum); + for (int i1 = 0; i1 < sum; i1++) { + int index = indices[i1]; + result1[i1] = segment.getCpBands().cpUTF8Value(index); + } + CPUTF8[] refs = result1; + int pos = 0; + for (int i = 0; i < counts.length; i++) { + int num = counts[i]; + result[i] = new CPUTF8[num]; + System.arraycopy(refs, pos, result[i], 0, num); + pos += num; + } + return result; + } + + public CPString[] parseCPStringReferences(String name, InputStream in, + BHSDCodec codec, int count) throws IOException, Pack200Exception { + int[] indices = decodeBandInt(name, in, codec, count); + CPString[] result = new CPString[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + result[i1] = segment.getCpBands().cpStringValue(index); + } + return result; + } + + public CPInterfaceMethodRef[] parseCPInterfaceMethodRefReferences( + String name, InputStream in, BHSDCodec codec, int count) + throws IOException, Pack200Exception { + CpBands cpBands = segment.getCpBands(); + int[] indices = decodeBandInt(name, in, codec, count); + CPInterfaceMethodRef[] result = new CPInterfaceMethodRef[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + result[i1] = cpBands.cpIMethodValue(index); + } + return result; + } + + public CPMethodRef[] parseCPMethodRefReferences(String name, + InputStream in, BHSDCodec codec, int count) throws IOException, + Pack200Exception { + CpBands cpBands = segment.getCpBands(); + int[] indices = decodeBandInt(name, in, codec, count); + CPMethodRef[] result = new CPMethodRef[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + result[i1] = cpBands.cpMethodValue(index); + } + return result; + } + + public CPFieldRef[] parseCPFieldRefReferences(String name, InputStream in, + BHSDCodec codec, int count) throws IOException, Pack200Exception { + CpBands cpBands = segment.getCpBands(); + int[] indices = decodeBandInt(name, in, codec, count); + CPFieldRef[] result = new CPFieldRef[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + result[i1] = cpBands.cpFieldValue(index); + } + return result; + } + + public CPNameAndType[] parseCPDescriptorReferences(String name, + InputStream in, BHSDCodec codec, int count) throws IOException, + Pack200Exception { + CpBands cpBands = segment.getCpBands(); + int[] indices = decodeBandInt(name, in, codec, count); + CPNameAndType[] result = new CPNameAndType[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + result[i1] = cpBands.cpNameAndTypeValue(index); + } + return result; + } + + public CPUTF8[] parseCPSignatureReferences(String name, InputStream in, + BHSDCodec codec, int count) throws IOException, Pack200Exception { + int[] indices = decodeBandInt(name, in, codec, count); + CPUTF8[] result = new CPUTF8[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + result[i1] = segment.getCpBands().cpSignatureValue(index); + } + return result; + } + + protected CPUTF8[][] parseCPSignatureReferences(String name, InputStream in, + BHSDCodec codec, int[] counts) throws IOException, Pack200Exception { + CPUTF8[][] result = new CPUTF8[counts.length][]; + int sum = 0; + for (int i = 0; i < counts.length; i++) { + result[i] = new CPUTF8[counts[i]]; + sum += counts[i]; + } + CPUTF8[] result1 = new CPUTF8[sum]; + int[] indices = decodeBandInt(name, in, codec, sum); + for (int i1 = 0; i1 < sum; i1++) { + int index = indices[i1]; + result1[i1] = segment.getCpBands().cpSignatureValue(index); + } + CPUTF8[] refs = result1; + int pos = 0; + for (int i = 0; i < counts.length; i++) { + int num = counts[i]; + result[i] = new CPUTF8[num]; + System.arraycopy(refs, pos, result[i], 0, num); + pos += num; + } + return result; + } + + public CPClass[] parseCPClassReferences(String name, InputStream in, + BHSDCodec codec, int count) throws IOException, Pack200Exception { + int[] indices = decodeBandInt(name, in, codec, count); + CPClass[] result = new CPClass[indices.length]; + for (int i1 = 0; i1 < count; i1++) { + int index = indices[i1]; + result[i1] = segment.getCpBands().cpClassValue(index); + } + return result; + } + + protected String[] getReferences(int[] ints, String[] reference) { + String[] result = new String[ints.length]; + for (int i = 0; i < result.length; i++) { + result[i] = reference[ints[i]]; + } + return result; + } + + protected String[][] getReferences(int[][] ints, String[] reference) { + String[][] result = new String[ints.length][]; + for (int i = 0; i < result.length; i++) { + result[i] = new String[ints[i].length]; + for (int j = 0; j < result[i].length; j++) { + result[i][j] = reference[ints[i][j]]; + + } + } + return result; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/BcBands.java b/src/main/java/org/apache/harmony/unpack200/BcBands.java new file mode 100644 index 0000000..3806173 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/BcBands.java @@ -0,0 +1,606 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.Attribute; +import org.apache.harmony.unpack200.bytecode.BCIRenumberedAttribute; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.CPClass; +import org.apache.harmony.unpack200.bytecode.CodeAttribute; +import org.apache.harmony.unpack200.bytecode.ExceptionTableEntry; +import org.apache.harmony.unpack200.bytecode.NewAttribute; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * Bytecode bands + */ +public class BcBands extends BandSet { + + // The bytecodes for each method in each class as they come (i.e. in their + // packed format) + private byte[][][] methodByteCodePacked; + + // The bands + // TODO: Haven't resolved references yet. Do we want to? + private int[] bcCaseCount; + private int[] bcCaseValue; + private int[] bcByte; + private int[] bcLocal; + private int[] bcShort; + private int[] bcLabel; + private int[] bcIntRef; + private int[] bcFloatRef; + private int[] bcLongRef; + private int[] bcDoubleRef; + private int[] bcStringRef; + private int[] bcClassRef; + private int[] bcFieldRef; + private int[] bcMethodRef; + private int[] bcIMethodRef; + private int[] bcThisField; + private int[] bcSuperField; + private int[] bcThisMethod; + private int[] bcSuperMethod; + private int[] bcInitRef; + private int[] bcEscRef; + private int[] bcEscRefSize; + private int[] bcEscSize; + private int[][] bcEscByte; + + private List wideByteCodes; + + /** + * @param segment + */ + public BcBands(Segment segment) { + super(segment); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.BandSet#unpack(java.io.InputStream) + */ + public void read(InputStream in) throws IOException, Pack200Exception { + + AttributeLayoutMap attributeDefinitionMap = segment + .getAttrDefinitionBands().getAttributeDefinitionMap(); + int classCount = header.getClassCount(); + long[][] methodFlags = segment.getClassBands().getMethodFlags(); + + int bcCaseCountCount = 0; + int bcByteCount = 0; + int bcShortCount = 0; + int bcLocalCount = 0; + int bcLabelCount = 0; + int bcIntRefCount = 0; + int bcFloatRefCount = 0; + int bcLongRefCount = 0; + int bcDoubleRefCount = 0; + int bcStringRefCount = 0; + int bcClassRefCount = 0; + int bcFieldRefCount = 0; + int bcMethodRefCount = 0; + int bcIMethodRefCount = 0; + int bcThisFieldCount = 0; + int bcSuperFieldCount = 0; + int bcThisMethodCount = 0; + int bcSuperMethodCount = 0; + int bcInitRefCount = 0; + int bcEscCount = 0; + int bcEscRefCount = 0; + + AttributeLayout abstractModifier = attributeDefinitionMap + .getAttributeLayout(AttributeLayout.ACC_ABSTRACT, + AttributeLayout.CONTEXT_METHOD); + AttributeLayout nativeModifier = attributeDefinitionMap + .getAttributeLayout(AttributeLayout.ACC_NATIVE, + AttributeLayout.CONTEXT_METHOD); + + methodByteCodePacked = new byte[classCount][][]; + int bcParsed = 0; + + List switchIsTableSwitch = new ArrayList(); + wideByteCodes = new ArrayList(); + for (int c = 0; c < classCount; c++) { + int numberOfMethods = methodFlags[c].length; + methodByteCodePacked[c] = new byte[numberOfMethods][]; + for (int m = 0; m < numberOfMethods; m++) { + long methodFlag = methodFlags[c][m]; + if (!abstractModifier.matches(methodFlag) + && !nativeModifier.matches(methodFlag)) { + ByteArrayOutputStream codeBytes = new ByteArrayOutputStream(); + byte code; + while ((code = (byte) (0xff & in.read())) != -1) + codeBytes.write(code); + methodByteCodePacked[c][m] = codeBytes.toByteArray(); + bcParsed += methodByteCodePacked[c][m].length; + int[] codes = new int[methodByteCodePacked[c][m].length]; + for (int i = 0; i < codes.length; i++) { + codes[i] = methodByteCodePacked[c][m][i] & 0xff; + } + for (int i = 0; i < methodByteCodePacked[c][m].length; i++) { + int codePacked = 0xff & methodByteCodePacked[c][m][i]; + switch (codePacked) { + case 16: // bipush + case 188: // newarray + bcByteCount++; + break; + case 17: // sipush + bcShortCount++; + break; + case 18: // (a)ldc + case 19: // aldc_w + bcStringRefCount++; + break; + case 234: // ildc + case 237: // ildc_w + bcIntRefCount++; + break; + case 235: // fldc + case 238: // fldc_w + bcFloatRefCount++; + break; + case 197: // multianewarray + bcByteCount++; + // fallthrough intended + case 233: // cldc + case 236: // cldc_w + case 187: // new + case 189: // anewarray + case 192: // checkcast + case 193: // instanceof + bcClassRefCount++; + break; + case 20: // lldc2_w + bcLongRefCount++; + break; + case 239: // dldc2_w + bcDoubleRefCount++; + break; + case 169: // ret + bcLocalCount++; + break; + case 167: // goto + case 168: // jsr + case 200: // goto_w + case 201: // jsr_w + bcLabelCount++; + break; + case 170: // tableswitch + switchIsTableSwitch.add(new Boolean(true)); + bcCaseCountCount++; + bcLabelCount++; + break; + case 171: // lookupswitch + switchIsTableSwitch.add(new Boolean(false)); + bcCaseCountCount++; + bcLabelCount++; + break; + case 178: // getstatic + case 179: // putstatic + case 180: // getfield + case 181: // putfield + bcFieldRefCount++; + break; + case 182: // invokevirtual + case 183: // invokespecial + case 184: // invokestatic + bcMethodRefCount++; + break; + case 185: // invokeinterface + bcIMethodRefCount++; + break; + case 202: // getstatic_this + case 203: // putstatic_this + case 204: // getfield_this + case 205: // putfield_this + case 209: // aload_0_getstatic_this + case 210: // aload_0_putstatic_this + case 211: // aload_0_putfield_this + case 212: // aload_0_putfield_this + bcThisFieldCount++; + break; + case 206: // invokevirtual_this + case 207: // invokespecial_this + case 208: // invokestatic_this + case 213: // aload_0_invokevirtual_this + case 214: // aload_0_invokespecial_this + case 215: // aload_0_invokestatic_this + bcThisMethodCount++; + break; + case 216: // getstatic_super + case 217: // putstatic_super + case 218: // getfield_super + case 219: // putfield_super + case 223: // aload_0_getstatic_super + case 224: // aload_0_putstatic_super + case 225: // aload_0_getfield_super + case 226: // aload_0_putfield_super + bcSuperFieldCount++; + break; + case 220: // invokevirtual_super + case 221: // invokespecial_super + case 222: // invokestatic_super + case 227: // aload_0_invokevirtual_super + case 228: // aload_0_invokespecial_super + case 229: // aload_0_invokestatic_super + bcSuperMethodCount++; + break; + case 132: // iinc + bcLocalCount++; + bcByteCount++; + break; + case 196: // wide + int nextInstruction = 0xff & methodByteCodePacked[c][m][i + 1]; + wideByteCodes.add(new Integer(nextInstruction)); + if (nextInstruction == 132) { // iinc + bcLocalCount++; + bcShortCount++; + } else if (endsWithLoad(nextInstruction) + || endsWithStore(nextInstruction) + || nextInstruction == 169) { + bcLocalCount++; + } else { + segment + .log( + Segment.LOG_LEVEL_VERBOSE, + "Found unhandled " + + ByteCode + .getByteCode(nextInstruction)); + } + i++; + break; + case 230: // invokespecial_this_init + case 231: // invokespecial_super_init + case 232: // invokespecial_new_init + bcInitRefCount++; + break; + case 253: // ref_escape + bcEscRefCount++; + break; + case 254: // byte_escape + bcEscCount++; + break; + default: + if (endsWithLoad(codePacked) + || endsWithStore(codePacked)) { + bcLocalCount++; + } else if (startsWithIf(codePacked)) { + bcLabelCount++; + } + } + } + } + } + } + // other bytecode bands + bcCaseCount = decodeBandInt("bc_case_count", in, Codec.UNSIGNED5, + bcCaseCountCount); + int bcCaseValueCount = 0; + for (int i = 0; i < bcCaseCount.length; i++) { + boolean isTableSwitch = ((Boolean) switchIsTableSwitch.get(i)) + .booleanValue(); + if (isTableSwitch) { + bcCaseValueCount += 1; + } else { + bcCaseValueCount += bcCaseCount[i]; + } + } + bcCaseValue = decodeBandInt("bc_case_value", in, Codec.DELTA5, + bcCaseValueCount); + // Every case value needs a label. We weren't able to count these + // above, because we didn't know how many cases there were. + // Have to correct it now. + for (int index = 0; index < bcCaseCountCount; index++) { + bcLabelCount += bcCaseCount[index]; + } + bcByte = decodeBandInt("bc_byte", in, Codec.BYTE1, bcByteCount); + bcShort = decodeBandInt("bc_short", in, Codec.DELTA5, bcShortCount); + bcLocal = decodeBandInt("bc_local", in, Codec.UNSIGNED5, bcLocalCount); + bcLabel = decodeBandInt("bc_label", in, Codec.BRANCH5, bcLabelCount); + bcIntRef = decodeBandInt("bc_intref", in, Codec.DELTA5, bcIntRefCount); + bcFloatRef = decodeBandInt("bc_floatref", in, Codec.DELTA5, + bcFloatRefCount); + bcLongRef = decodeBandInt("bc_longref", in, Codec.DELTA5, + bcLongRefCount); + bcDoubleRef = decodeBandInt("bc_doubleref", in, Codec.DELTA5, + bcDoubleRefCount); + bcStringRef = decodeBandInt("bc_stringref", in, Codec.DELTA5, + bcStringRefCount); + bcClassRef = decodeBandInt("bc_classref", in, Codec.UNSIGNED5, + bcClassRefCount); + bcFieldRef = decodeBandInt("bc_fieldref", in, Codec.DELTA5, + bcFieldRefCount); + bcMethodRef = decodeBandInt("bc_methodref", in, Codec.UNSIGNED5, + bcMethodRefCount); + bcIMethodRef = decodeBandInt("bc_imethodref", in, Codec.DELTA5, + bcIMethodRefCount); + bcThisField = decodeBandInt("bc_thisfield", in, Codec.UNSIGNED5, + bcThisFieldCount); + bcSuperField = decodeBandInt("bc_superfield", in, Codec.UNSIGNED5, + bcSuperFieldCount); + bcThisMethod = decodeBandInt("bc_thismethod", in, Codec.UNSIGNED5, + bcThisMethodCount); + bcSuperMethod = decodeBandInt("bc_supermethod", in, Codec.UNSIGNED5, + bcSuperMethodCount); + bcInitRef = decodeBandInt("bc_initref", in, Codec.UNSIGNED5, + bcInitRefCount); + bcEscRef = decodeBandInt("bc_escref", in, Codec.UNSIGNED5, + bcEscRefCount); + bcEscRefSize = decodeBandInt("bc_escrefsize", in, Codec.UNSIGNED5, + bcEscRefCount); + bcEscSize = decodeBandInt("bc_escsize", in, Codec.UNSIGNED5, bcEscCount); + bcEscByte = decodeBandInt("bc_escbyte", in, Codec.BYTE1, bcEscSize); + } + + public void unpack() throws Pack200Exception { + int classCount = header.getClassCount(); + long[][] methodFlags = segment.getClassBands().getMethodFlags(); + int[] codeMaxNALocals = segment.getClassBands().getCodeMaxNALocals(); + int[] codeMaxStack = segment.getClassBands().getCodeMaxStack(); + ArrayList[][] methodAttributes = segment.getClassBands() + .getMethodAttributes(); + String[][] methodDescr = segment.getClassBands().getMethodDescr(); + + AttributeLayoutMap attributeDefinitionMap = segment + .getAttrDefinitionBands().getAttributeDefinitionMap(); + + AttributeLayout abstractModifier = attributeDefinitionMap + .getAttributeLayout(AttributeLayout.ACC_ABSTRACT, + AttributeLayout.CONTEXT_METHOD); + AttributeLayout nativeModifier = attributeDefinitionMap + .getAttributeLayout(AttributeLayout.ACC_NATIVE, + AttributeLayout.CONTEXT_METHOD); + AttributeLayout staticModifier = attributeDefinitionMap + .getAttributeLayout(AttributeLayout.ACC_STATIC, + AttributeLayout.CONTEXT_METHOD); + + int[] wideByteCodeArray = new int[wideByteCodes.size()]; + for (int index = 0; index < wideByteCodeArray.length; index++) { + wideByteCodeArray[index] = ((Integer) wideByteCodes.get(index)) + .intValue(); + } + OperandManager operandManager = new OperandManager(bcCaseCount, + bcCaseValue, bcByte, bcShort, bcLocal, bcLabel, bcIntRef, + bcFloatRef, bcLongRef, bcDoubleRef, bcStringRef, bcClassRef, + bcFieldRef, bcMethodRef, bcIMethodRef, bcThisField, + bcSuperField, bcThisMethod, bcSuperMethod, bcInitRef, + wideByteCodeArray); + operandManager.setSegment(segment); + + int i = 0; + ArrayList orderedCodeAttributes = segment.getClassBands() + .getOrderedCodeAttributes(); + int codeAttributeIndex = 0; + + // Exception table fields + int[] handlerCount = segment.getClassBands().getCodeHandlerCount(); + int[][] handlerStartPCs = segment.getClassBands() + .getCodeHandlerStartP(); + int[][] handlerEndPCs = segment.getClassBands().getCodeHandlerEndPO(); + int[][] handlerCatchPCs = segment.getClassBands() + .getCodeHandlerCatchPO(); + int[][] handlerClassTypes = segment.getClassBands() + .getCodeHandlerClassRCN(); + + boolean allCodeHasFlags = segment.getSegmentHeader().getOptions().hasAllCodeFlags(); + boolean[] codeHasFlags = segment.getClassBands().getCodeHasAttributes(); + + for (int c = 0; c < classCount; c++) { + int numberOfMethods = methodFlags[c].length; + for (int m = 0; m < numberOfMethods; m++) { + long methodFlag = methodFlags[c][m]; + if (!abstractModifier.matches(methodFlag) + && !nativeModifier.matches(methodFlag)) { + int maxStack = codeMaxStack[i]; + int maxLocal = codeMaxNALocals[i]; + if (!staticModifier.matches(methodFlag)) + maxLocal++; // one for 'this' parameter + // I believe this has to take wide arguments into account + maxLocal += SegmentUtils + .countInvokeInterfaceArgs(methodDescr[c][m]); + String[] cpClass = segment.getCpBands().getCpClass(); + operandManager.setCurrentClass(cpClass[segment + .getClassBands().getClassThisInts()[c]]); + operandManager.setSuperClass(cpClass[segment + .getClassBands().getClassSuperInts()[c]]); + List exceptionTable = new ArrayList(); + if (handlerCount != null) { + for (int j = 0; j < handlerCount[i]; j++) { + int handlerClass = handlerClassTypes[i][j] - 1; + CPClass cpHandlerClass = null; + if (handlerClass != -1) { + // The handlerClass will be null if the + // catch is a finally (that is, the + // exception table catch_type should be 0 + cpHandlerClass = segment.getCpBands() + .cpClassValue(handlerClass); + } + ExceptionTableEntry entry = new ExceptionTableEntry( + handlerStartPCs[i][j], handlerEndPCs[i][j], + handlerCatchPCs[i][j], cpHandlerClass); + exceptionTable.add(entry); + } + } + CodeAttribute codeAttr = new CodeAttribute(maxStack, + maxLocal, methodByteCodePacked[c][m], segment, + operandManager, exceptionTable); + ArrayList methodAttributesList = methodAttributes[c][m]; + // Make sure we add the code attribute in the right place + int indexForCodeAttr = 0; + for (int index = 0; index < methodAttributesList.size(); index++) { + Attribute attribute = (Attribute) methodAttributesList.get(index); + if((attribute instanceof NewAttribute && ((NewAttribute)attribute).getLayoutIndex() < 15)) { + indexForCodeAttr ++; + } else { + break; + } + } + methodAttributesList.add(indexForCodeAttr, codeAttr); + codeAttr.renumber(codeAttr.byteCodeOffsets); + List currentAttributes; + if (allCodeHasFlags) { + currentAttributes = (List) orderedCodeAttributes.get(i); + } else { + if (codeHasFlags[i]) { + currentAttributes = (List) orderedCodeAttributes + .get(codeAttributeIndex); + codeAttributeIndex++; + } else { + currentAttributes = Collections.EMPTY_LIST; + } + } + for (int index = 0; index < currentAttributes.size(); index++) { + Attribute currentAttribute = (Attribute) currentAttributes + .get(index); + codeAttr.addAttribute(currentAttribute); + // Fix up the line numbers if needed + if (currentAttribute.hasBCIRenumbering()) { + ((BCIRenumberedAttribute) currentAttribute) + .renumber(codeAttr.byteCodeOffsets); + } + } + i++; + } + } + } + } + + private boolean startsWithIf(int codePacked) { + return (codePacked >= 153 && codePacked <= 166) || (codePacked == 198) + || (codePacked == 199); + } + + private boolean endsWithLoad(int codePacked) { + return (codePacked >= 21 && codePacked <= 25); + } + + private boolean endsWithStore(int codePacked) { + return (codePacked >= 54 && codePacked <= 58); + } + + public byte[][][] getMethodByteCodePacked() { + return methodByteCodePacked; + } + + public int[] getBcCaseCount() { + return bcCaseCount; + } + + public int[] getBcCaseValue() { + return bcCaseValue; + } + + public int[] getBcByte() { + return bcByte; + } + + public int[] getBcClassRef() { + return bcClassRef; + } + + public int[] getBcDoubleRef() { + return bcDoubleRef; + } + + public int[] getBcFieldRef() { + return bcFieldRef; + } + + public int[] getBcFloatRef() { + return bcFloatRef; + } + + public int[] getBcIMethodRef() { + return bcIMethodRef; + } + + public int[] getBcInitRef() { + return bcInitRef; + } + + public int[] getBcIntRef() { + return bcIntRef; + } + + public int[] getBcLabel() { + return bcLabel; + } + + public int[] getBcLocal() { + return bcLocal; + } + + public int[] getBcLongRef() { + return bcLongRef; + } + + public int[] getBcMethodRef() { + return bcMethodRef; + } + + public int[] getBcShort() { + return bcShort; + } + + public int[] getBcStringRef() { + return bcStringRef; + } + + public int[] getBcSuperField() { + return bcSuperField; + } + + public int[] getBcSuperMethod() { + return bcSuperMethod; + } + + public int[] getBcThisField() { + return bcThisField; + } + + public int[] getBcThisMethod() { + return bcThisMethod; + } + + public int[] getBcEscRef() { + return bcEscRef; + } + + public int[] getBcEscRefSize() { + return bcEscRefSize; + } + + public int[] getBcEscSize() { + return bcEscSize; + } + + public int[][] getBcEscByte() { + return bcEscByte; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/ClassBands.java b/src/main/java/org/apache/harmony/unpack200/ClassBands.java new file mode 100644 index 0000000..d11ba69 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/ClassBands.java @@ -0,0 +1,1418 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.Attribute; +import org.apache.harmony.unpack200.bytecode.CPClass; +import org.apache.harmony.unpack200.bytecode.CPNameAndType; +import org.apache.harmony.unpack200.bytecode.CPUTF8; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; +import org.apache.harmony.unpack200.bytecode.ConstantValueAttribute; +import org.apache.harmony.unpack200.bytecode.DeprecatedAttribute; +import org.apache.harmony.unpack200.bytecode.EnclosingMethodAttribute; +import org.apache.harmony.unpack200.bytecode.ExceptionsAttribute; +import org.apache.harmony.unpack200.bytecode.LineNumberTableAttribute; +import org.apache.harmony.unpack200.bytecode.LocalVariableTableAttribute; +import org.apache.harmony.unpack200.bytecode.LocalVariableTypeTableAttribute; +import org.apache.harmony.unpack200.bytecode.SignatureAttribute; +import org.apache.harmony.unpack200.bytecode.SourceFileAttribute; + +/** + * Class Bands + */ +public class ClassBands extends BandSet { + + private int[] classFieldCount; + + private long[] classFlags; + + private long[] classAccessFlags; // Access flags for writing to the class + // file + + private int[][] classInterfacesInts; + + private int[] classMethodCount; + + private int[] classSuperInts; + + private String[] classThis; + + private int[] classThisInts; + + private ArrayList[] classAttributes; + + private int[] classVersionMajor; + + private int[] classVersionMinor; + + private IcTuple[][] icLocal; + + private List[] codeAttributes; + + private int[] codeHandlerCount; + + private int[] codeMaxNALocals; + + private int[] codeMaxStack; + + private ArrayList[][] fieldAttributes; + + private String[][] fieldDescr; + + private int[][] fieldDescrInts; + + private long[][] fieldFlags; + + private long[][] fieldAccessFlags; + + private ArrayList[][] methodAttributes; + + private String[][] methodDescr; + + private int[][] methodDescrInts; + + private long[][] methodFlags; + + private long[][] methodAccessFlags; + + private final AttributeLayoutMap attrMap; + + private final CpBands cpBands; + + private final SegmentOptions options; + + private final int classCount; + + private int[] methodAttrCalls; + + private int[][] codeHandlerStartP; + + private int[][] codeHandlerEndPO; + + private int[][] codeHandlerCatchPO; + + private int[][] codeHandlerClassRCN; + + private boolean [] codeHasAttributes; + + /** + * @param segment + */ + public ClassBands(Segment segment) { + super(segment); + this.attrMap = segment.getAttrDefinitionBands() + .getAttributeDefinitionMap(); + this.cpBands = segment.getCpBands(); + this.classCount = header.getClassCount(); + this.options = header.getOptions(); + + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.BandSet#unpack(java.io.InputStream) + */ + public void read(InputStream in) throws IOException, Pack200Exception { + int classCount = header.getClassCount(); + classThisInts = decodeBandInt("class_this", in, Codec.DELTA5, classCount); + classThis = getReferences(classThisInts, cpBands.getCpClass()); + classSuperInts = decodeBandInt("class_super", in, Codec.DELTA5, + classCount); + int[] classInterfaceLengths = decodeBandInt("class_interface_count", + in, Codec.DELTA5, classCount); + classInterfacesInts = decodeBandInt("class_interface", in, Codec.DELTA5, + classInterfaceLengths); + classFieldCount = decodeBandInt("class_field_count", in, Codec.DELTA5, + classCount); + classMethodCount = decodeBandInt("class_method_count", in, + Codec.DELTA5, classCount); + parseFieldBands(in); + parseMethodBands(in); + parseClassAttrBands(in); + parseCodeBands(in); + + } + + public void unpack() { + + } + + private void parseFieldBands(InputStream in) throws IOException, + Pack200Exception { + fieldDescrInts = decodeBandInt("field_descr", in, Codec.DELTA5, + classFieldCount); + fieldDescr = getReferences(fieldDescrInts, cpBands.getCpDescriptor()); + parseFieldAttrBands(in); + } + + private void parseFieldAttrBands(InputStream in) throws IOException, + Pack200Exception { + fieldFlags = parseFlags("field_flags", in, classFieldCount, + Codec.UNSIGNED5, options.hasFieldFlagsHi()); + int fieldAttrCount = SegmentUtils.countBit16(fieldFlags); + int[] fieldAttrCounts = decodeBandInt("field_attr_count", in, + Codec.UNSIGNED5, fieldAttrCount); + int[][] fieldAttrIndexes = decodeBandInt("field_attr_indexes", in, + Codec.UNSIGNED5, fieldAttrCounts); + int callCount = getCallCount(fieldAttrIndexes, fieldFlags, + AttributeLayout.CONTEXT_FIELD); + int[] fieldAttrCalls = decodeBandInt("field_attr_calls", in, + Codec.UNSIGNED5, callCount); + + // Assign empty field attributes + fieldAttributes = new ArrayList[classCount][]; + for (int i = 0; i < classCount; i++) { + fieldAttributes[i] = new ArrayList[fieldFlags[i].length]; + for (int j = 0; j < fieldFlags[i].length; j++) { + fieldAttributes[i][j] = new ArrayList(); + } + } + + AttributeLayout constantValueLayout = attrMap.getAttributeLayout( + "ConstantValue", AttributeLayout.CONTEXT_FIELD); + int constantCount = SegmentUtils.countMatches(fieldFlags, + constantValueLayout); + int[] field_constantValue_KQ = decodeBandInt("field_ConstantValue_KQ", + in, Codec.UNSIGNED5, constantCount); + int constantValueIndex = 0; + + AttributeLayout signatureLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_SIGNATURE, + AttributeLayout.CONTEXT_FIELD); + int signatureCount = SegmentUtils.countMatches(fieldFlags, + signatureLayout); + int[] fieldSignatureRS = decodeBandInt("field_Signature_RS", in, + Codec.UNSIGNED5, signatureCount); + int signatureIndex = 0; + + AttributeLayout deprecatedLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_DEPRECATED, + AttributeLayout.CONTEXT_FIELD); + + for (int i = 0; i < classCount; i++) { + for (int j = 0; j < fieldFlags[i].length; j++) { + long flag = fieldFlags[i][j]; + if (deprecatedLayout.matches(flag)) { + fieldAttributes[i][j].add(new DeprecatedAttribute()); + } + if (constantValueLayout.matches(flag)) { + // we've got a value to read + long result = field_constantValue_KQ[constantValueIndex]; + String desc = fieldDescr[i][j]; + int colon = desc.indexOf(':'); + String type = desc.substring(colon + 1); + if (type.equals("B") || type.equals("S") + || type.equals("C") || type.equals("Z")) + type = "I"; + ClassFileEntry value = constantValueLayout.getValue(result, + type, cpBands.getConstantPool()); + fieldAttributes[i][j] + .add(new ConstantValueAttribute(value)); + constantValueIndex++; + } + if (signatureLayout.matches(flag)) { + // we've got a signature attribute + long result = fieldSignatureRS[signatureIndex]; + String desc = fieldDescr[i][j]; + int colon = desc.indexOf(':'); + String type = desc.substring(colon + 1); + CPUTF8 value = (CPUTF8) signatureLayout.getValue(result, + type, cpBands.getConstantPool()); + fieldAttributes[i][j].add(new SignatureAttribute(value)); + signatureIndex++; + } + } + } + + int backwardsCallsUsed = parseFieldMetadataBands(in, fieldAttrCalls); + + // Parse non-predefined attribute bands + int backwardsCallIndex = backwardsCallsUsed; + int limit = options.hasFieldFlagsHi() ? 62 : 31; + AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1]; + int[] counts = new int[limit + 1]; + List[] otherAttributes = new List[limit + 1]; + for (int i = 0; i < limit; i++) { + AttributeLayout layout = attrMap.getAttributeLayout(i, + AttributeLayout.CONTEXT_FIELD); + if (layout != null && !(layout.isDefaultLayout())) { + otherLayouts[i] = layout; + counts[i] = SegmentUtils.countMatches(fieldFlags, layout); + } + } + for (int i = 0; i < counts.length; i++) { + if (counts[i] > 0) { + NewAttributeBands bands = attrMap + .getAttributeBands(otherLayouts[i]); + otherAttributes[i] = bands.parseAttributes(in, counts[i]); + int numBackwardsCallables = otherLayouts[i] + .numBackwardsCallables(); + if (numBackwardsCallables > 0) { + int[] backwardsCalls = new int[numBackwardsCallables]; + System.arraycopy(fieldAttrCalls, backwardsCallIndex, + backwardsCalls, 0, numBackwardsCallables); + bands.setBackwardsCalls(backwardsCalls); + backwardsCallIndex += numBackwardsCallables; + } + } + } + + // Non-predefined attributes + for (int i = 0; i < classCount; i++) { + for (int j = 0; j < fieldFlags[i].length; j++) { + long flag = fieldFlags[i][j]; + int othersAddedAtStart = 0; + for (int k = 0; k < otherLayouts.length; k++) { + if (otherLayouts[k] != null + && otherLayouts[k].matches(flag)) { + // Add the next attribute + if(otherLayouts[k].getIndex()<15) { + fieldAttributes[i][j].add(othersAddedAtStart++, otherAttributes[k].get(0)); + } else { + fieldAttributes[i][j].add(otherAttributes[k].get(0)); + } + otherAttributes[k].remove(0); + } + } + } + } + } + + private void parseMethodBands(InputStream in) throws IOException, + Pack200Exception { + methodDescrInts = decodeBandInt("method_descr", in, Codec.MDELTA5, + classMethodCount); + methodDescr = getReferences(methodDescrInts, cpBands.getCpDescriptor()); + parseMethodAttrBands(in); + } + + private void parseMethodAttrBands(InputStream in) throws IOException, + Pack200Exception { + methodFlags = parseFlags("method_flags", in, classMethodCount, + Codec.UNSIGNED5, options.hasMethodFlagsHi()); + int methodAttrCount = SegmentUtils.countBit16(methodFlags); + int[] methodAttrCounts = decodeBandInt("method_attr_count", in, + Codec.UNSIGNED5, methodAttrCount); + int[][] methodAttrIndexes = decodeBandInt("method_attr_indexes", in, + Codec.UNSIGNED5, methodAttrCounts); + int callCount = getCallCount(methodAttrIndexes, methodFlags, + AttributeLayout.CONTEXT_METHOD); + methodAttrCalls = decodeBandInt("method_attr_calls", in, Codec.UNSIGNED5, + callCount); + + // assign empty method attributes + methodAttributes = new ArrayList[classCount][]; + for (int i = 0; i < classCount; i++) { + methodAttributes[i] = new ArrayList[methodFlags[i].length]; + for (int j = 0; j < methodFlags[i].length; j++) { + methodAttributes[i][j] = new ArrayList(); + } + } + + // Parse method exceptions attributes + AttributeLayout methodExceptionsLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_EXCEPTIONS, + AttributeLayout.CONTEXT_METHOD); + int count = SegmentUtils.countMatches(methodFlags, + methodExceptionsLayout); + int[] numExceptions = decodeBandInt("method_Exceptions_n", in, + Codec.UNSIGNED5, count); + int[][] methodExceptionsRS = decodeBandInt("method_Exceptions_RC", + in, Codec.UNSIGNED5, numExceptions); + + // Parse method signature attributes + AttributeLayout methodSignatureLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_SIGNATURE, + AttributeLayout.CONTEXT_METHOD); + int count1 = SegmentUtils.countMatches(methodFlags, + methodSignatureLayout); + int[] methodSignatureRS = decodeBandInt("method_signature_RS", in, + Codec.UNSIGNED5, count1); + + AttributeLayout deprecatedLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_DEPRECATED, + AttributeLayout.CONTEXT_METHOD); + + // Add attributes to the attribute arrays + int methodExceptionsIndex = 0; + int methodSignatureIndex = 0; + for (int i = 0; i < methodAttributes.length; i++) { + for (int j = 0; j < methodAttributes[i].length; j++) { + long flag = methodFlags[i][j]; + if (methodExceptionsLayout.matches(flag)) { + int n = numExceptions[methodExceptionsIndex]; + int[] exceptions = methodExceptionsRS[methodExceptionsIndex]; + CPClass[] exceptionClasses = new CPClass[n]; + for (int k = 0; k < n; k++) { + exceptionClasses[k] = cpBands + .cpClassValue(exceptions[k]); + } + methodAttributes[i][j].add(new ExceptionsAttribute( + exceptionClasses)); + methodExceptionsIndex++; + } + if (methodSignatureLayout.matches(flag)) { + // We've got a signature attribute + long result = methodSignatureRS[methodSignatureIndex]; + String desc = methodDescr[i][j]; + int colon = desc.indexOf(':'); + String type = desc.substring(colon + 1); + // TODO Got to get better at this ... in any case, it should + // be e.g. KIB or KIH + if (type.equals("B") || type.equals("H")) + type = "I"; + CPUTF8 value = (CPUTF8) methodSignatureLayout.getValue( + result, type, cpBands.getConstantPool()); + methodAttributes[i][j] + .add(new SignatureAttribute(value)); + methodSignatureIndex++; + } + if (deprecatedLayout.matches(flag)) { + methodAttributes[i][j].add(new DeprecatedAttribute()); + } + } + } + + // Parse method metadata bands + int backwardsCallsUsed = parseMethodMetadataBands(in, methodAttrCalls); + + // Parse non-predefined attribute bands + int backwardsCallIndex = backwardsCallsUsed; + int limit = options.hasMethodFlagsHi() ? 62 : 31; + AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1]; + int[] counts = new int[limit + 1]; + List[] otherAttributes = new List[limit + 1]; + for (int i = 0; i < limit; i++) { + AttributeLayout layout = attrMap.getAttributeLayout(i, + AttributeLayout.CONTEXT_METHOD); + if (layout != null && !(layout.isDefaultLayout())) { + otherLayouts[i] = layout; + counts[i] = SegmentUtils.countMatches(methodFlags, layout); + } + } + for (int i = 0; i < counts.length; i++) { + if (counts[i] > 0) { + NewAttributeBands bands = attrMap + .getAttributeBands(otherLayouts[i]); + otherAttributes[i] = bands.parseAttributes(in, counts[i]); + int numBackwardsCallables = otherLayouts[i] + .numBackwardsCallables(); + if (numBackwardsCallables > 0) { + int[] backwardsCalls = new int[numBackwardsCallables]; + System.arraycopy(methodAttrCalls, backwardsCallIndex, + backwardsCalls, 0, numBackwardsCallables); + bands.setBackwardsCalls(backwardsCalls); + backwardsCallIndex += numBackwardsCallables; + } + } + } + + // Non-predefined attributes + for (int i = 0; i < methodAttributes.length; i++) { + for (int j = 0; j < methodAttributes[i].length; j++) { + long flag = methodFlags[i][j]; + int othersAddedAtStart = 0; + for (int k = 0; k < otherLayouts.length; k++) { + if (otherLayouts[k] != null + && otherLayouts[k].matches(flag)) { + // Add the next attribute + if(otherLayouts[k].getIndex() < 15) { + methodAttributes[i][j].add(othersAddedAtStart++, otherAttributes[k].get(0)); + } else { + methodAttributes[i][j].add(otherAttributes[k].get(0)); + } + otherAttributes[k].remove(0); + } + } + } + } + } + + private int getCallCount(int[][] methodAttrIndexes, long[][] flags, + int context) throws Pack200Exception { + int callCount = 0; + for (int i = 0; i < methodAttrIndexes.length; i++) { + for (int j = 0; j < methodAttrIndexes[i].length; j++) { + int index = methodAttrIndexes[i][j]; + AttributeLayout layout = attrMap.getAttributeLayout(index, + context); + callCount += layout.numBackwardsCallables(); + } + } + int layoutsUsed = 0; + for (int i = 0; i < flags.length; i++) { + for (int j = 0; j < flags[i].length; j++) { + layoutsUsed |= flags[i][j]; + } + } + for (int i = 0; i < 26; i++) { + if ((layoutsUsed & 1 << i) != 0) { + AttributeLayout layout = attrMap.getAttributeLayout(i, context); + callCount += layout.numBackwardsCallables(); + } + } + return callCount; + } + + private void parseClassAttrBands(InputStream in) throws IOException, + Pack200Exception { + String[] cpUTF8 = cpBands.getCpUTF8(); + String[] cpClass = cpBands.getCpClass(); + + // Prepare empty attribute lists + classAttributes = new ArrayList[classCount]; + for (int i = 0; i < classCount; i++) { + classAttributes[i] = new ArrayList(); + } + + classFlags = parseFlags("class_flags", in, classCount, Codec.UNSIGNED5, + options.hasClassFlagsHi()); + int classAttrCount = SegmentUtils.countBit16(classFlags); + int[] classAttrCounts = decodeBandInt("class_attr_count", in, + Codec.UNSIGNED5, classAttrCount); + int[][] classAttrIndexes = decodeBandInt("class_attr_indexes", in, + Codec.UNSIGNED5, classAttrCounts); + int callCount = getCallCount(classAttrIndexes, + new long[][] { classFlags }, AttributeLayout.CONTEXT_CLASS); + int[] classAttrCalls = decodeBandInt("class_attr_calls", in, + Codec.UNSIGNED5, callCount); + + AttributeLayout deprecatedLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_DEPRECATED, + AttributeLayout.CONTEXT_CLASS); + + AttributeLayout sourceFileLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_SOURCE_FILE, + AttributeLayout.CONTEXT_CLASS); + int sourceFileCount = SegmentUtils.countMatches(classFlags, + sourceFileLayout); + int[] classSourceFile = decodeBandInt("class_SourceFile_RUN", in, + Codec.UNSIGNED5, sourceFileCount); + + AttributeLayout enclosingMethodLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_ENCLOSING_METHOD, + AttributeLayout.CONTEXT_CLASS); + int enclosingMethodCount = SegmentUtils.countMatches(classFlags, + enclosingMethodLayout); + int[] enclosingMethodRC = decodeBandInt( + "class_EnclosingMethod_RC", in, Codec.UNSIGNED5, + enclosingMethodCount); + int[] enclosingMethodRDN = decodeBandInt( + "class_EnclosingMethod_RDN", in, Codec.UNSIGNED5, + enclosingMethodCount); + + AttributeLayout signatureLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_SIGNATURE, + AttributeLayout.CONTEXT_CLASS); + int signatureCount = SegmentUtils.countMatches(classFlags, + signatureLayout); + int[] classSignature = decodeBandInt("class_Signature_RS", in, + Codec.UNSIGNED5, signatureCount); + + int backwardsCallsUsed = parseClassMetadataBands(in, classAttrCalls); + + AttributeLayout innerClassLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_INNER_CLASSES, + AttributeLayout.CONTEXT_CLASS); + int innerClassCount = SegmentUtils.countMatches(classFlags, + innerClassLayout); + int[] classInnerClassesN = decodeBandInt("class_InnerClasses_N", in, + Codec.UNSIGNED5, innerClassCount); + int[][] classInnerClassesRC = decodeBandInt("class_InnerClasses_RC", + in, Codec.UNSIGNED5, classInnerClassesN); + int[][] classInnerClassesF = decodeBandInt("class_InnerClasses_F", in, + Codec.UNSIGNED5, classInnerClassesN); + int flagsCount = 0; + for (int i = 0; i < classInnerClassesF.length; i++) { + for (int j = 0; j < classInnerClassesF[i].length; j++) { + if (classInnerClassesF[i][j] != 0) { + flagsCount++; + } + } + } + int[] classInnerClassesOuterRCN = decodeBandInt( + "class_InnerClasses_outer_RCN", in, Codec.UNSIGNED5, flagsCount); + int[] classInnerClassesNameRUN = decodeBandInt( + "class_InnerClasses_name_RUN", in, Codec.UNSIGNED5, flagsCount); + + AttributeLayout versionLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_CLASS_FILE_VERSION, + AttributeLayout.CONTEXT_CLASS); + int versionCount = SegmentUtils.countMatches(classFlags, versionLayout); + int[] classFileVersionMinorH = decodeBandInt( + "class_file_version_minor_H", in, Codec.UNSIGNED5, versionCount); + int[] classFileVersionMajorH = decodeBandInt( + "class_file_version_major_H", in, Codec.UNSIGNED5, versionCount); + if (versionCount > 0) { + classVersionMajor = new int[classCount]; + classVersionMinor = new int[classCount]; + } + int defaultVersionMajor = header.getDefaultClassMajorVersion(); + int defaultVersionMinor = header.getDefaultClassMinorVersion(); + + // Parse non-predefined attribute bands + int backwardsCallIndex = backwardsCallsUsed; + int limit = options.hasClassFlagsHi() ? 62 : 31; + AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1]; + int[] counts = new int[limit + 1]; + List[] otherAttributes = new List[limit + 1]; + for (int i = 0; i < limit; i++) { + AttributeLayout layout = attrMap.getAttributeLayout(i, + AttributeLayout.CONTEXT_CLASS); + if (layout != null && !(layout.isDefaultLayout())) { + otherLayouts[i] = layout; + counts[i] = SegmentUtils.countMatches(classFlags, layout); + } + } + for (int i = 0; i < counts.length; i++) { + if (counts[i] > 0) { + NewAttributeBands bands = attrMap + .getAttributeBands(otherLayouts[i]); + otherAttributes[i] = bands.parseAttributes(in, counts[i]); + int numBackwardsCallables = otherLayouts[i] + .numBackwardsCallables(); + if (numBackwardsCallables > 0) { + int[] backwardsCalls = new int[numBackwardsCallables]; + System.arraycopy(classAttrCalls, backwardsCallIndex, + backwardsCalls, 0, numBackwardsCallables); + bands.setBackwardsCalls(backwardsCalls); + backwardsCallIndex += numBackwardsCallables; + } + } + } + + // Now process the attribute bands we have parsed + int sourceFileIndex = 0; + int enclosingMethodIndex = 0; + int signatureIndex = 0; + int innerClassIndex = 0; + int innerClassC2NIndex = 0; + int versionIndex = 0; + icLocal = new IcTuple[classCount][]; + for (int i = 0; i < classCount; i++) { + long flag = classFlags[i]; + if (deprecatedLayout.matches(classFlags[i])) { + classAttributes[i].add(new DeprecatedAttribute()); + } + if (sourceFileLayout.matches(flag)) { + long result = classSourceFile[sourceFileIndex]; + ClassFileEntry value = sourceFileLayout.getValue(result, + cpBands.getConstantPool()); + if (value == null) { + // Remove package prefix + String className = classThis[i].substring(classThis[i] + .lastIndexOf('/') + 1); + className = className + .substring(className.lastIndexOf('.') + 1); + + // Remove mangled nested class names + char[] chars = className.toCharArray(); + int index = -1; + for (int j = 0; j < chars.length; j++) { + if (chars[j] <= 0x2D) { + index = j; + break; + } + } + if (index > -1) { + className = className.substring(0, index); + } + // Add .java to the end + value = cpBands.cpUTF8Value(className + ".java", true); + } + classAttributes[i].add(new SourceFileAttribute((CPUTF8)value)); + sourceFileIndex++; + } + if (enclosingMethodLayout.matches(flag)) { + CPClass theClass = cpBands + .cpClassValue(enclosingMethodRC[enclosingMethodIndex]); + CPNameAndType theMethod = null; + if(enclosingMethodRDN[enclosingMethodIndex] != 0) { + theMethod = cpBands + .cpNameAndTypeValue(enclosingMethodRDN[enclosingMethodIndex] - 1); + } + classAttributes[i].add(new EnclosingMethodAttribute(theClass, + theMethod)); + enclosingMethodIndex++; + } + if (signatureLayout.matches(flag)) { + long result = classSignature[signatureIndex]; + CPUTF8 value = (CPUTF8) signatureLayout.getValue(result, cpBands + .getConstantPool()); + classAttributes[i].add(new SignatureAttribute(value)); + signatureIndex++; + } + if (innerClassLayout.matches(flag)) { + // Just create the tuples for now because the attributes are + // decided at the end when creating class constant pools + icLocal[i] = new IcTuple[classInnerClassesN[innerClassIndex]]; + for (int j = 0; j < icLocal[i].length; j++) { + int icTupleCIndex = classInnerClassesRC[innerClassIndex][j]; + int icTupleC2Index = -1; + int icTupleNIndex = -1; + + String icTupleC = cpClass[icTupleCIndex]; + int icTupleF = classInnerClassesF[innerClassIndex][j]; + String icTupleC2 = null; + String icTupleN = null; + + if (icTupleF != 0) { + icTupleC2Index = classInnerClassesOuterRCN[innerClassC2NIndex]; + icTupleNIndex = classInnerClassesNameRUN[innerClassC2NIndex]; + icTupleC2 = cpClass[icTupleC2Index]; + icTupleN = cpUTF8[icTupleNIndex]; + innerClassC2NIndex++; + } else { + // Get from icBands + IcBands icBands = segment.getIcBands(); + IcTuple[] icAll = icBands.getIcTuples(); + for (int k = 0; k < icAll.length; k++) { + if (icAll[k].getC().equals(icTupleC)) { + icTupleF = icAll[k].getF(); + icTupleC2 = icAll[k].getC2(); + icTupleN = icAll[k].getN(); + break; + } + } + } + + IcTuple icTuple = new IcTuple(icTupleC, icTupleF, + icTupleC2, icTupleN, icTupleCIndex, icTupleC2Index, icTupleNIndex, j); + icLocal[i][j] = icTuple; + } + innerClassIndex++; + } + if (versionLayout.matches(flag)) { + classVersionMajor[i] = classFileVersionMajorH[versionIndex]; + classVersionMinor[i] = classFileVersionMinorH[versionIndex]; + versionIndex++; + } else if (classVersionMajor != null) { + // Fill in with defaults + classVersionMajor[i] = defaultVersionMajor; + classVersionMinor[i] = defaultVersionMinor; + } + // Non-predefined attributes + for (int j = 0; j < otherLayouts.length; j++) { + if (otherLayouts[j] != null && otherLayouts[j].matches(flag)) { + // Add the next attribute + classAttributes[i].add(otherAttributes[j].get(0)); + otherAttributes[j].remove(0); + } + } + } + } + + private void parseCodeBands(InputStream in) throws Pack200Exception, + IOException { + AttributeLayout layout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_CODE, AttributeLayout.CONTEXT_METHOD); + + int codeCount = SegmentUtils.countMatches(methodFlags, layout); + int[] codeHeaders = decodeBandInt("code_headers", in, Codec.BYTE1, + codeCount); + + boolean allCodeHasFlags = segment.getSegmentHeader().getOptions().hasAllCodeFlags(); + if(!allCodeHasFlags) { + codeHasAttributes = new boolean[codeCount]; + } + int codeSpecialHeader = 0; + for (int i = 0; i < codeCount; i++) { + if (codeHeaders[i] == 0) { + codeSpecialHeader++; + if(!allCodeHasFlags) { + codeHasAttributes[i] = true; + } + } + } + int[] codeMaxStackSpecials = decodeBandInt("code_max_stack", in, + Codec.UNSIGNED5, codeSpecialHeader); + int[] codeMaxNALocalsSpecials = decodeBandInt("code_max_na_locals", in, + Codec.UNSIGNED5, codeSpecialHeader); + int[] codeHandlerCountSpecials = decodeBandInt("code_handler_count", + in, Codec.UNSIGNED5, codeSpecialHeader); + + codeMaxStack = new int[codeCount]; + codeMaxNALocals = new int[codeCount]; + codeHandlerCount = new int[codeCount]; + int special = 0; + for (int i = 0; i < codeCount; i++) { + int header = 0xff & codeHeaders[i]; + if (header < 0) { + throw new IllegalStateException("Shouldn't get here"); + } else if (header == 0) { + codeMaxStack[i] = codeMaxStackSpecials[special]; + codeMaxNALocals[i] = codeMaxNALocalsSpecials[special]; + codeHandlerCount[i] = codeHandlerCountSpecials[special]; + special++; + } else if (header <= 144) { + codeMaxStack[i] = (header - 1) % 12; + codeMaxNALocals[i] = (header - 1) / 12; + codeHandlerCount[i] = 0; + } else if (header <= 208) { + codeMaxStack[i] = (header - 145) % 8; + codeMaxNALocals[i] = (header - 145) / 8; + codeHandlerCount[i] = 1; + } else if (header <= 255) { + codeMaxStack[i] = (header - 209) % 7; + codeMaxNALocals[i] = (header - 209) / 7; + codeHandlerCount[i] = 2; + } else { + throw new IllegalStateException("Shouldn't get here either"); + } + } + codeHandlerStartP = decodeBandInt("code_handler_start_P", in, + Codec.BCI5, codeHandlerCount); + codeHandlerEndPO = decodeBandInt("code_handler_end_PO", in, + Codec.BRANCH5, codeHandlerCount); + codeHandlerCatchPO = decodeBandInt("code_handler_catch_PO", in, + Codec.BRANCH5, codeHandlerCount); + codeHandlerClassRCN = decodeBandInt( + "code_handler_class_RCN", in, Codec.UNSIGNED5, codeHandlerCount); + + int codeFlagsCount = allCodeHasFlags ? codeCount : codeSpecialHeader; + + codeAttributes = new List[codeFlagsCount]; + for (int i = 0; i < codeAttributes.length; i++) { + codeAttributes[i] = new ArrayList(); + } + parseCodeAttrBands(in, codeFlagsCount); + } + + private void parseCodeAttrBands(InputStream in, int codeFlagsCount) + throws IOException, Pack200Exception { + long[] codeFlags = parseFlags("code_flags", in, codeFlagsCount, + Codec.UNSIGNED5, segment.getSegmentHeader().getOptions() + .hasCodeFlagsHi()); + int codeAttrCount = SegmentUtils.countBit16(codeFlags); + int[] codeAttrCounts = decodeBandInt("code_attr_count", in, + Codec.UNSIGNED5, codeAttrCount); + int[][] codeAttrIndexes = decodeBandInt("code_attr_indexes", in, + Codec.UNSIGNED5, codeAttrCounts); + int callCount = 0; + for (int i = 0; i < codeAttrIndexes.length; i++) { + for (int j = 0; j < codeAttrIndexes[i].length; j++) { + int index = codeAttrIndexes[i][j]; + AttributeLayout layout = attrMap.getAttributeLayout(index, + AttributeLayout.CONTEXT_CODE); + callCount += layout.numBackwardsCallables(); + } + } + int[] codeAttrCalls = decodeBandInt("code_attr_calls", in, + Codec.UNSIGNED5, callCount); + + AttributeLayout lineNumberTableLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_LINE_NUMBER_TABLE, + AttributeLayout.CONTEXT_CODE); + int lineNumberTableCount = SegmentUtils.countMatches(codeFlags, + lineNumberTableLayout); + int[] lineNumberTableN = decodeBandInt("code_LineNumberTable_N", in, + Codec.UNSIGNED5, lineNumberTableCount); + int[][] lineNumberTableBciP = decodeBandInt( + "code_LineNumberTable_bci_P", in, Codec.BCI5, lineNumberTableN); + int[][] lineNumberTableLine = decodeBandInt( + "code_LineNumberTable_line", in, Codec.UNSIGNED5, + lineNumberTableN); + + AttributeLayout localVariableTableLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_LOCAL_VARIABLE_TABLE, + AttributeLayout.CONTEXT_CODE); + AttributeLayout localVariableTypeTableLayout = attrMap + .getAttributeLayout( + AttributeLayout.ATTRIBUTE_LOCAL_VARIABLE_TYPE_TABLE, + AttributeLayout.CONTEXT_CODE); + + int lengthLocalVariableNBand = SegmentUtils.countMatches(codeFlags, + localVariableTableLayout); + int[] localVariableTableN = decodeBandInt("code_LocalVariableTable_N", + in, Codec.UNSIGNED5, lengthLocalVariableNBand); + int[][] localVariableTableBciP = decodeBandInt( + "code_LocalVariableTable_bci_P", in, Codec.BCI5, + localVariableTableN); + int[][] localVariableTableSpanO = decodeBandInt( + "code_LocalVariableTable_span_O", in, Codec.BRANCH5, + localVariableTableN); + CPUTF8[][] localVariableTableNameRU = parseCPUTF8References( + "code_LocalVariableTable_name_RU", in, Codec.UNSIGNED5, + localVariableTableN); + CPUTF8[][] localVariableTableTypeRS = parseCPSignatureReferences( + "code_LocalVariableTable_type_RS", in, Codec.UNSIGNED5, + localVariableTableN); + int[][] localVariableTableSlot = decodeBandInt( + "code_LocalVariableTable_slot", in, Codec.UNSIGNED5, + localVariableTableN); + + int lengthLocalVariableTypeTableNBand = SegmentUtils.countMatches( + codeFlags, localVariableTypeTableLayout); + int[] localVariableTypeTableN = decodeBandInt( + "code_LocalVariableTypeTable_N", in, Codec.UNSIGNED5, + lengthLocalVariableTypeTableNBand); + int[][] localVariableTypeTableBciP = decodeBandInt( + "code_LocalVariableTypeTable_bci_P", in, Codec.BCI5, + localVariableTypeTableN); + int[][] localVariableTypeTableSpanO = decodeBandInt( + "code_LocalVariableTypeTable_span_O", in, Codec.BRANCH5, + localVariableTypeTableN); + CPUTF8[][] localVariableTypeTableNameRU = parseCPUTF8References( + "code_LocalVariableTypeTable_name_RU", in, Codec.UNSIGNED5, + localVariableTypeTableN); + CPUTF8[][] localVariableTypeTableTypeRS = parseCPSignatureReferences( + "code_LocalVariableTypeTable_type_RS", in, Codec.UNSIGNED5, + localVariableTypeTableN); + int[][] localVariableTypeTableSlot = decodeBandInt( + "code_LocalVariableTypeTable_slot", in, Codec.UNSIGNED5, + localVariableTypeTableN); + + // Parse non-predefined attribute bands + int backwardsCallIndex = 0; + int limit = options.hasCodeFlagsHi() ? 62 : 31; + AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1]; + int[] counts = new int[limit + 1]; + List[] otherAttributes = new List[limit + 1]; + for (int i = 0; i < limit; i++) { + AttributeLayout layout = attrMap.getAttributeLayout(i, + AttributeLayout.CONTEXT_CODE); + if (layout != null && !(layout.isDefaultLayout())) { + otherLayouts[i] = layout; + counts[i] = SegmentUtils.countMatches(codeFlags, layout); + } + } + for (int i = 0; i < counts.length; i++) { + if (counts[i] > 0) { + NewAttributeBands bands = attrMap + .getAttributeBands(otherLayouts[i]); + otherAttributes[i] = bands.parseAttributes(in, counts[i]); + int numBackwardsCallables = otherLayouts[i] + .numBackwardsCallables(); + if (numBackwardsCallables > 0) { + int[] backwardsCalls = new int[numBackwardsCallables]; + System.arraycopy(codeAttrCalls, backwardsCallIndex, + backwardsCalls, 0, numBackwardsCallables); + bands.setBackwardsCalls(backwardsCalls); + backwardsCallIndex += numBackwardsCallables; + } + } + } + + int lineNumberIndex = 0; + int lvtIndex = 0; + int lvttIndex = 0; + for (int i = 0; i < codeFlagsCount; i++) { + if (lineNumberTableLayout.matches(codeFlags[i])) { + LineNumberTableAttribute lnta = new LineNumberTableAttribute( + lineNumberTableN[lineNumberIndex], + lineNumberTableBciP[lineNumberIndex], + lineNumberTableLine[lineNumberIndex]); + lineNumberIndex++; + codeAttributes[i].add(lnta); + } + if (localVariableTableLayout.matches(codeFlags[i])) { + LocalVariableTableAttribute lvta = new LocalVariableTableAttribute( + localVariableTableN[lvtIndex], + localVariableTableBciP[lvtIndex], + localVariableTableSpanO[lvtIndex], + localVariableTableNameRU[lvtIndex], + localVariableTableTypeRS[lvtIndex], + localVariableTableSlot[lvtIndex]); + lvtIndex++; + codeAttributes[i].add(lvta); + } + if (localVariableTypeTableLayout.matches(codeFlags[i])) { + LocalVariableTypeTableAttribute lvtta = new LocalVariableTypeTableAttribute( + localVariableTypeTableN[lvttIndex], + localVariableTypeTableBciP[lvttIndex], + localVariableTypeTableSpanO[lvttIndex], + localVariableTypeTableNameRU[lvttIndex], + localVariableTypeTableTypeRS[lvttIndex], + localVariableTypeTableSlot[lvttIndex]); + lvttIndex++; + codeAttributes[i].add(lvtta); + } + // Non-predefined attributes + for (int j = 0; j < otherLayouts.length; j++) { + if (otherLayouts[j] != null + && otherLayouts[j].matches(codeFlags[i])) { + // Add the next attribute + codeAttributes[i].add(otherAttributes[j].get(0)); + otherAttributes[j].remove(0); + } + } + } + + } + + private int parseFieldMetadataBands(InputStream in, int[] fieldAttrCalls) + throws Pack200Exception, IOException { + int backwardsCallsUsed = 0; + String[] RxA = new String[] { "RVA", "RIA" }; + + AttributeLayout rvaLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_FIELD); + AttributeLayout riaLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_FIELD); + + int rvaCount = SegmentUtils.countMatches(fieldFlags, rvaLayout); + int riaCount = SegmentUtils.countMatches(fieldFlags, riaLayout); + int[] RxACount = new int[] { rvaCount, riaCount }; + int[] backwardsCalls = new int[] { 0, 0 }; + if (rvaCount > 0) { + backwardsCalls[0] = fieldAttrCalls[0]; + backwardsCallsUsed++; + if (riaCount > 0) { + backwardsCalls[1] = fieldAttrCalls[1]; + backwardsCallsUsed++; + } + } else if (riaCount > 0) { + backwardsCalls[1] = fieldAttrCalls[0]; + backwardsCallsUsed++; + } + MetadataBandGroup[] mb = parseMetadata(in, RxA, RxACount, + backwardsCalls, "field"); + List rvaAttributes = mb[0].getAttributes(); + List riaAttributes = mb[1].getAttributes(); + int rvaAttributesIndex = 0; + int riaAttributesIndex = 0; + for (int i = 0; i < fieldFlags.length; i++) { + for (int j = 0; j < fieldFlags[i].length; j++) { + if (rvaLayout.matches(fieldFlags[i][j])) { + fieldAttributes[i][j].add(rvaAttributes.get(rvaAttributesIndex++)); + } + if (riaLayout.matches(fieldFlags[i][j])) { + fieldAttributes[i][j].add(riaAttributes.get(riaAttributesIndex++)); + } + } + } + return backwardsCallsUsed; + } + + private MetadataBandGroup[] parseMetadata(InputStream in, String[] RxA, + int[] RxACount, int[] backwardsCallCounts, String contextName) + throws IOException, Pack200Exception { + MetadataBandGroup[] mbg = new MetadataBandGroup[RxA.length]; + for (int i = 0; i < RxA.length; i++) { + mbg[i] = new MetadataBandGroup(RxA[i], cpBands); + String rxa = RxA[i]; + if (rxa.indexOf('P') >= 0) { + mbg[i].param_NB = decodeBandInt(contextName + "_" + rxa + + "_param_NB", in, Codec.BYTE1, RxACount[i]); + } + int pairCount = 0; + if (!rxa.equals("AD")) { + mbg[i].anno_N = decodeBandInt(contextName + "_" + rxa + + "_anno_N", in, Codec.UNSIGNED5, RxACount[i]); + mbg[i].type_RS = parseCPSignatureReferences(contextName + + "_" + rxa + "_type_RS", in, Codec.UNSIGNED5, + mbg[i].anno_N); + mbg[i].pair_N = decodeBandInt(contextName + "_" + rxa + + "_pair_N", in, Codec.UNSIGNED5, mbg[i].anno_N); + for (int j = 0; j < mbg[i].pair_N.length; j++) { + for (int k = 0; k < mbg[i].pair_N[j].length; k++) { + pairCount += mbg[i].pair_N[j][k]; + } + } + + mbg[i].name_RU = parseCPUTF8References(contextName + + "_" + rxa + "_name_RU", in, Codec.UNSIGNED5, + pairCount); + } + mbg[i].T = decodeBandInt(contextName + "_" + rxa + "_T", in, + Codec.BYTE1, pairCount + backwardsCallCounts[i]); + int ICount = 0, DCount = 0, FCount = 0, JCount = 0, cCount = 0, eCount = 0, sCount = 0, arrayCount = 0, atCount = 0; + for (int j = 0; j < mbg[i].T.length; j++) { + char c = (char) mbg[i].T[j]; + switch (c) { + case 'B': + case 'C': + case 'I': + case 'S': + case 'Z': + ICount++; + break; + case 'D': + DCount++; + break; + case 'F': + FCount++; + break; + case 'J': + JCount++; + break; + case 'c': + cCount++; + break; + case 'e': + eCount++; + break; + case 's': + sCount++; + break; + case '[': + arrayCount++; + break; + case '@': + atCount++; + break; + } + } + mbg[i].caseI_KI = parseCPIntReferences(contextName + "_" + rxa + + "_caseI_KI", in, Codec.UNSIGNED5, ICount); + mbg[i].caseD_KD = parseCPDoubleReferences(contextName + "_" + rxa + + "_caseD_KD", in, Codec.UNSIGNED5, DCount); + mbg[i].caseF_KF = parseCPFloatReferences(contextName + "_" + rxa + + "_caseF_KF", in, Codec.UNSIGNED5, FCount); + mbg[i].caseJ_KJ = parseCPLongReferences(contextName + "_" + rxa + + "_caseJ_KJ", in, Codec.UNSIGNED5, JCount); + mbg[i].casec_RS = parseCPUTF8References(contextName + "_" + rxa + + "_casec_RS", in, Codec.UNSIGNED5, cCount); + mbg[i].caseet_RS = parseReferences(contextName + "_" + rxa + + "_caseet_RS", in, Codec.UNSIGNED5, eCount, cpBands + .getCpSignature()); + mbg[i].caseec_RU = parseReferences(contextName + "_" + rxa + + "_caseec_RU", in, Codec.UNSIGNED5, eCount, cpBands + .getCpUTF8()); + mbg[i].cases_RU = parseCPUTF8References(contextName + "_" + rxa + + "_cases_RU", in, Codec.UNSIGNED5, sCount); + mbg[i].casearray_N = decodeBandInt(contextName + "_" + rxa + + "_casearray_N", in, Codec.UNSIGNED5, arrayCount); + mbg[i].nesttype_RS = parseCPUTF8References(contextName + "_" + rxa + + "_nesttype_RS", in, Codec.UNSIGNED5, atCount); + mbg[i].nestpair_N = decodeBandInt(contextName + "_" + rxa + + "_nestpair_N", in, Codec.UNSIGNED5, atCount); + int nestPairCount = 0; + for (int j = 0; j < mbg[i].nestpair_N.length; j++) { + nestPairCount += mbg[i].nestpair_N[j]; + } + mbg[i].nestname_RU = parseCPUTF8References(contextName + "_" + rxa + + "_nestname_RU", in, Codec.UNSIGNED5, nestPairCount); + } + return mbg; + } + + private int parseMethodMetadataBands(InputStream in, int[] methodAttrCalls) + throws Pack200Exception, IOException { + int backwardsCallsUsed = 0; + String[] RxA = new String[] { "RVA", "RIA", "RVPA", "RIPA", "AD" }; + int[] rxaCounts = new int[] { 0, 0, 0, 0, 0 }; + int[] backwardsCalls = new int[5]; + int methodAttrIndex = 0; + for (int i = 0; i < backwardsCalls.length; i++) { + if (rxaCounts[i] > 0) { + backwardsCallsUsed++; + backwardsCalls[i] = methodAttrCalls[methodAttrIndex]; + methodAttrIndex++; + } else { + backwardsCalls[i] = 0; + } + } + AttributeLayout rvaLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_METHOD); + AttributeLayout riaLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_METHOD); + AttributeLayout rvpaLayout = attrMap + .getAttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, + AttributeLayout.CONTEXT_METHOD); + AttributeLayout ripaLayout = attrMap + .getAttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS, + AttributeLayout.CONTEXT_METHOD); + AttributeLayout adLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_ANNOTATION_DEFAULT, + AttributeLayout.CONTEXT_METHOD); + AttributeLayout[] rxaLayouts = new AttributeLayout[] { rvaLayout, + riaLayout, rvpaLayout, ripaLayout, adLayout }; + + for (int i = 0; i < rxaLayouts.length; i++) { + rxaCounts[i] = SegmentUtils + .countMatches(methodFlags, rxaLayouts[i]); + } + MetadataBandGroup[] mbgs = parseMetadata(in, RxA, rxaCounts, + backwardsCalls, "method"); + List[] attributeLists = new List[RxA.length]; + int[] attributeListIndexes = new int[RxA.length]; + for (int i = 0; i < mbgs.length; i++) { + attributeLists[i] = mbgs[i].getAttributes(); + attributeListIndexes[i] = 0; + } + for (int i = 0; i < methodFlags.length; i++) { + for (int j = 0; j < methodFlags[i].length; j++) { + for (int k = 0; k < rxaLayouts.length; k++) { + if (rxaLayouts[k].matches(methodFlags[i][j])) { + methodAttributes[i][j] + .add(attributeLists[k].get(attributeListIndexes[k]++)); + } + } + } + } + return backwardsCallsUsed; + } + + /** + * Parse the class metadata bands and return the number of backwards + * callables + * + * @param in + * @param classAttrCalls + * @return + * @throws Pack200Exception + * @throws IOException + */ + private int parseClassMetadataBands(InputStream in, int[] classAttrCalls) + throws Pack200Exception, IOException { + int numBackwardsCalls = 0; + String[] RxA = new String[] { "RVA", "RIA" }; + + AttributeLayout rvaLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_CLASS); + AttributeLayout riaLayout = attrMap.getAttributeLayout( + AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS, + AttributeLayout.CONTEXT_CLASS); + int rvaCount = SegmentUtils.countMatches(classFlags, rvaLayout); + int riaCount = SegmentUtils.countMatches(classFlags, riaLayout); + int[] RxACount = new int[] { rvaCount, riaCount }; + int[] backwardsCalls = new int[] { 0, 0 }; + if (rvaCount > 0) { + numBackwardsCalls++; + backwardsCalls[0] = classAttrCalls[0]; + if (riaCount > 0) { + numBackwardsCalls++; + backwardsCalls[1] = classAttrCalls[1]; + } + } else if (riaCount > 0) { + numBackwardsCalls++; + backwardsCalls[1] = classAttrCalls[0]; + } + MetadataBandGroup[] mbgs = parseMetadata(in, RxA, RxACount, + backwardsCalls, "class"); + List rvaAttributes = mbgs[0].getAttributes(); + List riaAttributes = mbgs[1].getAttributes(); + int rvaAttributesIndex = 0; + int riaAttributesIndex = 0; + for (int i = 0; i < classFlags.length; i++) { + if (rvaLayout.matches(classFlags[i])) { + classAttributes[i].add(rvaAttributes.get(rvaAttributesIndex++)); + } + if (riaLayout.matches(classFlags[i])) { + classAttributes[i].add(riaAttributes.get(riaAttributesIndex++)); + } + } + return numBackwardsCalls; + } + + public ArrayList[] getClassAttributes() { + return classAttributes; + } + + public int[] getClassFieldCount() { + return classFieldCount; + } + + public long[] getRawClassFlags() { + return classFlags; + } + + public long[] getClassFlags() throws Pack200Exception { + if (classAccessFlags == null) { + long mask = 0x7FFF; + for (int i = 0; i < 16; i++) { + AttributeLayout layout = attrMap.getAttributeLayout(i, + AttributeLayout.CONTEXT_CLASS); + if (layout != null && !layout.isDefaultLayout()) { + mask &= ~(1 << i); + } + } + classAccessFlags = new long[classFlags.length]; + for (int i = 0; i < classFlags.length; i++) { + classAccessFlags[i] = classFlags[i] & mask; + } + } + return classAccessFlags; + } + + public int[][] getClassInterfacesInts() { + return classInterfacesInts; + } + + public int[] getClassMethodCount() { + return classMethodCount; + } + + public int[] getClassSuperInts() { + return classSuperInts; + } + + public int[] getClassThisInts() { + return classThisInts; + } + + public int[] getCodeMaxNALocals() { + return codeMaxNALocals; + } + + public int[] getCodeMaxStack() { + return codeMaxStack; + } + + public ArrayList[][] getFieldAttributes() { + return fieldAttributes; + } + + public int[][] getFieldDescrInts() { + return fieldDescrInts; + } + + public int[][] getMethodDescrInts() { + return methodDescrInts; + } + + public long[][] getFieldFlags() throws Pack200Exception { + if (fieldAccessFlags == null) { + long mask = 0x7FFF; + for (int i = 0; i < 16; i++) { + AttributeLayout layout = attrMap.getAttributeLayout(i, + AttributeLayout.CONTEXT_FIELD); + if (layout != null && !layout.isDefaultLayout()) { + mask &= ~(1 << i); + } + } + fieldAccessFlags = new long[fieldFlags.length][]; + for (int i = 0; i < fieldFlags.length; i++) { + fieldAccessFlags[i] = new long[fieldFlags[i].length]; + for (int j = 0; j < fieldFlags[i].length; j++) { + fieldAccessFlags[i][j] = fieldFlags[i][j] & mask; + } + } + } + return fieldAccessFlags; + } + + /** + * Answer an ArrayList of ArrayLists which hold the the code attributes + * corresponding to all classes in order. + * + * If a class doesn't have any attributes, the corresponding element in this + * list will be an empty ArrayList. + * + * @return ArrayList + */ + public ArrayList getOrderedCodeAttributes() { + ArrayList orderedAttributeList = new ArrayList(codeAttributes.length); + for (int classIndex = 0; classIndex < codeAttributes.length; classIndex++) { + ArrayList currentAttributes = new ArrayList(codeAttributes[classIndex].size()); + for (int attributeIndex = 0; attributeIndex < codeAttributes[classIndex] + .size(); attributeIndex++) { + Attribute attribute = (Attribute) codeAttributes[classIndex] + .get(attributeIndex); + currentAttributes.add(attribute); + } + orderedAttributeList.add(currentAttributes); + } + return orderedAttributeList; + } + + public ArrayList[][] getMethodAttributes() { + return methodAttributes; + } + + public String[][] getMethodDescr() { + return methodDescr; + } + + public long[][] getMethodFlags() throws Pack200Exception { + if (methodAccessFlags == null) { + long mask = 0x7FFF; + for (int i = 0; i < 16; i++) { + AttributeLayout layout = attrMap.getAttributeLayout(i, + AttributeLayout.CONTEXT_METHOD); + if (layout != null && !layout.isDefaultLayout()) { + mask &= ~(1 << i); + } + } + methodAccessFlags = new long[methodFlags.length][]; + for (int i = 0; i < methodFlags.length; i++) { + methodAccessFlags[i] = new long[methodFlags[i].length]; + for (int j = 0; j < methodFlags[i].length; j++) { + methodAccessFlags[i][j] = methodFlags[i][j] & mask; + } + } + } + return methodAccessFlags; + } + + /** + * Returns null if all classes should use the default major and minor + * version or an array of integers containing the major version numberss to + * use for each class in the segment + * + * @return Class file major version numbers, or null if none specified + */ + public int[] getClassVersionMajor() { + return classVersionMajor; + } + + /** + * Returns null if all classes should use the default major and minor + * version or an array of integers containing the minor version numberss to + * use for each class in the segment + * + * @return Class file minor version numbers, or null if none specified + */ + public int[] getClassVersionMinor() { + return classVersionMinor; + } + + public int[] getCodeHandlerCount() { + return codeHandlerCount; + } + + public int[][] getCodeHandlerCatchPO() { + return codeHandlerCatchPO; + } + + public int[][] getCodeHandlerClassRCN() { + return codeHandlerClassRCN; + } + + public int[][] getCodeHandlerEndPO() { + return codeHandlerEndPO; + } + + public int[][] getCodeHandlerStartP() { + return codeHandlerStartP; + } + + public IcTuple[][] getIcLocal() { + return icLocal; + } + + public boolean[] getCodeHasAttributes() { + return codeHasAttributes; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/CpBands.java b/src/main/java/org/apache/harmony/unpack200/CpBands.java new file mode 100644 index 0000000..b5b6918 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/CpBands.java @@ -0,0 +1,724 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.CPClass; +import org.apache.harmony.unpack200.bytecode.CPDouble; +import org.apache.harmony.unpack200.bytecode.CPFieldRef; +import org.apache.harmony.unpack200.bytecode.CPFloat; +import org.apache.harmony.unpack200.bytecode.CPInteger; +import org.apache.harmony.unpack200.bytecode.CPInterfaceMethodRef; +import org.apache.harmony.unpack200.bytecode.CPLong; +import org.apache.harmony.unpack200.bytecode.CPMethodRef; +import org.apache.harmony.unpack200.bytecode.CPNameAndType; +import org.apache.harmony.unpack200.bytecode.CPString; +import org.apache.harmony.unpack200.bytecode.CPUTF8; + +/** + * Constant Pool bands + */ +public class CpBands extends BandSet { + + public SegmentConstantPool getConstantPool() { + return pool; + } + + private final SegmentConstantPool pool = new SegmentConstantPool(this); + + private String[] cpClass; + private int[] cpClassInts; + private int[] cpDescriptorNameInts; + private int[] cpDescriptorTypeInts; + private String[] cpDescriptor; + private double[] cpDouble; + private String[] cpFieldClass; + private String[] cpFieldDescriptor; + private int[] cpFieldClassInts; + private int[] cpFieldDescriptorInts; + private float[] cpFloat; + private String[] cpIMethodClass; + private String[] cpIMethodDescriptor; + private int[] cpIMethodClassInts; + private int[] cpIMethodDescriptorInts; + private int[] cpInt; + private long[] cpLong; + private String[] cpMethodClass; + private String[] cpMethodDescriptor; + private int[] cpMethodClassInts; + private int[] cpMethodDescriptorInts; + private String[] cpSignature; + private int[] cpSignatureInts; + private String[] cpString; + private int[] cpStringInts; + private String[] cpUTF8; + + private final Map stringsToCPUTF8 = new HashMap(); + private final Map stringsToCPStrings = new HashMap(); + private final Map longsToCPLongs = new HashMap(); + private final Map integersToCPIntegers = new HashMap(); + private final Map floatsToCPFloats = new HashMap(); + private final Map stringsToCPClass = new HashMap(); + private final Map doublesToCPDoubles = new HashMap(); + private final Map descriptorsToCPNameAndTypes = new HashMap(); + + private Map mapClass; + private Map mapDescriptor; + private Map mapUTF8; + +// TODO: Not used +// private Map mapSignature; + + private int intOffset; + private int floatOffset; + private int longOffset; + private int doubleOffset; + private int stringOffset; + private int classOffset; + private int signatureOffset; + private int descrOffset; + private int fieldOffset; + private int methodOffset; + private int imethodOffset; + + public CpBands(Segment segment) { + super(segment); + } + + public void read(InputStream in) throws IOException, Pack200Exception { + parseCpUtf8(in); + parseCpInt(in); + parseCpFloat(in); + parseCpLong(in); + parseCpDouble(in); + parseCpString(in); + parseCpClass(in); + parseCpSignature(in); + parseCpDescriptor(in); + parseCpField(in); + parseCpMethod(in); + parseCpIMethod(in); + + intOffset = cpUTF8.length; + floatOffset = intOffset + cpInt.length; + longOffset = floatOffset + cpFloat.length; + doubleOffset = longOffset + cpLong.length; + stringOffset = doubleOffset + cpDouble.length; + classOffset = stringOffset + cpString.length; + signatureOffset = classOffset + cpClass.length; + descrOffset = signatureOffset + cpSignature.length; + fieldOffset = descrOffset + cpDescriptor.length; + methodOffset = fieldOffset + cpFieldClass.length; + imethodOffset = methodOffset + cpMethodClass.length; + } + + public void unpack() { + + } + + /** + * Parses the constant pool class names, using {@link #cpClassCount} to + * populate {@link #cpClass} from {@link #cpUTF8}. + * + * @param in + * the input stream to read from + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * codec + */ + private void parseCpClass(InputStream in) throws IOException, + Pack200Exception { + int cpClassCount = header.getCpClassCount(); + cpClassInts = decodeBandInt("cp_Class", in, Codec.UDELTA5, cpClassCount); + cpClass = new String[cpClassCount]; + mapClass = new HashMap(cpClassCount); + for (int i = 0; i < cpClassCount; i++) { + cpClass[i] = cpUTF8[cpClassInts[i]]; + mapClass.put(cpClass[i], new Integer(i)); + } + } + + /** + * Parses the constant pool descriptor definitions, using + * {@link #cpDescriptorCount} to populate {@link #cpDescriptor}. For ease + * of use, the cpDescriptor is stored as a string of the form name:type, + * largely to make it easier for representing field and method descriptors + * (e.g. out:java.lang.PrintStream) in a way that is + * compatible with passing String arrays. + * + * @param in + * the input stream to read from + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * codec + */ + private void parseCpDescriptor(InputStream in) throws IOException, + Pack200Exception { + int cpDescriptorCount = header.getCpDescriptorCount(); + cpDescriptorNameInts = decodeBandInt("cp_Descr_name", in, Codec.DELTA5, + cpDescriptorCount); + cpDescriptorTypeInts = decodeBandInt("cp_Descr_type", in, + Codec.UDELTA5, cpDescriptorCount); + String[] cpDescriptorNames = getReferences(cpDescriptorNameInts, cpUTF8); + String[] cpDescriptorTypes = getReferences(cpDescriptorTypeInts, + cpSignature); + cpDescriptor = new String[cpDescriptorCount]; + mapDescriptor = new HashMap(cpDescriptorCount); + for (int i = 0; i < cpDescriptorCount; i++) { + cpDescriptor[i] = cpDescriptorNames[i] + ":" + cpDescriptorTypes[i]; //$NON-NLS-1$ + mapDescriptor.put(cpDescriptor[i], new Integer(i)); + } + } + + private void parseCpDouble(InputStream in) throws IOException, + Pack200Exception { + int cpDoubleCount = header.getCpDoubleCount(); + long[] band = parseFlags("cp_Double", in, cpDoubleCount, Codec.UDELTA5, + Codec.DELTA5); + cpDouble = new double[band.length]; + for (int i = 0; i < band.length; i++) { + cpDouble[i] = Double.longBitsToDouble(band[i]); + } + } + + /** + * Parses the constant pool field definitions, using {@link #cpFieldCount} + * to populate {@link #cpFieldClass} and {@link #cpFieldDescriptor}. + * + * @param in + * the input stream to read from + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * codec + */ + private void parseCpField(InputStream in) throws IOException, + Pack200Exception { + int cpFieldCount = header.getCpFieldCount(); + cpFieldClassInts = decodeBandInt("cp_Field_class", in, Codec.DELTA5, + cpFieldCount); + cpFieldDescriptorInts = decodeBandInt("cp_Field_desc", in, Codec.UDELTA5, + cpFieldCount); + cpFieldClass = new String[cpFieldCount]; + cpFieldDescriptor = new String[cpFieldCount]; + for (int i = 0; i < cpFieldCount; i++) { + cpFieldClass[i] = cpClass[cpFieldClassInts[i]]; + cpFieldDescriptor[i] = cpDescriptor[cpFieldDescriptorInts[i]]; + } + } + + private void parseCpFloat(InputStream in) throws IOException, + Pack200Exception { + int cpFloatCount = header.getCpFloatCount(); + cpFloat = new float[cpFloatCount]; + int floatBits[] = decodeBandInt("cp_Float", in, Codec.UDELTA5, + cpFloatCount); + for (int i = 0; i < cpFloatCount; i++) { + cpFloat[i] = Float.intBitsToFloat(floatBits[i]); + } + } + + /** + * Parses the constant pool interface method definitions, using + * {@link #cpIMethodCount} to populate {@link #cpIMethodClass} and + * {@link #cpIMethodDescriptor}. + * + * @param in + * the input stream to read from + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * codec + */ + private void parseCpIMethod(InputStream in) throws IOException, + Pack200Exception { + int cpIMethodCount = header.getCpIMethodCount(); + cpIMethodClassInts = decodeBandInt("cp_Imethod_class", in, Codec.DELTA5, + cpIMethodCount); + cpIMethodDescriptorInts = decodeBandInt("cp_Imethod_desc", in, + Codec.UDELTA5, cpIMethodCount); + cpIMethodClass = new String[cpIMethodCount]; + cpIMethodDescriptor = new String[cpIMethodCount]; + for (int i = 0; i < cpIMethodCount; i++) { + cpIMethodClass[i] = cpClass[cpIMethodClassInts[i]]; + cpIMethodDescriptor[i] = cpDescriptor[cpIMethodDescriptorInts[i]]; + } + } + + private void parseCpInt(InputStream in) throws IOException, + Pack200Exception { + int cpIntCount = header.getCpIntCount(); + cpInt = decodeBandInt("cpInt", in, Codec.UDELTA5, cpIntCount); + } + + private void parseCpLong(InputStream in) throws IOException, + Pack200Exception { + int cpLongCount = header.getCpLongCount(); + cpLong = parseFlags("cp_Long", in, cpLongCount, Codec.UDELTA5, + Codec.DELTA5); + } + + /** + * Parses the constant pool method definitions, using {@link #cpMethodCount} + * to populate {@link #cpMethodClass} and {@link #cpMethodDescriptor}. + * + * @param in + * the input stream to read from + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * codec + */ + private void parseCpMethod(InputStream in) throws IOException, + Pack200Exception { + int cpMethodCount = header.getCpMethodCount(); + cpMethodClassInts = decodeBandInt("cp_Method_class", in, Codec.DELTA5, + cpMethodCount); + cpMethodDescriptorInts = decodeBandInt("cp_Method_desc", in, + Codec.UDELTA5, cpMethodCount); + cpMethodClass = new String[cpMethodCount]; + cpMethodDescriptor = new String[cpMethodCount]; + for (int i = 0; i < cpMethodCount; i++) { + cpMethodClass[i] = cpClass[cpMethodClassInts[i]]; + cpMethodDescriptor[i] = cpDescriptor[cpMethodDescriptorInts[i]]; + } + } + + /** + * Parses the constant pool signature classes, using + * {@link #cpSignatureCount} to populate {@link #cpSignature}. A signature + * form is akin to the bytecode representation of a class; Z for boolean, I + * for int, [ for array etc. However, although classes are started with L, + * the classname does not follow the form; instead, there is a separate + * array of classes. So an array corresponding to + * public static void main(String args[]) has a form of + * [L(V) and a classes array of + * [java.lang.String]. The {@link #cpSignature} is a string + * representation identical to the bytecode equivalent + * [Ljava/lang/String;(V) TODO Check that the form is as + * above and update other types e.g. J + * + * @param in + * the input stream to read from + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * codec + */ + private void parseCpSignature(InputStream in) throws IOException, + Pack200Exception { + int cpSignatureCount = header.getCpSignatureCount(); + cpSignatureInts = decodeBandInt("cp_Signature_form", in, + Codec.DELTA5, cpSignatureCount); + String[] cpSignatureForm = getReferences(cpSignatureInts, cpUTF8); + cpSignature = new String[cpSignatureCount]; + int lCount = 0; + for (int i = 0; i < cpSignatureCount; i++) { + String form = cpSignatureForm[i]; + char[] chars = form.toCharArray(); + for (int j = 0; j < chars.length; j++) { + if (chars[j] == 'L') { + cpSignatureInts[i] = -1; + lCount++; + } + } + } + String[] cpSignatureClasses = parseReferences("cp_Signature_classes", + in, Codec.UDELTA5, lCount, cpClass); + int index = 0; + for (int i = 0; i < cpSignatureCount; i++) { + String form = cpSignatureForm[i]; + int len = form.length(); + StringBuffer signature = new StringBuffer(64); + ArrayList list = new ArrayList(); + for (int j = 0; j < len; j++) { + char c = form.charAt(j); + signature.append(c); + if (c == 'L') { + String className = cpSignatureClasses[index]; + list.add(className); + signature.append(className); + index++; + } + } + cpSignature[i] = signature.toString(); + } +// for (int i = 0; i < cpSignatureInts.length; i++) { +// if(cpSignatureInts[i] == -1) { +// cpSignatureInts[i] = search(cpUTF8, cpSignature[i]); +// } +// } + } + + /** + * Parses the constant pool strings, using {@link #cpStringCount} to + * populate {@link #cpString} from indexes into {@link #cpUTF8}. + * + * @param in + * the input stream to read from + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * codec + */ + private void parseCpString(InputStream in) throws IOException, + Pack200Exception { + int cpStringCount = header.getCpStringCount(); + cpStringInts = decodeBandInt("cp_String", in, Codec.UDELTA5, + cpStringCount); + cpString = new String[cpStringCount]; + for (int i = 0; i < cpStringCount; i++) { + cpString[i] = cpUTF8[cpStringInts[i]]; + } + } + + private void parseCpUtf8(InputStream in) throws IOException, + Pack200Exception { + int cpUTF8Count = header.getCpUTF8Count(); + cpUTF8 = new String[cpUTF8Count]; + mapUTF8 = new HashMap(cpUTF8Count+1); + cpUTF8[0] = ""; //$NON-NLS-1$ + mapUTF8.put("", new Integer(0)); + int[] prefix = decodeBandInt("cpUTF8Prefix", in, Codec.DELTA5, + cpUTF8Count - 2); + int charCount = 0; + int bigSuffixCount = 0; + int[] suffix = decodeBandInt("cpUTF8Suffix", in, Codec.UNSIGNED5, + cpUTF8Count - 1); + + for (int i = 0; i < suffix.length; i++) { + if (suffix[i] == 0) { + bigSuffixCount++; + } else { + charCount += suffix[i]; + } + } + char[] data = new char[charCount]; + int[] dataBand = decodeBandInt("cp_Utf8_chars", in, Codec.CHAR3, + charCount); + for (int i = 0; i < data.length; i++) { + data[i] = (char) dataBand[i]; + } + + // Read in the big suffix data + int[] bigSuffixCounts = decodeBandInt("cp_Utf8_big_suffix", in, + Codec.DELTA5, bigSuffixCount); + int[][] bigSuffixDataBand = new int[bigSuffixCount][]; + for (int i = 0; i < bigSuffixDataBand.length; i++) { + bigSuffixDataBand[i] = decodeBandInt("cp_Utf8_big_chars " + i, in, + Codec.DELTA5, bigSuffixCounts[i]); + } + + // Convert big suffix data to characters + char bigSuffixData[][] = new char[bigSuffixCount][]; + for (int i = 0; i < bigSuffixDataBand.length; i++) { + bigSuffixData[i] = new char[bigSuffixDataBand[i].length]; + for (int j = 0; j < bigSuffixDataBand[i].length; j++) { + bigSuffixData[i][j] = (char) bigSuffixDataBand[i][j]; + } + } + // Go through the strings + charCount = 0; + bigSuffixCount = 0; + for (int i = 1; i < cpUTF8Count; i++) { + String lastString = cpUTF8[i - 1]; + if (suffix[i - 1] == 0) { + // The big suffix stuff hasn't been tested, and I'll be + // surprised if it works first time w/o errors ... + cpUTF8[i] = lastString.substring(0, i > 1 ? prefix[i - 2] : 0) + + new String(bigSuffixData[bigSuffixCount++]); + mapUTF8.put(cpUTF8[i], new Integer(i)); + } else { + cpUTF8[i] = lastString.substring(0, i > 1 ? prefix[i - 2] : 0) + + new String(data, charCount, suffix[i - 1]); + charCount += suffix[i - 1]; + mapUTF8.put(cpUTF8[i], new Integer(i)); + } + } + } + + public String[] getCpClass() { + return cpClass; + } + + public String[] getCpDescriptor() { + return cpDescriptor; + } + + public double[] getCpDouble() { + return cpDouble; + } + + public String[] getCpFieldClass() { + return cpFieldClass; + } + + public String[] getCpFieldDescriptor() { + return cpFieldDescriptor; + } + + public float[] getCpFloat() { + return cpFloat; + } + + public String[] getCpIMethodClass() { + return cpIMethodClass; + } + + public String[] getCpIMethodDescriptor() { + return cpIMethodDescriptor; + } + + public int[] getCpInt() { + return cpInt; + } + + public long[] getCpLong() { + return cpLong; + } + + public String[] getCpMethodClass() { + return cpMethodClass; + } + + public String[] getCpMethodDescriptor() { + return cpMethodDescriptor; + } + + public String[] getCpSignature() { + return cpSignature; + } + + public String[] getCpString() { + return cpString; + } + + public String[] getCpUTF8() { + return cpUTF8; + } + + public CPUTF8 cpUTF8Value(int index) { + String string = cpUTF8[index]; + CPUTF8 cputf8 = (CPUTF8) stringsToCPUTF8.get(string); + if (cputf8 == null) { + cputf8 = new CPUTF8(string, index); + stringsToCPUTF8.put(string, cputf8); + } else if(cputf8.getGlobalIndex() > index) { + cputf8.setGlobalIndex(index); + } + return cputf8; + } + + public CPUTF8 cpUTF8Value(String string) { + return cpUTF8Value(string, true); + } + + public CPUTF8 cpUTF8Value(String string, boolean searchForIndex) { + CPUTF8 cputf8 = (CPUTF8) stringsToCPUTF8.get(string); + if (cputf8 == null) { + Integer index = null; + if(searchForIndex) { + index = (Integer)mapUTF8.get(string); + } + if(index != null) { + return cpUTF8Value(index.intValue()); + } + /* TODO: mapSignature is not filled anywhere + if(searchForIndex) { + index = (Integer)mapSignature.get(string); + } + if(index != null) { + return cpSignatureValue(index.intValue()); + }*/ + cputf8 = new CPUTF8(string, -1); + stringsToCPUTF8.put(string, cputf8); + } + return cputf8; + } + + public CPString cpStringValue(int index) { + String string = cpString[index]; + int utf8Index = cpStringInts[index]; + int globalIndex = stringOffset + index; + CPString cpString = (CPString) stringsToCPStrings.get(string); + if (cpString == null) { + cpString = new CPString(cpUTF8Value(utf8Index), globalIndex); + stringsToCPStrings.put(string, cpString); + } + return cpString; + } + + public CPLong cpLongValue(int index) { + Long l = new Long(cpLong[index]); + CPLong cpLong = (CPLong) longsToCPLongs.get(l); + if (cpLong == null) { + cpLong = new CPLong(l, index + longOffset); + longsToCPLongs.put(l, cpLong); + } + return cpLong; + } + + public CPInteger cpIntegerValue(int index) { + Integer i = new Integer(cpInt[index]); + CPInteger cpInteger = (CPInteger) integersToCPIntegers.get(i); + if (cpInteger == null) { + cpInteger = new CPInteger(i, index + intOffset); + integersToCPIntegers.put(i, cpInteger); + } + return cpInteger; + } + + public CPFloat cpFloatValue(int index) { + Float f = new Float(cpFloat[index]); + CPFloat cpFloat = (CPFloat) floatsToCPFloats.get(f); + if (cpFloat == null) { + cpFloat = new CPFloat(f, index + floatOffset); + floatsToCPFloats.put(f, cpFloat); + } + return cpFloat; + } + + public CPClass cpClassValue(int index) { + String string = cpClass[index]; + int utf8Index = cpClassInts[index]; + int globalIndex = classOffset + index; + CPClass cpString = (CPClass) stringsToCPClass.get(string); + if (cpString == null) { + cpString = new CPClass(cpUTF8Value(utf8Index), globalIndex); + stringsToCPClass.put(string, cpString); + } + return cpString; + } + + public CPClass cpClassValue(String string) { + CPClass cpString = (CPClass) stringsToCPClass.get(string); + if (cpString == null) { + Integer index = (Integer)mapClass.get(string); + if(index != null) { + return cpClassValue(index.intValue()); + } + cpString = new CPClass(cpUTF8Value(string, false), -1); + stringsToCPClass.put(string, cpString); + } + return cpString; + } + + public CPDouble cpDoubleValue(int index) { + Double dbl = new Double(cpDouble[index]); + CPDouble cpDouble = (CPDouble) doublesToCPDoubles.get(dbl); + if (cpDouble == null) { + cpDouble = new CPDouble(dbl, index + doubleOffset); + doublesToCPDoubles.put(dbl, cpDouble); + } + return cpDouble; + } + + public CPNameAndType cpNameAndTypeValue(int index) { + String descriptor = cpDescriptor[index]; + CPNameAndType cpNameAndType = (CPNameAndType) descriptorsToCPNameAndTypes + .get(descriptor); + if (cpNameAndType == null) { + int nameIndex = cpDescriptorNameInts[index]; + int descriptorIndex = cpDescriptorTypeInts[index]; + + CPUTF8 name = cpUTF8Value(nameIndex); + CPUTF8 descriptorU = cpSignatureValue(descriptorIndex); + cpNameAndType = new CPNameAndType(name, descriptorU, index + descrOffset); + descriptorsToCPNameAndTypes.put(descriptor, cpNameAndType); + } + return cpNameAndType; + } + + public CPInterfaceMethodRef cpIMethodValue(int index) { + return new CPInterfaceMethodRef(cpClassValue(cpIMethodClassInts[index]), + cpNameAndTypeValue(cpIMethodDescriptorInts[index]), index + + imethodOffset); + } + + public CPMethodRef cpMethodValue(int index) { + return new CPMethodRef(cpClassValue(cpMethodClassInts[index]), + cpNameAndTypeValue(cpMethodDescriptorInts[index]), index + + methodOffset); + } + + public CPFieldRef cpFieldValue(int index) { + return new CPFieldRef(cpClassValue(cpFieldClassInts[index]), + cpNameAndTypeValue(cpFieldDescriptorInts[index]), index + + fieldOffset); + } + + public CPUTF8 cpSignatureValue(int index) { + int globalIndex; + if(cpSignatureInts[index] != -1) { + globalIndex = cpSignatureInts[index]; + } else { + globalIndex = index + signatureOffset; + } + String string = cpSignature[index]; + CPUTF8 cpUTF8 = (CPUTF8) stringsToCPUTF8.get(string); + if(cpUTF8 == null) { + cpUTF8 = new CPUTF8(string, globalIndex); + stringsToCPUTF8.put(string, cpUTF8); + } + return cpUTF8; + } + + public CPNameAndType cpNameAndTypeValue(String descriptor) { + CPNameAndType cpNameAndType = (CPNameAndType) descriptorsToCPNameAndTypes + .get(descriptor); + if (cpNameAndType == null) { + Integer index = (Integer)mapDescriptor.get(descriptor); + if(index != null) { + return cpNameAndTypeValue(index.intValue()); + } + int colon = descriptor.indexOf(':'); + String nameString = descriptor.substring(0, colon); + String descriptorString = descriptor.substring(colon + 1); + + CPUTF8 name = cpUTF8Value(nameString, true); + CPUTF8 descriptorU = cpUTF8Value(descriptorString, true); + cpNameAndType = new CPNameAndType(name, descriptorU, -1 + descrOffset); + descriptorsToCPNameAndTypes.put(descriptor, cpNameAndType); + } + return cpNameAndType; + } + + public int[] getCpDescriptorNameInts() { + return cpDescriptorNameInts; + } + + public int[] getCpDescriptorTypeInts() { + return cpDescriptorTypeInts; + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/FileBands.java b/src/main/java/org/apache/harmony/unpack200/FileBands.java new file mode 100644 index 0000000..ab42efd --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/FileBands.java @@ -0,0 +1,127 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; + +/** + * Parses the file band headers (not including the actual bits themselves). At + * the end of this parse call, the input stream will be positioned at the start + * of the file_bits themselves, and there will be Sum(file_size) bits remaining + * in the stream with BYTE1 compression. A decent implementation will probably + * just stream the bytes out to the reconstituted Jar rather than caching them. + */ +public class FileBands extends BandSet { + + private byte[][] fileBits; + + private int[] fileModtime; + + private String[] fileName; + + private int[] fileOptions; + + private long[] fileSize; + + private final String[] cpUTF8; + + private InputStream in; + + /** + * @param segment + */ + public FileBands(Segment segment) { + super(segment); + this.cpUTF8 = segment.getCpBands().getCpUTF8(); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.BandSet#unpack(java.io.InputStream) + */ + public void read(InputStream in) throws IOException, Pack200Exception { + int numberOfFiles = header.getNumberOfFiles(); + SegmentOptions options = header.getOptions(); + + fileName = parseReferences("file_name", in, Codec.UNSIGNED5, + numberOfFiles, cpUTF8); + fileSize = parseFlags("file_size", in, numberOfFiles, Codec.UNSIGNED5, + options.hasFileSizeHi()); + if (options.hasFileModtime()) { + fileModtime = decodeBandInt("file_modtime", in, Codec.DELTA5, + numberOfFiles); + } else { + fileModtime = new int[numberOfFiles]; + } + if (options.hasFileOptions()) { + fileOptions = decodeBandInt("file_options", in, Codec.UNSIGNED5, + numberOfFiles); + } else { + fileOptions = new int[numberOfFiles]; + } + this.in = in; // store for use by processFileBits(), which is called + // later + } + + // TODO: stream the file bits directly somehow + public void processFileBits() throws IOException, Pack200Exception { + // now read in the bytes + int numberOfFiles = header.getNumberOfFiles(); + fileBits = new byte[numberOfFiles][]; + for (int i = 0; i < numberOfFiles; i++) { + int size = (int) fileSize[i]; + // TODO This breaks if file_size > 2^32. Probably an array is + // not the right choice, and we should just serialize it here? + fileBits[i] = new byte[size]; + int read = in.read(fileBits[i]); + if (size != 0 && read < size) { + throw new Pack200Exception("Expected to read " + size + + " bytes but read " + read); + } + } + } + + public void unpack() { + + } + + public byte[][] getFileBits() { + return fileBits; + } + + public int[] getFileModtime() { + return fileModtime; + } + + public String[] getFileName() { + return fileName; + } + + public int[] getFileOptions() { + return fileOptions; + } + + public long[] getFileSize() { + return fileSize; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/IMatcher.java b/src/main/java/org/apache/harmony/unpack200/IMatcher.java new file mode 100644 index 0000000..0d35735 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/IMatcher.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +/** + * Interface for a class that can perform matching on flag values. + */ +public interface IMatcher { + + public abstract boolean matches(long value); + +} diff --git a/src/main/java/org/apache/harmony/unpack200/IcBands.java b/src/main/java/org/apache/harmony/unpack200/IcBands.java new file mode 100644 index 0000000..6a5008b --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/IcBands.java @@ -0,0 +1,249 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.CPClass; +import org.apache.harmony.unpack200.bytecode.ClassConstantPool; +import org.apache.harmony.unpack200.bytecode.ConstantPoolEntry; + +/** + * Inner Class Bands + */ +public class IcBands extends BandSet { + + private IcTuple[] icAll; + + private final String[] cpUTF8; + + private final String[] cpClass; + + private Map thisClassToTuple; + private Map outerClassToTuples; + + /** + * @param segment + */ + public IcBands(Segment segment) { + super(segment); + this.cpClass = segment.getCpBands().getCpClass(); + this.cpUTF8 = segment.getCpBands().getCpUTF8(); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.BandSet#unpack(java.io.InputStream) + */ + public void read(InputStream in) throws IOException, Pack200Exception { + // Read IC bands + int innerClassCount = header.getInnerClassCount(); + int[] icThisClassInts = decodeBandInt("ic_this_class", in, + Codec.UDELTA5, innerClassCount); + String[] icThisClass = getReferences(icThisClassInts, cpClass); + int[] icFlags = decodeBandInt("ic_flags", in, Codec.UNSIGNED5, + innerClassCount); + int outerClasses = SegmentUtils.countBit16(icFlags); + int[] icOuterClassInts = decodeBandInt("ic_outer_class", in, + Codec.DELTA5, outerClasses); + String[] icOuterClass = new String[outerClasses]; + for (int i = 0; i < icOuterClass.length; i++) { + if (icOuterClassInts[i] == 0) { + icOuterClass[i] = null; + } else { + icOuterClass[i] = cpClass[icOuterClassInts[i] - 1]; + } + } + int[] icNameInts = decodeBandInt("ic_name", in, Codec.DELTA5, + outerClasses); + String[] icName = new String[outerClasses]; + for (int i = 0; i < icName.length; i++) { + if (icNameInts[i] == 0) { + icName[i] = null; + } else { + icName[i] = cpUTF8[icNameInts[i] - 1]; + } + } + + // Construct IC tuples + icAll = new IcTuple[icThisClass.length]; + int index = 0; + for (int i = 0; i < icThisClass.length; i++) { + String icTupleC = icThisClass[i]; + int icTupleF = icFlags[i]; + String icTupleC2 = null; + String icTupleN = null; + int cIndex = icThisClassInts[i]; + int c2Index = -1; + int nIndex = -1; + if ((icFlags[i] & 1 << 16) != 0) { + icTupleC2 = icOuterClass[index]; + icTupleN = icName[index]; + c2Index = icOuterClassInts[index] - 1; + nIndex = icNameInts[index] - 1; + index++; + } + icAll[i] = new IcTuple(icTupleC, icTupleF, icTupleC2, icTupleN, cIndex, c2Index, nIndex, i); + } + } + + public void unpack() throws IOException, Pack200Exception { + IcTuple[] allTuples = getIcTuples(); + thisClassToTuple = new HashMap(allTuples.length); + outerClassToTuples = new HashMap(allTuples.length); + for(int index = 0; index < allTuples.length; index++) { + + IcTuple tuple = allTuples[index]; + + // generate mapping thisClassString -> IcTuple + // presumably this relation is 1:1 + // + Object result = thisClassToTuple.put(tuple.thisClassString(), tuple); + if (result != null) { + throw new Error("Collision detected in mapping. " + + "There are at least two inner clases with the same name."); + } + + // generate mapping outerClassString -> IcTuple + // this relation is 1:M + + // If it's not anon and the outer is not anon, it could be relevant + if ( (!tuple.isAnonymous() && !tuple.outerIsAnonymous()) || (tuple.nestedExplicitFlagSet()) ) { + + // add tuple to corresponding bucket + String key = tuple.outerClassString(); + List bucket = (List)outerClassToTuples.get(key); + if (bucket == null) { + bucket = new ArrayList(); + outerClassToTuples.put(key, bucket); + } + bucket.add(tuple); + } + } + } + + + public IcTuple[] getIcTuples() { + return icAll; + } + + /** + * Answer the relevant IcTuples for the specified className and class + * constant pool. + * + * @param className + * String name of the class X for ic_relevant(X) + * @param cp + * ClassConstantPool used to generate ic_relevant(X) + * @return array of IcTuple + */ + public IcTuple[] getRelevantIcTuples(String className, ClassConstantPool cp) { + Set relevantTuplesContains = new HashSet(); + List relevantTuples = new ArrayList(); + + List relevantCandidates = (List) outerClassToTuples.get(className); + if (relevantCandidates != null) { + for (int index = 0; index < relevantCandidates.size(); index++) { + IcTuple tuple = (IcTuple) relevantCandidates.get(index); + relevantTuplesContains.add(tuple); + relevantTuples.add(tuple); + } + } + + List entries = cp.entries(); + + // For every class constant in both ic_this_class and cp, + // add it to ic_relevant. Repeat until no more + // changes to ic_relevant. + + for (int eIndex = 0; eIndex < entries.size(); eIndex++) { + ConstantPoolEntry entry = (ConstantPoolEntry) entries.get(eIndex); + if (entry instanceof CPClass) { + CPClass clazz = (CPClass) entry; + IcTuple relevant = (IcTuple) thisClassToTuple.get(clazz.name); + if (relevant != null && relevantTuplesContains.add(relevant)) { + relevantTuples.add(relevant); + } + } + } + + // Not part of spec: fix up by adding to relevantTuples the parents + // of inner classes which are themselves inner classes. + // i.e., I think that if Foo$Bar$Baz gets added, Foo$Bar needs to be + // added + // as well. + + ArrayList tuplesToScan = new ArrayList(relevantTuples); + ArrayList tuplesToAdd = new ArrayList(); + + while (tuplesToScan.size() > 0) { + + tuplesToAdd.clear(); + for (int index = 0; index < tuplesToScan.size(); index++) { + IcTuple aRelevantTuple = (IcTuple) tuplesToScan.get(index); + IcTuple relevant = (IcTuple) thisClassToTuple + .get(aRelevantTuple.outerClassString()); + if (relevant != null && !aRelevantTuple.outerIsAnonymous()) { + tuplesToAdd.add(relevant); + } + } + + tuplesToScan.clear(); + for (int index = 0; index < tuplesToAdd.size(); index++) { + IcTuple tuple = (IcTuple) tuplesToAdd.get(index); + if (relevantTuplesContains.add(tuple)) { + relevantTuples.add(tuple); + tuplesToScan.add(tuple); + } + } + + } + + // End not part of the spec. Ugh. + + // Now order the result as a subsequence of ic_all + Collections.sort(relevantTuples, new Comparator() { + + public int compare(Object arg0, Object arg1) { + Integer index1 = new Integer(((IcTuple)arg0).getTupleIndex()); + Integer index2 = new Integer(((IcTuple)arg1).getTupleIndex()); + return index1.compareTo(index2); + } + + }); + + IcTuple[] relevantTuplesArray = new IcTuple[relevantTuples.size()]; + for(int i = 0; i < relevantTuplesArray.length; i++) { + relevantTuplesArray[i] = (IcTuple)relevantTuples.get(i); + } + + return relevantTuplesArray; + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/IcTuple.java b/src/main/java/org/apache/harmony/unpack200/IcTuple.java new file mode 100644 index 0000000..fe15724 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/IcTuple.java @@ -0,0 +1,370 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.util.ArrayList; + +/** + * An IcTuple is the set of information that describes an inner class. + * + * C is the fully qualified class name
+ * F is the flags
+ * C2 is the outer class name, or null if it can be inferred from C
+ * N is the inner class name, or null if it can be inferred from C
+ */ +public class IcTuple { + + private final int cIndex; + private final int c2Index; + private final int nIndex; + private final int tIndex; + + /** + * + * @param C + * @param F + * @param C2 + * @param N + * @param cIndex the index of C in cpClass + * @param c2Index the index of C2 in cpClass, or -1 if C2 is null + * @param nIndex the index of N in cpUTF8, or -1 if N is null + */ + public IcTuple(String C, int F, String C2, String N, int cIndex, int c2Index, int nIndex, int tIndex) { + this.C = C; + this.F = F; + this.C2 = C2; + this.N = N; + this.cIndex = cIndex; + this.c2Index = c2Index; + this.nIndex = nIndex; + this.tIndex = tIndex; + if (null == N) { + predictSimple = true; + } + if (null == C2) { + predictOuter = true; + } + initializeClassStrings(); + } + + public IcTuple(String C, int F, int cIndex) { + this(C, F, null, null, cIndex, -1, -1, -1); + } + + public static final int NESTED_CLASS_FLAG = 0x00010000; + protected String C; // this class + protected int F; // flags + protected String C2; // outer class + protected String N; // name + + private boolean predictSimple; + private boolean predictOuter; + private String cachedOuterClassString; + private String cachedSimpleClassName; + private boolean initialized; + private boolean anonymous; + private boolean outerIsAnonymous; + private boolean member = true; + private int cachedOuterClassIndex = -1; + private int cachedSimpleClassNameIndex = -1; + + /** + * Answer true if the receiver is predicted; answer false if the receiver is + * specified explicitly in the outer and name fields. + */ + public boolean predicted() { + return predictOuter || predictSimple; + } + + + /** + * Answer true if the receiver's bit 16 is set (indicating + * that explicit outer class and name fields are set). + * @return boolean + */ + public boolean nestedExplicitFlagSet() { + return (F & NESTED_CLASS_FLAG) == NESTED_CLASS_FLAG; + } + + /** + * Break the receiver into components at $ boundaries. + */ + public String[] innerBreakAtDollar(String className) { + ArrayList resultList = new ArrayList(); + int start = 0; + int index = 0; + while (index < className.length()) { + if (className.charAt(index) <= '$') { + resultList.add(className.substring(start, index)); + start = index + 1; + } + index++; + if (index >= className.length()) { + // Add the last element + resultList.add(className.substring(start, className.length())); + } + } + String[] result = new String[resultList.size()]; + for (int i = 0; i < resultList.size(); i++) { + result[i] = (String) resultList.get(i); + } + return result; + } + + /** + * Answer the outer class name for the receiver. This may either be + * specified or inferred from inner class name. + * + * @return String name of outer class + */ + public String outerClassString() { + return cachedOuterClassString; + } + + /** + * Answer the inner class name for the receiver. + * + * @return String name of inner class + */ + public String simpleClassName() { + return cachedSimpleClassName; + } + + /** + * Answer the full name of the inner class represented by this tuple + * (including its outer component) + * + * @return String full name of inner class + */ + public String thisClassString() { + if (predicted()) { + return C; + } else { + // TODO: this may not be right. What if I + // get a class like Foo#Bar$Baz$Bug? + return C2 + "$" + N; + } + } + + public boolean isMember() { + return member; + } + + public boolean isAnonymous() { + return anonymous; + } + + + public boolean outerIsAnonymous() { + return outerIsAnonymous; + } + + private boolean computeOuterIsAnonymous() { + String[] result = innerBreakAtDollar(cachedOuterClassString); + if (result.length == 0) { + throw new Error( + "Should have an outer before checking if it's anonymous"); + } + + for (int index = 0; index < result.length; index++) { + if (isAllDigits(result[index])) { + return true; + } + } + return false; + } + + private void initializeClassStrings() { + if (initialized) { + return; + } + initialized = true; + + if (!predictSimple) { + cachedSimpleClassName = N; + } + if (!predictOuter) { + cachedOuterClassString = C2; + } + // Class names must be calculated from + // this class name. + String nameComponents[] = innerBreakAtDollar(C); + if (nameComponents.length == 0) { + // Unable to predict outer class + // throw new Error("Unable to predict outer class name: " + C); + } + if (nameComponents.length == 1) { + // Unable to predict simple class name + // throw new Error("Unable to predict inner class name: " + C); + } + if (nameComponents.length < 2) { + // If we get here, we hope cachedSimpleClassName + // and cachedOuterClassString were caught by the + // predictSimple / predictOuter code above. + return; + } + + // If we get to this point, nameComponents.length must be >=2 + int lastPosition = nameComponents.length - 1; + cachedSimpleClassName = nameComponents[lastPosition]; + cachedOuterClassString = ""; + for (int index = 0; index < lastPosition; index++) { + cachedOuterClassString += nameComponents[index]; + if (isAllDigits(nameComponents[index])) { + member = false; + } + if (index + 1 != lastPosition) { + // TODO: might need more logic to handle + // classes with separators of non-$ characters + // (ie Foo#Bar) + cachedOuterClassString += '$'; + } + } + // TODO: these two blocks are the same as blocks + // above. Can we eliminate some by reworking the logic? + if (!predictSimple) { + cachedSimpleClassName = N; + cachedSimpleClassNameIndex = nIndex; + } + if (!predictOuter) { + cachedOuterClassString = C2; + cachedOuterClassIndex = c2Index; + } + if (isAllDigits(cachedSimpleClassName)) { + anonymous = true; + member = false; + if (nestedExplicitFlagSet()) { + // Predicted class - marking as member + member = true; + } + } + + outerIsAnonymous = computeOuterIsAnonymous(); + } + + private boolean isAllDigits(String nameString) { + // Answer true if the receiver is all digits; otherwise answer false. + if (null == nameString) { + return false; + } + for (int index = 0; index < nameString.length(); index++) { + if (!Character.isDigit(nameString.charAt(index))) { + return false; + } + } + return true; + } + + public String toString() { + StringBuffer result = new StringBuffer(); + result.append("IcTuple "); + result.append('('); + result.append(simpleClassName()); + result.append(" in "); + result.append(outerClassString()); + result.append(')'); + return result.toString(); + } + + public boolean nullSafeEquals(String stringOne, String stringTwo) { + if (null == stringOne) { + return null == stringTwo; + } + return stringOne.equals(stringTwo); + } + + public boolean equals(Object object) { + if ((object == null) || (object.getClass() != this.getClass())) { + return false; + } + IcTuple compareTuple = (IcTuple) object; + + if (!nullSafeEquals(this.C, compareTuple.C)) { + return false; + } + + if (!nullSafeEquals(this.C2, compareTuple.C2)) { + return false; + } + + if (!nullSafeEquals(this.N, compareTuple.N)) { + return false; + } + return true; + } + + private boolean hashcodeComputed; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + cachedHashCode = 17; + if(C != null) { cachedHashCode =+ C.hashCode(); } + if(C2 != null) { cachedHashCode =+ C2.hashCode(); } + if(N != null) { cachedHashCode =+ N.hashCode(); } + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + + public String getC() { + return C; + } + + public int getF() { + return F; + } + + public String getC2() { + return C2; + } + + public String getN() { + return N; + } + + public int getTupleIndex() { + return tIndex; + } + + public String realOuterClassString() { + int firstDollarPosition = cachedOuterClassString.indexOf('$'); + if (firstDollarPosition <= 0) { + return cachedOuterClassString; + } + return cachedOuterClassString.substring(0, firstDollarPosition); + } + + public int thisClassIndex() { + if(predicted()) { + return cIndex; + } else { + return -1; + } + } + + public int outerClassIndex() { + return cachedOuterClassIndex; + } + + public int simpleClassNameIndex() { + return cachedSimpleClassNameIndex; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/MetadataBandGroup.java b/src/main/java/org/apache/harmony/unpack200/MetadataBandGroup.java new file mode 100644 index 0000000..49ae802 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/MetadataBandGroup.java @@ -0,0 +1,252 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import org.apache.harmony.unpack200.bytecode.AnnotationDefaultAttribute; +import org.apache.harmony.unpack200.bytecode.Attribute; +import org.apache.harmony.unpack200.bytecode.CPDouble; +import org.apache.harmony.unpack200.bytecode.CPFloat; +import org.apache.harmony.unpack200.bytecode.CPInteger; +import org.apache.harmony.unpack200.bytecode.CPLong; +import org.apache.harmony.unpack200.bytecode.CPUTF8; +import org.apache.harmony.unpack200.bytecode.RuntimeVisibleorInvisibleAnnotationsAttribute; +import org.apache.harmony.unpack200.bytecode.RuntimeVisibleorInvisibleParameterAnnotationsAttribute; +import org.apache.harmony.unpack200.bytecode.AnnotationsAttribute.Annotation; +import org.apache.harmony.unpack200.bytecode.AnnotationsAttribute.ElementValue; +import org.apache.harmony.unpack200.bytecode.RuntimeVisibleorInvisibleParameterAnnotationsAttribute.ParameterAnnotation; + +/** + * A group of metadata bands, such as class_RVA_bands, method_AD_bands etc. + */ +public class MetadataBandGroup { + + private final String type; + private final CpBands cpBands; + + private static CPUTF8 rvaUTF8; + private static CPUTF8 riaUTF8; + private static CPUTF8 rvpaUTF8; + private static CPUTF8 ripaUTF8; + + public static void setRvaAttributeName(CPUTF8 cpUTF8Value) { + rvaUTF8 = cpUTF8Value; + } + + public static void setRiaAttributeName(CPUTF8 cpUTF8Value) { + riaUTF8 = cpUTF8Value; + } + + public static void setRvpaAttributeName(CPUTF8 cpUTF8Value) { + rvpaUTF8 = cpUTF8Value; + } + + public static void setRipaAttributeName(CPUTF8 cpUTF8Value) { + ripaUTF8 = cpUTF8Value; + } + + public MetadataBandGroup(String type, CpBands cpBands) { + this.type = type; + this.cpBands = cpBands; + } + + private List attributes; + + public int[] param_NB; + public int[] anno_N; + public CPUTF8[][] type_RS; + public int[][] pair_N; + public CPUTF8[] name_RU; + public int[] T; + public CPInteger[] caseI_KI; + public CPDouble[] caseD_KD; + public CPFloat[] caseF_KF; + public CPLong[] caseJ_KJ; + public CPUTF8[] casec_RS; + public String[] caseet_RS; + public String[] caseec_RU; + public CPUTF8[] cases_RU; + public int[] casearray_N; + public CPUTF8[] nesttype_RS; + public int[] nestpair_N; + public CPUTF8[] nestname_RU; + + private int caseI_KI_Index; + + private int caseD_KD_Index; + + private int caseF_KF_Index; + + private int caseJ_KJ_Index; + + private int casec_RS_Index; + + private int caseet_RS_Index; + + private int caseec_RU_Index; + + private int cases_RU_Index; + + private int casearray_N_Index; + + private int T_index; + + private int nesttype_RS_Index; + + private int nestpair_N_Index; + + private Iterator nestname_RU_Iterator; + + private int anno_N_Index; + + private Iterator type_RS_Iterator; + + private int pair_N_Index; + + public List getAttributes() { + // TODO: Optimize iterators! + if (attributes == null) { + attributes = new ArrayList(); + if (name_RU != null) { + Iterator name_RU_Iterator = Arrays.asList(name_RU).iterator(); + if (!type.equals("AD")) { + T_index = 0; + } + caseI_KI_Index = 0; + caseD_KD_Index = 0; + caseF_KF_Index = 0; + caseJ_KJ_Index = 0; + casec_RS_Index = 0; + caseet_RS_Index = 0; + caseec_RU_Index = 0; + cases_RU_Index = 0; + casearray_N_Index = 0; + nesttype_RS_Index = 0; + nestpair_N_Index = 0; + nestname_RU_Iterator = Arrays.asList(nestname_RU).iterator(); + if (type.equals("RVA") || type.equals("RIA")) { + for (int i = 0; i < anno_N.length; i++) { + attributes.add(getAttribute(anno_N[i], type_RS[i], + pair_N[i], name_RU_Iterator)); + } + } else if (type.equals("RVPA") || type.equals("RIPA")) { + anno_N_Index = 0; + type_RS_Iterator = Arrays.asList(type_RS).iterator(); + pair_N_Index = 0; + for (int i = 0; i < param_NB.length; i++) { + attributes.add(getParameterAttribute(param_NB[i], + name_RU_Iterator)); + } + } else { // type.equals("AD") + for (int i = 0; i < T.length; i++) { + attributes.add(new AnnotationDefaultAttribute( + new ElementValue(T[i], getNextValue(T[i])))); + } + } + } + } + return attributes; + } + + private Attribute getAttribute(int numAnnotations, CPUTF8[] types, + int[] pairCounts, Iterator namesIterator) { + Annotation[] annotations = new Annotation[numAnnotations]; + for (int i = 0; i < numAnnotations; i++) { + annotations[i] = getAnnotation(types[i], pairCounts[i], + namesIterator); + } + return new RuntimeVisibleorInvisibleAnnotationsAttribute(type + .equals("RVA") ? rvaUTF8 : riaUTF8, annotations); + } + + private Attribute getParameterAttribute(int numParameters, + Iterator namesIterator) { + ParameterAnnotation[] parameter_annotations = new ParameterAnnotation[numParameters]; + for (int i = 0; i < numParameters; i++) { + int numAnnotations = anno_N[anno_N_Index++]; + int[] pairCounts = pair_N[pair_N_Index++]; + Annotation[] annotations = new Annotation[numAnnotations]; + for (int j = 0; j < annotations.length; j++) { + annotations[j] = getAnnotation( + (CPUTF8) type_RS_Iterator.next(), pairCounts[j], + namesIterator); + } + parameter_annotations[i] = new ParameterAnnotation(annotations); + } + return new RuntimeVisibleorInvisibleParameterAnnotationsAttribute(type + .equals("RVPA") ? rvpaUTF8 : ripaUTF8, + parameter_annotations); + } + + private Annotation getAnnotation(CPUTF8 type, int pairCount, + Iterator namesIterator) { + CPUTF8[] elementNames = new CPUTF8[pairCount]; + ElementValue[] elementValues = new ElementValue[pairCount]; + for (int j = 0; j < elementNames.length; j++) { + elementNames[j] = (CPUTF8) namesIterator.next(); + int t = T[T_index++]; + elementValues[j] = new ElementValue(t, getNextValue(t)); + } + return new Annotation(pairCount, type, elementNames, elementValues); + } + + private Object getNextValue(int t) { + switch (t) { + case 'B': + case 'C': + case 'I': + case 'S': + case 'Z': + return caseI_KI[caseI_KI_Index++]; + case 'D': + return caseD_KD[caseD_KD_Index++]; + case 'F': + return caseF_KF[caseF_KF_Index++]; + case 'J': + return caseJ_KJ[caseJ_KJ_Index++]; + case 'c': + return casec_RS[casec_RS_Index++]; + case 'e': + // TODO: check this - it may not work if the first string already + // has a colon in it + String enumString = caseet_RS[caseet_RS_Index++] + ":" + + caseec_RU[caseec_RU_Index++]; + return cpBands.cpNameAndTypeValue(enumString); + case 's': + return cases_RU[cases_RU_Index++]; + case '[': + int arraySize = casearray_N[casearray_N_Index++]; + ElementValue[] nestedArray = new ElementValue[arraySize]; + for (int i = 0; i < arraySize; i++) { + int nextT = T[T_index++]; + nestedArray[i] = new ElementValue(nextT, getNextValue(nextT)); + } + return nestedArray; + case '@': + CPUTF8 type = nesttype_RS[nesttype_RS_Index++]; + int numPairs = nestpair_N[nestpair_N_Index++]; + + return getAnnotation(type, numPairs, nestname_RU_Iterator); + } + return null; + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/NewAttributeBands.java b/src/main/java/org/apache/harmony/unpack200/NewAttributeBands.java new file mode 100644 index 0000000..c27425d --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/NewAttributeBands.java @@ -0,0 +1,995 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.apache.harmony.pack200.BHSDCodec; +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.Attribute; +import org.apache.harmony.unpack200.bytecode.CPClass; +import org.apache.harmony.unpack200.bytecode.CPDouble; +import org.apache.harmony.unpack200.bytecode.CPFieldRef; +import org.apache.harmony.unpack200.bytecode.CPFloat; +import org.apache.harmony.unpack200.bytecode.CPInteger; +import org.apache.harmony.unpack200.bytecode.CPInterfaceMethodRef; +import org.apache.harmony.unpack200.bytecode.CPLong; +import org.apache.harmony.unpack200.bytecode.CPMethodRef; +import org.apache.harmony.unpack200.bytecode.CPNameAndType; +import org.apache.harmony.unpack200.bytecode.CPString; +import org.apache.harmony.unpack200.bytecode.CPUTF8; +import org.apache.harmony.unpack200.bytecode.NewAttribute; + +/** + * Set of bands relating to a non-predefined attribute + */ +public class NewAttributeBands extends BandSet { + + private final AttributeLayout attributeLayout; + + private int backwardsCallCount; + + private List attributeLayoutElements; + + public NewAttributeBands(Segment segment, AttributeLayout attributeLayout) + throws IOException { + super(segment); + this.attributeLayout = attributeLayout; + parseLayout(); + attributeLayout.setBackwardsCallCount(backwardsCallCount); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.BandSet#unpack(java.io.InputStream) + */ + public void read(InputStream in) throws IOException, Pack200Exception { + // does nothing - use parseAttributes instead + } + + /** + * Parse the bands relating to this AttributeLayout and return the correct + * class file attributes as a List of {@link Attribute} + * + * @throws Pack200Exception + */ + public List parseAttributes(InputStream in, int occurrenceCount) + throws IOException, Pack200Exception { + for(int i = 0; i < attributeLayoutElements.size(); i++) { + AttributeLayoutElement element = (AttributeLayoutElement) attributeLayoutElements.get(i); + element.readBands(in, occurrenceCount); + } + + List attributes = new ArrayList(occurrenceCount); + for (int i = 0; i < occurrenceCount; i++) { + attributes.add(getOneAttribute(i, attributeLayoutElements)); + } + return attributes; + } + + /** + * Get one attribute at the given index from the various bands. The correct + * bands must have already been read in. + * + * @param index + * @param elements + * @return + */ + private Attribute getOneAttribute(int index, List elements) { + NewAttribute attribute = new NewAttribute(segment.getCpBands() + .cpUTF8Value(attributeLayout.getName()), + attributeLayout.getIndex()); + for(int i = 0; i < elements.size(); i++) { + AttributeLayoutElement element = (AttributeLayoutElement) elements.get(i); + element.addToAttribute(index, attribute); + } + return attribute; + } + + /** + * Tokenise the layout into AttributeElements + * + * @throws IOException + */ + private void parseLayout() throws IOException { + if (attributeLayoutElements == null) { + attributeLayoutElements = new ArrayList(); + StringReader stream = new StringReader(attributeLayout.getLayout()); + AttributeLayoutElement e; + while ((e = readNextAttributeElement(stream)) != null) { + attributeLayoutElements.add(e); + } + resolveCalls(); + } + } + + /** + * Resolve calls in the attribute layout and returns the number of backwards + * calls + */ + private void resolveCalls() { + int backwardsCalls = 0; + for (int i = 0; i < attributeLayoutElements.size(); i++) { + AttributeLayoutElement element = (AttributeLayoutElement) attributeLayoutElements + .get(i); + if (element instanceof Callable) { + Callable callable = (Callable) element; + if(i == 0) { + callable.setFirstCallable(true); + } + List body = callable.body; // Look for calls in the body + for(int iIndex = 0; iIndex < body.size(); iIndex++) { + LayoutElement layoutElement = (LayoutElement) body + .get(iIndex); + // Set the callable for each call + backwardsCalls += resolveCallsForElement(i, callable, + layoutElement); + } + } + } + backwardsCallCount = backwardsCalls; + } + + private int resolveCallsForElement(int i, + Callable currentCallable, LayoutElement layoutElement) { + int backwardsCalls = 0; + if (layoutElement instanceof Call) { + Call call = (Call) layoutElement; + int index = call.callableIndex; + if (index == 0) { // Calls the parent callable + backwardsCalls++; + call.setCallable(currentCallable); + } else if (index > 0) { // Forwards call + for (int k = i + 1; k < attributeLayoutElements.size(); k++) { + AttributeLayoutElement el = (AttributeLayoutElement) attributeLayoutElements + .get(k); + if (el instanceof Callable) { + index--; + if (index == 0) { + call.setCallable((Callable) el); + break; + } + } + } + } else { // Backwards call + backwardsCalls++; + for (int k = i; k >= 0; k--) { + AttributeLayoutElement el = (AttributeLayoutElement) attributeLayoutElements + .get(k); + if (el instanceof Callable) { + index++; + if (index == 0) { + call.setCallable((Callable) el); + break; + } + } + } + } + } else if (layoutElement instanceof Replication) { + List children = ((Replication)layoutElement).layoutElements; + for (Iterator iterator = children.iterator(); iterator.hasNext();) { + LayoutElement object = (LayoutElement) iterator.next(); + backwardsCalls += resolveCallsForElement(i, currentCallable, object); + } + } + return backwardsCalls; + } + + private AttributeLayoutElement readNextAttributeElement(StringReader stream) + throws IOException { + stream.mark(1); + int nextChar = stream.read(); + if (nextChar == -1) { + return null; + } + if (nextChar == '[') { + List body = readBody(getStreamUpToMatchingBracket(stream)); + return new Callable(body); + } else { + stream.reset(); + return readNextLayoutElement(stream); + } + } + + private LayoutElement readNextLayoutElement(StringReader stream) + throws IOException { + int nextChar = stream.read(); + if (nextChar == -1) { + return null; + } + switch (nextChar) { + // Integrals + case 'B': + case 'H': + case 'I': + case 'V': + return new Integral(new String(new char[] { (char)nextChar })); + case 'S': + case 'F': + return new Integral(new String(new char[] { (char)nextChar, + (char) stream.read() })); + case 'P': + stream.mark(1); + if (stream.read() != 'O') { + stream.reset(); + return new Integral("P" + (char) stream.read()); + } else { + return new Integral("PO" + (char) stream.read()); + } + case 'O': + stream.mark(1); + if (stream.read() != 'S') { + stream.reset(); + return new Integral("O" + (char) stream.read()); + } else { + return new Integral("OS" + (char) stream.read()); + } + + // Replication + case 'N': + char uint_type = (char) stream.read(); + stream.read(); // '[' + String str = readUpToMatchingBracket(stream); + return new Replication("" + uint_type, str); + + // Union + case 'T': + String int_type = "" + (char) stream.read(); + if (int_type.equals("S")) { + int_type += (char) stream.read(); + } + List unionCases = new ArrayList(); + UnionCase c; + while ((c = readNextUnionCase(stream)) != null) { + unionCases.add(c); + } + stream.read(); // '(' + stream.read(); // ')' + stream.read(); // '[' + List body = null; + stream.mark(1); + char next = (char) stream.read(); + if (next != ']') { + stream.reset(); + body = readBody(getStreamUpToMatchingBracket(stream)); + } + return new Union(int_type, unionCases, body); + + // Call + case '(': + int number = readNumber(stream).intValue(); + stream.read(); // ')' + return new Call(number); + // Reference + case 'K': + case 'R': + String string = "" + (char)nextChar + (char) stream.read(); + char nxt = (char) stream.read(); + string += nxt; + if (nxt == 'N') { + string += (char) stream.read(); + } + return new Reference(string); + } + return null; + } + + /** + * Read a UnionCase from the stream + * + * @param stream + * @return + * @throws IOException + */ + private UnionCase readNextUnionCase(StringReader stream) throws IOException { + stream.mark(2); + stream.read(); // '(' + char next = (char) stream.read(); + if (next == ')') { + stream.reset(); + return null; + } else { + stream.reset(); + stream.read(); // '(' + } + List tags = new ArrayList(); + Integer nextTag; + do { + nextTag = readNumber(stream); + if(nextTag != null) { + tags.add(nextTag); + stream.read(); // ',' or ')' + } + } while (nextTag != null); + stream.read(); // '[' + stream.mark(1); + next = (char) stream.read(); + if (next == ']') { + return new UnionCase(tags); + } else { + stream.reset(); + return new UnionCase(tags, + readBody(getStreamUpToMatchingBracket(stream))); + } + } + + /** + * An AttributeLayoutElement is a part of an attribute layout and has one or + * more bands associated with it, which transmit the AttributeElement data + * for successive Attributes of this type. + */ + private interface AttributeLayoutElement { + + /** + * Read the bands associated with this part of the layout + * + * @param in + * @param count + * @throws Pack200Exception + * @throws IOException + */ + public void readBands(InputStream in, int count) throws IOException, + Pack200Exception; + + /** + * Add the band data for this element at the given index to the + * attribute + * + * @param index + * @param attribute + */ + public void addToAttribute(int index, NewAttribute attribute); + + } + + private abstract class LayoutElement implements AttributeLayoutElement { + + protected int getLength(char uint_type) { + int length = 0; + switch (uint_type) { + case 'B': + length = 1; + break; + case 'H': + length = 2; + break; + case 'I': + length = 4; + break; + case 'V': + length = 0; + break; + } + return length; + } + } + + private class Integral extends LayoutElement { + + private final String tag; + private int[] band; + + public Integral(String tag) { + this.tag = tag; + } + + public void readBands(InputStream in, int count) throws IOException, + Pack200Exception { + band = decodeBandInt(attributeLayout.getName() + "_" + tag, in, + getCodec(tag), count); + } + + public void addToAttribute(int n, NewAttribute attribute) { + long value = band[n]; + if (tag.equals("B") || tag.equals("FB")) { + attribute.addInteger(1, value); + } else if (tag.equals("SB")) { + attribute.addInteger(1, (byte) value); + } else if (tag.equals("H") || tag.equals("FH")) { + attribute.addInteger(2, value); + } else if (tag.equals("SH")) { + attribute.addInteger(2, (short) value); + } else if (tag.equals("I") || tag.equals("FI")) { + attribute.addInteger(4, value); + } else if (tag.equals("SI")) { + attribute.addInteger(4, (int) value); + } else if (tag.equals("V") || tag.equals("FV") || tag.equals("SV")) { + // Don't add V's - they shouldn't be written out to the class + // file + } else if (tag.startsWith("PO")) { + char uint_type = tag.substring(2).toCharArray()[0]; + int length = getLength(uint_type); + attribute.addBCOffset(length, (int) value); + } else if (tag.startsWith("P")) { + char uint_type = tag.substring(1).toCharArray()[0]; + int length = getLength(uint_type); + attribute.addBCIndex(length, (int) value); + } else if (tag.startsWith("OS")) { + char uint_type = tag.substring(2).toCharArray()[0]; + int length = getLength(uint_type); + if (length == 1) { + value = (byte) value; + } else if (length == 2) { + value = (short) value; + } else if (length == 4) { + value = (int) value; + } + attribute.addBCLength(length, (int) value); + } else if (tag.startsWith("O")) { + char uint_type = tag.substring(1).toCharArray()[0]; + int length = getLength(uint_type); + attribute.addBCLength(length, (int) value); + } + } + + long getValue(int index) { + return band[index]; + } + + } + + /** + * A replication is an array of layout elements, with an associated count + */ + private class Replication extends LayoutElement { + + private final Integral countElement; + + private final List layoutElements = new ArrayList(); + + public Replication(String tag, String contents) throws IOException { + this.countElement = new Integral(tag); + StringReader stream = new StringReader(contents); + LayoutElement e; + while ((e = readNextLayoutElement(stream)) != null) { + layoutElements.add(e); + } + } + + public void readBands(InputStream in, int count) throws IOException, + Pack200Exception { + countElement.readBands(in, count); + int arrayCount = 0; + for (int i = 0; i < count; i++) { + arrayCount += countElement.getValue(i); + } + for(int i = 0; i < layoutElements.size(); i++) { + LayoutElement element = (LayoutElement) layoutElements.get(i); + element.readBands(in, arrayCount); + } + } + + public void addToAttribute(int index, NewAttribute attribute) { + // Add the count value + countElement.addToAttribute(index, attribute); + + // Add the corresponding array values + int offset = 0; + for (int i = 0; i < index; i++) { + offset += countElement.getValue(i); + } + long numElements = countElement.getValue(index); + for (int i = offset; i < offset + numElements; i++) { + for (int it = 0; it < layoutElements.size(); it++) { + LayoutElement element = (LayoutElement) layoutElements.get(it); + element.addToAttribute(i, attribute); + } + } + } + } + + /** + * A Union is a type of layout element where the tag value acts as a + * selector for one of the union cases + */ + private class Union extends LayoutElement { + + private final Integral unionTag; + private final List unionCases; + private final List defaultCaseBody; + private int[] caseCounts; + private int defaultCount; + + public Union(String tag, List unionCases, List body) { + this.unionTag = new Integral(tag); + this.unionCases = unionCases; + this.defaultCaseBody = body; + } + + public void readBands(InputStream in, int count) throws IOException, + Pack200Exception { + unionTag.readBands(in, count); + int[] values = unionTag.band; + // Count the band size for each union case then read the bands + caseCounts = new int[unionCases.size()]; + for (int i = 0; i < caseCounts.length; i++) { + UnionCase unionCase = (UnionCase) unionCases.get(i); + for (int j = 0; j < values.length; j++) { + if (unionCase.hasTag(values[j])) { + caseCounts[i]++; + } + } + unionCase.readBands(in, caseCounts[i]); + } + // Count number of default cases then read the default bands + for (int i = 0; i < values.length; i++) { + boolean found = false; + for(int it = 0; it < unionCases.size(); it++) { + UnionCase unionCase = (UnionCase) unionCases.get(it); + if (unionCase.hasTag(values[i])) { + found = true; + } + } + if (!found) { + defaultCount++; + } + } + if (defaultCaseBody != null) { + for(int i = 0; i < defaultCaseBody.size(); i++) { + LayoutElement element = (LayoutElement) defaultCaseBody.get(i); + element.readBands(in, defaultCount); + } + } + } + + public void addToAttribute(int n, NewAttribute attribute) { + unionTag.addToAttribute(n, attribute); + int offset = 0; + int[] tagBand = unionTag.band; + long tag = unionTag.getValue(n); + boolean defaultCase = true; + for(int i = 0; i < unionCases.size(); i++) { + UnionCase element = (UnionCase) unionCases.get(i); + if (element.hasTag(tag)) { + defaultCase = false; + for (int j = 0; j < n; j++) { + if (element.hasTag(tagBand[j])) { + offset++; + } + } + element.addToAttribute(offset, attribute); + } + } + if (defaultCase) { + // default case + int defaultOffset = 0; + for (int j = 0; j < n; j++) { + boolean found = false; + for(int i = 0; i < unionCases.size(); i++) { + UnionCase element = (UnionCase) unionCases.get(i); + if (element.hasTag(tagBand[j])) { + found = true; + } + } + if (!found) { + defaultOffset++; + } + } + if (defaultCaseBody != null) { + for(int i = 0; i < defaultCaseBody.size(); i++) { + LayoutElement element = (LayoutElement) defaultCaseBody.get(i); + element.addToAttribute(defaultOffset, attribute); + } + } + } + } + + } + + private class Call extends LayoutElement { + + private final int callableIndex; + private Callable callable; + + public Call(int callableIndex) { + this.callableIndex = callableIndex; + } + + public void setCallable(Callable callable) { + this.callable = callable; + if (callableIndex < 1) { + callable.setBackwardsCallable(); + } + } + + public void readBands(InputStream in, int count) { + /* + * We don't read anything here, but we need to pass the extra count + * to the callable if it's a forwards call. For backwards callables + * the count is transmitted directly in the attribute bands and so + * it is added later. + */ + if (callableIndex > 0) { + callable.addCount(count); + } + } + + public void addToAttribute(int n, NewAttribute attribute) { + callable.addNextToAttribute(attribute); + } + } + + /** + * Constant Pool Reference + */ + private class Reference extends LayoutElement { + + private final String tag; + + private Object band; + + private final int length; + + public Reference(String tag) { + this.tag = tag; + length = getLength(tag.charAt(tag.length() - 1)); + } + + public void readBands(InputStream in, int count) throws IOException, + Pack200Exception { + if (tag.startsWith("KI")) { // Integer + band = parseCPIntReferences(attributeLayout.getName(), in, + Codec.UNSIGNED5, count); + } else if (tag.startsWith("KJ")) { // Long + band = parseCPLongReferences(attributeLayout.getName(), in, + Codec.UNSIGNED5, count); + } else if (tag.startsWith("KF")) { // Float + band = parseCPFloatReferences(attributeLayout.getName(), in, + Codec.UNSIGNED5, count); + } else if (tag.startsWith("KD")) { // Double + band = parseCPDoubleReferences(attributeLayout.getName(), in, + Codec.UNSIGNED5, count); + } else if (tag.startsWith("KS")) { // String + band = parseCPStringReferences(attributeLayout.getName(), in, + Codec.UNSIGNED5, count); + } else if (tag.startsWith("RC")) { // Class + band = parseCPClassReferences(attributeLayout.getName(), in, + Codec.UNSIGNED5, count); + } else if (tag.startsWith("RS")) { // Signature + band = parseCPSignatureReferences(attributeLayout.getName(), + in, Codec.UNSIGNED5, count); + } else if (tag.startsWith("RD")) { // Descriptor + band = parseCPDescriptorReferences(attributeLayout.getName(), + in, Codec.UNSIGNED5, count); + } else if (tag.startsWith("RF")) { // Field Reference + band = parseCPFieldRefReferences(attributeLayout.getName(), in, + Codec.UNSIGNED5, count); + } else if (tag.startsWith("RM")) { // Method Reference + band = parseCPMethodRefReferences(attributeLayout.getName(), + in, Codec.UNSIGNED5, count); + } else if (tag.startsWith("RI")) { // Interface Method Reference + band = parseCPInterfaceMethodRefReferences(attributeLayout + .getName(), in, Codec.UNSIGNED5, count); + } else if (tag.startsWith("RU")) { // UTF8 String + band = parseCPUTF8References(attributeLayout.getName(), in, + Codec.UNSIGNED5, count); + } + } + + public void addToAttribute(int n, NewAttribute attribute) { + if (tag.startsWith("KI")) { // Integer + attribute.addCPConstant(length, ((CPInteger[]) band)[n]); + } else if (tag.startsWith("KJ")) { // Long + attribute.addCPConstant(length, ((CPLong[]) band)[n]); + } else if (tag.startsWith("KF")) { // Float + attribute.addCPConstant(length, ((CPFloat[]) band)[n]); + } else if (tag.startsWith("KD")) { // Double + attribute.addCPConstant(length, ((CPDouble[]) band)[n]); + } else if (tag.startsWith("KS")) { // String + attribute.addCPConstant(length, ((CPString[]) band)[n]); + } else if (tag.startsWith("RC")) { // Class + attribute.addCPClass(length, ((CPClass[]) band)[n]); + } else if (tag.startsWith("RS")) { // Signature + attribute.addCPUTF8(length, ((CPUTF8[]) band)[n]); + } else if (tag.startsWith("RD")) { // Descriptor + attribute.addCPNameAndType(length, ((CPNameAndType[]) band)[n]); + } else if (tag.startsWith("RF")) { // Field Reference + attribute.addCPFieldRef(length, ((CPFieldRef[]) band)[n]); + } else if (tag.startsWith("RM")) { // Method Reference + attribute.addCPMethodRef(length, ((CPMethodRef[]) band)[n]); + } else if (tag.startsWith("RI")) { // Interface Method Reference + attribute.addCPIMethodRef(length, + ((CPInterfaceMethodRef[]) band)[n]); + } else if (tag.startsWith("RU")) { // UTF8 String + attribute.addCPUTF8(length, ((CPUTF8[]) band)[n]); + } + } + + } + + private static class Callable implements AttributeLayoutElement { + + private final List body; + + private boolean isBackwardsCallable; + + private boolean isFirstCallable; + + public Callable(List body) throws IOException { + this.body = body; + } + + private int count; + private int index; + + /** + * Used by calls when adding band contents to attributes so they don't + * have to keep track of the internal index of the callable + * + * @param attribute + */ + public void addNextToAttribute(NewAttribute attribute) { + for(int i = 0; i < body.size(); i++) { + LayoutElement element = (LayoutElement) body.get(i); + element.addToAttribute(index, attribute); + } + index++; + } + + /** + * Adds the count of a call to this callable (ie the number of calls) + * + * @param count + */ + public void addCount(int count) { + this.count += count; + } + + public void readBands(InputStream in, int count) throws IOException, + Pack200Exception { + if(isFirstCallable) { + count += this.count; + } else { + count = this.count; + } + for(int i = 0; i < body.size(); i++) { + LayoutElement element = (LayoutElement) body.get(i); + element.readBands(in, count); + } + } + + public void addToAttribute(int n, NewAttribute attribute) { + if(isFirstCallable) { + // Ignore n because bands also contain element parts from calls + for(int i = 0; i < body.size(); i++) { + LayoutElement element = (LayoutElement) body.get(i); + element.addToAttribute(index, attribute); + } + index++; + } + } + + public boolean isBackwardsCallable() { + return isBackwardsCallable; + } + + /** + * Tells this Callable that it is a backwards callable + */ + public void setBackwardsCallable() { + this.isBackwardsCallable = true; + } + + public void setFirstCallable(boolean isFirstCallable) { + this.isFirstCallable = isFirstCallable; + } + } + + /** + * A Union case + */ + private class UnionCase extends LayoutElement { + + private List body; + + private final List tags; + + public UnionCase(List tags) { + this.tags = tags; + } + + public boolean hasTag(long l) { + return tags.contains(new Integer((int) l)); + } + + public UnionCase(List tags, List body) throws IOException { + this.tags = tags; + this.body = body; + } + + public void readBands(InputStream in, int count) throws IOException, + Pack200Exception { + if (body != null) { + for(int i = 0; i < body.size(); i++) { + LayoutElement element = (LayoutElement) body.get(i); + element.readBands(in, count); + } + } + } + + public void addToAttribute(int index, NewAttribute attribute) { + if (body != null) { + for(int i = 0; i < body.size(); i++) { + LayoutElement element = (LayoutElement) body.get(i); + element.addToAttribute(index, attribute); + } + } + } + } + + /** + * Utility method to get the contents of the given stream, up to the next + * ']', (ignoring pairs of brackets '[' and ']') + * + * @param stream + * @return + * @throws IOException + */ + private StringReader getStreamUpToMatchingBracket(StringReader stream) + throws IOException { + StringBuffer sb = new StringBuffer(); + int foundBracket = -1; + while (foundBracket != 0) { + char c = (char) stream.read(); + if (c == ']') { + foundBracket++; + } + if (c == '[') { + foundBracket--; + } + if (!(foundBracket == 0)) { + sb.append(c); + } + } + return new StringReader(sb.toString()); + } + + /** + * Returns the {@link BHSDCodec} that should be used for the given layout + * element + * + * @param layoutElement + */ + public BHSDCodec getCodec(String layoutElement) { + if (layoutElement.indexOf('O') >= 0) { + return Codec.BRANCH5; + } else if (layoutElement.indexOf('P') >= 0) { + return Codec.BCI5; + } else if (layoutElement.indexOf('S') >= 0 && layoutElement.indexOf("KS") < 0 //$NON-NLS-1$ + && layoutElement.indexOf("RS") < 0) { //$NON-NLS-1$ + return Codec.SIGNED5; + } else if (layoutElement.indexOf('B') >= 0) { + return Codec.BYTE1; + } else { + return Codec.UNSIGNED5; + } + } + + /** + * Utility method to get the contents of the given stream, up to the next + * ']', (ignoring pairs of brackets '[' and ']') + * + * @param stream + * @return + * @throws IOException + */ + private String readUpToMatchingBracket(StringReader stream) + throws IOException { + StringBuffer sb = new StringBuffer(); + int foundBracket = -1; + while (foundBracket != 0) { + char c = (char) stream.read(); + if (c == ']') { + foundBracket++; + } + if (c == '[') { + foundBracket--; + } + if (!(foundBracket == 0)) { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * Read a number from the stream and return it + * + * @param stream + * @return + * @throws IOException + */ + private Integer readNumber(StringReader stream) throws IOException { + stream.mark(1); + char first = (char) stream.read(); + boolean negative = first == '-'; + if (!negative) { + stream.reset(); + } + stream.mark(100); + int i; + int length = 0; + while ((i = (stream.read())) != -1 && Character.isDigit((char) i)) { + length++; + } + stream.reset(); + if(length == 0) { + return null; + } + char[] digits = new char[length]; + int read = stream.read(digits); + if (read != digits.length) { + throw new IOException("Error reading from the input stream"); + } + return new Integer(Integer.parseInt((negative ? "-" : "") + new String(digits))); + } + + /** + * Read a 'body' section of the layout from the given stream + * + * @param stream + * @return List of LayoutElements + * @throws IOException + */ + private List readBody(StringReader stream) throws IOException { + List layoutElements = new ArrayList(); + LayoutElement e; + while ((e = readNextLayoutElement(stream)) != null) { + layoutElements.add(e); + } + return layoutElements; + } + + public int getBackwardsCallCount() { + return backwardsCallCount; + } + + /** + * Once the attribute bands have been read the callables can be informed + * about the number of times each is subject to a backwards call. This + * method is used to set this information. + * + * @param backwardsCalls + * one int for each backwards callable, which contains the number + * of times that callable is subject to a backwards call. + * @throws IOException + */ + public void setBackwardsCalls(int[] backwardsCalls) throws IOException { + int index = 0; + parseLayout(); + for(int i = 0; i < attributeLayoutElements.size(); i++) { + AttributeLayoutElement element = (AttributeLayoutElement) attributeLayoutElements.get(i); + if (element instanceof Callable + && ((Callable) element).isBackwardsCallable()) { + ((Callable) element).addCount(backwardsCalls[index]); + index++; + } + } + } + + public void unpack() throws IOException, Pack200Exception { + + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/Segment.java b/src/main/java/org/apache/harmony/unpack200/Segment.java new file mode 100644 index 0000000..85c95d0 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/Segment.java @@ -0,0 +1,640 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.TimeZone; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.zip.CRC32; +import java.util.zip.GZIPInputStream; +import java.util.zip.ZipEntry; + +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.Attribute; +import org.apache.harmony.unpack200.bytecode.CPClass; +import org.apache.harmony.unpack200.bytecode.CPField; +import org.apache.harmony.unpack200.bytecode.CPMethod; +import org.apache.harmony.unpack200.bytecode.CPUTF8; +import org.apache.harmony.unpack200.bytecode.ClassConstantPool; +import org.apache.harmony.unpack200.bytecode.ClassFile; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; +import org.apache.harmony.unpack200.bytecode.InnerClassesAttribute; +import org.apache.harmony.unpack200.bytecode.SourceFileAttribute; + +/** + * A Pack200 archive consists of one or more segments. Each segment is + * stand-alone, in the sense that every segment has the magic number header; + * thus, every segment is also a valid archive. However, it is possible to + * combine (non-GZipped) archives into a single large archive by concatenation + * alone. Thus all the hard work in unpacking an archive falls to understanding + * a segment. + * + * The first component of a segment is the header; this contains (amongst other + * things) the expected counts of constant pool entries, which in turn defines + * how many values need to be read from the stream. Because values are variable + * width (see {@link Codec}), it is not possible to calculate the start of the + * next segment, although one of the header values does hint at the size of the + * segment if non-zero, which can be used for buffering purposes. + * + * Note that this does not perform any buffering of the input stream; each value + * will be read on a byte-by-byte basis. It does not perform GZip decompression + * automatically; both of these are expected to be done by the caller if the + * stream has the magic header for GZip streams ({@link GZIPInputStream#GZIP_MAGIC}). + * In any case, if GZip decompression is being performed the input stream will + * be buffered at a higher level, and thus this can read on a byte-oriented + * basis. + */ +public class Segment { + + public static final int LOG_LEVEL_VERBOSE = 2; + + public static final int LOG_LEVEL_STANDARD = 1; + + public static final int LOG_LEVEL_QUIET = 0; + + private SegmentHeader header; + + private CpBands cpBands; + + private AttrDefinitionBands attrDefinitionBands; + + private IcBands icBands; + + private ClassBands classBands; + + private BcBands bcBands; + + private FileBands fileBands; + + private boolean overrideDeflateHint; + + private boolean deflateHint; + + private boolean doPreRead; + + private int logLevel; + + private PrintWriter logStream; + + private byte[][] classFilesContents; + + private boolean[] fileDeflate; + + private boolean[] fileIsClass; + + private InputStream internalBuffer; + + private ClassFile buildClassFile(int classNum) throws Pack200Exception { + ClassFile classFile = new ClassFile(); + int[] major = classBands.getClassVersionMajor(); + int[] minor = classBands.getClassVersionMinor(); + if(major != null) { + classFile.major = major[classNum]; + classFile.minor = minor[classNum]; + } else { + classFile.major = header.getDefaultClassMajorVersion(); + classFile.minor = header.getDefaultClassMinorVersion(); + } + // build constant pool + ClassConstantPool cp = classFile.pool; + int fullNameIndexInCpClass = classBands.getClassThisInts()[classNum]; + String fullName = cpBands.getCpClass()[fullNameIndexInCpClass]; + // SourceFile attribute + int i = fullName.lastIndexOf("/") + 1; // if lastIndexOf==-1, then + // -1+1=0, so str.substring(0) + // == str + + // Get the source file attribute + ArrayList classAttributes = classBands.getClassAttributes()[classNum]; + SourceFileAttribute sourceFileAttribute = null; + for (int index = 0; index < classAttributes.size(); index++) { + if (((Attribute) classAttributes.get(index)) + .isSourceFileAttribute()) { + sourceFileAttribute = ((SourceFileAttribute) classAttributes + .get(index)); + } + } + + if (sourceFileAttribute == null) { + // If we don't have a source file attribute yet, we need + // to infer it from the class. + AttributeLayout SOURCE_FILE = attrDefinitionBands + .getAttributeDefinitionMap().getAttributeLayout( + AttributeLayout.ATTRIBUTE_SOURCE_FILE, + AttributeLayout.CONTEXT_CLASS); + if (SOURCE_FILE.matches(classBands.getRawClassFlags()[classNum])) { + int firstDollar = SegmentUtils.indexOfFirstDollar(fullName); + String fileName = null; + + if (firstDollar > -1 && (i <= firstDollar)) { + fileName = fullName.substring(i, firstDollar) + ".java"; + } else { + fileName = fullName.substring(i) + ".java"; + } + sourceFileAttribute = new SourceFileAttribute(cpBands + .cpUTF8Value(fileName, false)); + classFile.attributes = new Attribute[] { (Attribute) cp + .add(sourceFileAttribute) }; + } else { + classFile.attributes = new Attribute[] {}; + } + } else { + classFile.attributes = new Attribute[] { (Attribute) cp + .add(sourceFileAttribute) }; + } + + // If we see any class attributes, add them to the class's attributes + // that will + // be written out. Keep SourceFileAttributes out since we just + // did them above. + ArrayList classAttributesWithoutSourceFileAttribute = new ArrayList(classAttributes.size()); + for (int index = 0; index < classAttributes.size(); index++) { + Attribute attrib = (Attribute) classAttributes.get(index); + if (!attrib.isSourceFileAttribute()) { + classAttributesWithoutSourceFileAttribute.add(attrib); + } + } + Attribute[] originalAttributes = classFile.attributes; + classFile.attributes = new Attribute[originalAttributes.length + + classAttributesWithoutSourceFileAttribute.size()]; + System.arraycopy(originalAttributes, 0, classFile.attributes, 0, + originalAttributes.length); + for (int index = 0; index < classAttributesWithoutSourceFileAttribute + .size(); index++) { + Attribute attrib = ((Attribute) classAttributesWithoutSourceFileAttribute + .get(index)); + cp.add(attrib); + classFile.attributes[originalAttributes.length + index] = attrib; + } + + // this/superclass + ClassFileEntry cfThis = cp.add(cpBands.cpClassValue(fullNameIndexInCpClass)); + ClassFileEntry cfSuper = cp.add(cpBands.cpClassValue(classBands + .getClassSuperInts()[classNum])); + // add interfaces + ClassFileEntry cfInterfaces[] = new ClassFileEntry[classBands + .getClassInterfacesInts()[classNum].length]; + for (i = 0; i < cfInterfaces.length; i++) { + cfInterfaces[i] = cp.add(cpBands.cpClassValue(classBands + .getClassInterfacesInts()[classNum][i])); + } + // add fields + ClassFileEntry cfFields[] = new ClassFileEntry[classBands + .getClassFieldCount()[classNum]]; + // fieldDescr and fieldFlags used to create this + for (i = 0; i < cfFields.length; i++) { + int descriptorIndex = classBands.getFieldDescrInts()[classNum][i]; + int nameIndex = cpBands.getCpDescriptorNameInts()[descriptorIndex]; + int typeIndex = cpBands.getCpDescriptorTypeInts()[descriptorIndex]; + CPUTF8 name = cpBands.cpUTF8Value(nameIndex); + CPUTF8 descriptor = cpBands.cpSignatureValue(typeIndex); + cfFields[i] = cp.add(new CPField(name, descriptor, classBands + .getFieldFlags()[classNum][i], classBands + .getFieldAttributes()[classNum][i])); + } + // add methods + ClassFileEntry cfMethods[] = new ClassFileEntry[classBands + .getClassMethodCount()[classNum]]; + // methodDescr and methodFlags used to create this + for (i = 0; i < cfMethods.length; i++) { + int descriptorIndex = classBands.getMethodDescrInts()[classNum][i]; +// int colon = descriptorStr.indexOf(':'); + int nameIndex = cpBands.getCpDescriptorNameInts()[descriptorIndex]; + int typeIndex = cpBands.getCpDescriptorTypeInts()[descriptorIndex]; + CPUTF8 name = cpBands.cpUTF8Value(nameIndex); + CPUTF8 descriptor = cpBands.cpSignatureValue(typeIndex); + cfMethods[i] = cp.add(new CPMethod(name, descriptor, classBands + .getMethodFlags()[classNum][i], classBands + .getMethodAttributes()[classNum][i])); + } + cp.addNestedEntries(); + + // add inner class attribute (if required) + boolean addInnerClassesAttr = false; + IcTuple[] ic_local = getClassBands().getIcLocal()[classNum]; + boolean ic_local_sent = ic_local != null; + InnerClassesAttribute innerClassesAttribute = new InnerClassesAttribute( + "InnerClasses"); + IcTuple[] ic_relevant = getIcBands().getRelevantIcTuples(fullName, cp); + List ic_stored = computeIcStored(ic_local, ic_relevant); + for (int index = 0; index < ic_stored.size(); index++) { + IcTuple icStored = (IcTuple)ic_stored.get(index); + int innerClassIndex = icStored.thisClassIndex(); + int outerClassIndex = icStored.outerClassIndex(); + int simpleClassNameIndex = icStored.simpleClassNameIndex(); + + String innerClassString = icStored.thisClassString(); + String outerClassString = icStored.outerClassString(); + String simpleClassName = icStored.simpleClassName(); + + CPClass innerClass = null; + CPUTF8 innerName = null; + CPClass outerClass = null; + + innerClass = innerClassIndex != -1 ? cpBands + .cpClassValue(innerClassIndex) : cpBands + .cpClassValue(innerClassString); + if (!icStored.isAnonymous()) { + innerName = simpleClassNameIndex != -1 ? cpBands.cpUTF8Value( + simpleClassNameIndex) : cpBands + .cpUTF8Value(simpleClassName); + } + + if (icStored.isMember()) { + outerClass = outerClassIndex != -1 ? cpBands + .cpClassValue(outerClassIndex) : cpBands + .cpClassValue(outerClassString); + } + int flags = icStored.F; + innerClassesAttribute.addInnerClassesEntry(innerClass, outerClass, + innerName, flags); + addInnerClassesAttr = true; + } + // If ic_local is sent and it's empty, don't add + // the inner classes attribute. + if (ic_local_sent && (ic_local.length == 0)) { + addInnerClassesAttr = false; + } + + // If ic_local is not sent and ic_relevant is empty, + // don't add the inner class attribute. + if (!ic_local_sent && (ic_relevant.length == 0)) { + addInnerClassesAttr = false; + } + + if (addInnerClassesAttr) { + // Need to add the InnerClasses attribute to the + // existing classFile attributes. + Attribute[] originalAttrs = classFile.attributes; + Attribute[] newAttrs = new Attribute[originalAttrs.length + 1]; + for (int index = 0; index < originalAttrs.length; index++) { + newAttrs[index] = originalAttrs[index]; + } + newAttrs[newAttrs.length - 1] = innerClassesAttribute; + classFile.attributes = newAttrs; + cp.addWithNestedEntries(innerClassesAttribute); + } + // sort CP according to cp_All + cp.resolve(this); + // NOTE the indexOf is only valid after the cp.resolve() + // build up remainder of file + classFile.accessFlags = (int) classBands.getClassFlags()[classNum]; + classFile.thisClass = cp.indexOf(cfThis); + classFile.superClass = cp.indexOf(cfSuper); + // TODO placate format of file for writing purposes + classFile.interfaces = new int[cfInterfaces.length]; + for (i = 0; i < cfInterfaces.length; i++) { + classFile.interfaces[i] = cp.indexOf(cfInterfaces[i]); + } + classFile.fields = cfFields; + classFile.methods = cfMethods; + return classFile; + } + + /** + * Given an ic_local and an ic_relevant, use them to calculate what should + * be added as ic_stored. + * + * @param ic_local + * IcTuple[] array of local transmitted tuples + * @param ic_relevant + * IcTuple[] array of relevant tuples + * @return List of tuples to be stored. If ic_local is null or + * empty, the values returned may not be correct. The caller will + * have to determine if this is the case. + */ + private List computeIcStored(IcTuple[] ic_local, IcTuple[] ic_relevant) { + List result = new ArrayList(ic_relevant.length); + List duplicates = new ArrayList(ic_relevant.length); + Set isInResult = new HashSet(ic_relevant.length); + + // need to compute: + // result = ic_local XOR ic_relevant + + // add ic_local + if (ic_local != null) { + for(int index = 0; index < ic_local.length; index++) { + if (isInResult.add(ic_local[index])) { + result.add(ic_local[index]); + } + } + } + + // add ic_relevant + for(int index = 0; index < ic_relevant.length; index++) { + if (isInResult.add(ic_relevant[index])) { + result.add(ic_relevant[index]); + } else { + duplicates.add(ic_relevant[index]); + } + } + + // eliminate "duplicates" + for(int index = 0; index < duplicates.size(); index++) { + IcTuple tuple = (IcTuple)duplicates.get(index); + result.remove(tuple); + } + + return result; + } + + /** + * This performs reading the data from the stream into non-static instance of + * Segment. After the completion of this method stream can be freed. + * + * @param in + * the input stream to read from + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * codec + */ + private void readSegment(InputStream in) throws IOException, + Pack200Exception { + log(LOG_LEVEL_VERBOSE, "-------"); + cpBands = new CpBands(this); + cpBands.read(in); + attrDefinitionBands = new AttrDefinitionBands(this); + attrDefinitionBands.read(in); + icBands = new IcBands(this); + icBands.read(in); + classBands = new ClassBands(this); + classBands.read(in); + bcBands = new BcBands(this); + bcBands.read(in); + fileBands = new FileBands(this); + fileBands.read(in); + + fileBands.processFileBits(); + } + + /** + * This performs the actual work of parsing against a non-static instance of + * Segment. This method is intended to run concurrently for multiple segments. + * + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * codec + */ + private void parseSegment() throws IOException, Pack200Exception { + + header.unpack(); + cpBands.unpack(); + attrDefinitionBands.unpack(); + icBands.unpack(); + classBands.unpack(); + bcBands.unpack(); + fileBands.unpack(); + + int classNum = 0; + int numberOfFiles = header.getNumberOfFiles(); + String[] fileName = fileBands.getFileName(); + int[] fileOptions = fileBands.getFileOptions(); + SegmentOptions options = header.getOptions(); + + classFilesContents = new byte[numberOfFiles][]; + fileDeflate = new boolean[numberOfFiles]; + fileIsClass = new boolean[numberOfFiles]; + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + + for (int i = 0; i < numberOfFiles; i++) { + String name = fileName[i]; + + boolean nameIsEmpty = (name == null) || name.equals(""); + boolean isClass = (fileOptions[i] & 2) == 2 || nameIsEmpty; + if (isClass && nameIsEmpty) { + name = cpBands.getCpClass()[classBands.getClassThisInts()[classNum]] + ".class"; + fileName[i] = name; + } + + if (!overrideDeflateHint) { + fileDeflate[i] = (fileOptions[i] & 1) == 1 || options.shouldDeflate(); + } else { + fileDeflate[i] = deflateHint; + } + + fileIsClass[i] = isClass; + + if (isClass) { + ClassFile classFile = buildClassFile(classNum); + classFile.write(dos); + dos.flush(); + + classFilesContents[classNum] = bos.toByteArray(); + bos.reset(); + + classNum++; + } + } + } + + /** + * Unpacks a packed stream (either .pack. or .pack.gz) into a corresponding + * JarOuputStream. + * + * @throws Pack200Exception + * if there is a problem unpacking + * @throws IOException + * if there is a problem with I/O during unpacking + */ + public void unpack(InputStream in, JarOutputStream out) throws IOException, + Pack200Exception { + unpackRead(in); + unpackProcess(); + unpackWrite(out); + } + + /* + * Package-private accessors for unpacking stages + */ + void unpackRead(InputStream in) throws IOException, Pack200Exception { + if (!in.markSupported()) + in = new BufferedInputStream(in); + + header = new SegmentHeader(this); + header.read(in); + + int size = (int)header.getArchiveSize() - header.getArchiveSizeOffset(); + + if (doPreRead && header.getArchiveSize() != 0) { + byte[] data = new byte[size]; + in.read(data); + internalBuffer = new BufferedInputStream(new ByteArrayInputStream(data)); + } else { + readSegment(in); + } + } + + void unpackProcess() throws IOException, Pack200Exception { + if(internalBuffer != null) { + readSegment(internalBuffer); + } + parseSegment(); + } + + void unpackWrite(JarOutputStream out) throws IOException, Pack200Exception { + writeJar(out); + } + + /** + * Writes the segment to an output stream. The output stream should be + * pre-buffered for efficiency. Also takes the same input stream for + * reading, since the file bits may not be loaded and thus just copied from + * one stream to another. Doesn't close the output stream when finished, in + * case there are more entries (e.g. further segments) to be written. + * + * @param out + * the JarOutputStream to write data to + * @throws IOException + * if an error occurs while reading or writing to the streams + * @throws Pack200Exception + * if an error occurs while processing data + */ + public void writeJar(JarOutputStream out) throws IOException, + Pack200Exception { + String[] fileName = fileBands.getFileName(); + int[] fileModtime = fileBands.getFileModtime(); + long[] fileSize = fileBands.getFileSize(); + byte[][] fileBits = fileBands.getFileBits(); + + // now write the files out + int classNum = 0; + int numberOfFiles = header.getNumberOfFiles(); + long archiveModtime = header.getArchiveModtime(); + + for (int i = 0; i < numberOfFiles; i++) { + String name = fileName[i]; + // For Pack200 archives, modtime is in seconds + // from the epoch. JarEntries need it to be in + // milliseconds from the epoch. + // Even though we're adding two longs and multiplying + // by 1000, we won't overflow because both longs are + // always under 2^32. + long modtime = 1000 * (archiveModtime + fileModtime[i]); + boolean deflate = fileDeflate[i]; + + JarEntry entry = new JarEntry(name); + if (deflate) { + entry.setMethod(ZipEntry.DEFLATED); + } else { + entry.setMethod(ZipEntry.STORED); + CRC32 crc = new CRC32(); + if(fileIsClass[i]) { + crc.update(classFilesContents[classNum]); + entry.setSize(classFilesContents[classNum].length); + } else { + crc.update(fileBits[i]); + entry.setSize(fileSize[i]); + } + entry.setCrc(crc.getValue()); + } + // On Windows at least, need to correct for timezone + entry.setTime(modtime - TimeZone.getDefault().getRawOffset()); + out.putNextEntry(entry); + + // write to output stream + if (fileIsClass[i]) { + entry.setSize(classFilesContents[classNum].length); + out.write(classFilesContents[classNum]); + classNum++; + } else { + entry.setSize(fileSize[i]); + out.write(fileBits[i]); + } + } + } + + public SegmentConstantPool getConstantPool() { + return cpBands.getConstantPool(); + } + + public SegmentHeader getSegmentHeader() { + return header; + } + + public void setPreRead(boolean value) { + doPreRead = value; + } + + protected AttrDefinitionBands getAttrDefinitionBands() { + return attrDefinitionBands; + } + + protected BcBands getBcBands() { + return bcBands; + } + + protected ClassBands getClassBands() { + return classBands; + } + + protected CpBands getCpBands() { + return cpBands; + } + + protected FileBands getFileBands() { + return fileBands; + } + + protected IcBands getIcBands() { + return icBands; + } + + public void setLogLevel(int logLevel) { + this.logLevel = logLevel; + } + + public void setLogStream(OutputStream logStream) { + this.logStream = new PrintWriter(logStream); + } + + public void log(int logLevel, String message) { + if (this.logLevel >= logLevel) { + logStream.println(message); + } + } + + /** + * Override the archive's deflate hint with the given boolean + * + * @param deflateHint - + * the deflate hint to use + */ + public void overrideDeflateHint(boolean deflateHint) { + this.overrideDeflateHint = true; + this.deflateHint = deflateHint; + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/SegmentConstantPool.java b/src/main/java/org/apache/harmony/unpack200/SegmentConstantPool.java new file mode 100644 index 0000000..8b91dcf --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/SegmentConstantPool.java @@ -0,0 +1,317 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.util.List; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; +import org.apache.harmony.unpack200.bytecode.ConstantPoolEntry; + +/** + * SegmentConstantPool manages the constant pool used for re-creating class + * files. + */ +public class SegmentConstantPool { + + private final CpBands bands; + private final SegmentConstantPoolArrayCache arrayCache = new SegmentConstantPoolArrayCache(); + /** + * @param bands + */ + public SegmentConstantPool(CpBands bands) { + this.bands = bands; + } + + // define in archive order + + public static final int ALL = 0; + public static final int UTF_8 = 1; + public static final int CP_INT = 2; + public static final int CP_FLOAT = 3; + public static final int CP_LONG = 4; + public static final int CP_DOUBLE = 5; + public static final int CP_STRING = 6; + public static final int CP_CLASS = 7; + public static final int SIGNATURE = 8; // TODO and more to come -- + public static final int CP_DESCR = 9; + public static final int CP_FIELD = 10; + public static final int CP_METHOD = 11; + public static final int CP_IMETHOD = 12; + + protected static final String REGEX_MATCH_ALL = ".*"; + protected static final String INITSTRING = ""; + protected static final String REGEX_MATCH_INIT = "^" + INITSTRING + ".*"; + + public ClassFileEntry getValue(int cp, long value) throws Pack200Exception { + int index = (int) value; + if (index == -1) { + return null; + } else if (index < 0) { + throw new Pack200Exception("Cannot have a negative range"); + } else if (cp == UTF_8) { + return bands.cpUTF8Value(index); + } else if (cp == CP_INT) { + return bands.cpIntegerValue(index); + } else if (cp == CP_FLOAT) { + return bands.cpFloatValue(index); + } else if (cp == CP_LONG) { + return bands.cpLongValue(index); + } else if (cp == CP_DOUBLE) { + return bands.cpDoubleValue(index); + } else if (cp == CP_STRING) { + return bands.cpStringValue(index); + } else if (cp == CP_CLASS) { + return bands.cpClassValue(index); + } else if (cp == SIGNATURE) { + return bands.cpSignatureValue(index); + } else if (cp == CP_DESCR) { + return bands.cpNameAndTypeValue(index); + } else { + throw new Error("Tried to get a value I don't know about: " + cp); + } + } + + /** + * Subset the constant pool of the specified type to be just that which has + * the specified class name. Answer the ConstantPoolEntry at the + * desiredIndex of the subsetted pool. + * + * @param cp + * type of constant pool array to search + * @param desiredIndex + * index of the constant pool + * @param desiredClassName + * class to use to generate a subset of the pool + * @return ConstantPoolEntry + * @throws Pack200Exception + */ + public ConstantPoolEntry getClassSpecificPoolEntry(int cp, + long desiredIndex, String desiredClassName) throws Pack200Exception { + int index = (int) desiredIndex; + int realIndex = -1; + String array[] = null; + if (cp == CP_FIELD) { + array = bands.getCpFieldClass(); + } else if (cp == CP_METHOD) { + array = bands.getCpMethodClass(); + } else if (cp == CP_IMETHOD) { + array = bands.getCpIMethodClass(); + } else { + throw new Error("Don't know how to handle " + cp); + } + realIndex = matchSpecificPoolEntryIndex(array, desiredClassName, index); + return getConstantPoolEntry(cp, realIndex); + } + + /** + * Given the name of a class, answer the CPClass associated with that class. + * Answer null if the class doesn't exist. + * + * @param name + * Class name to look for (form: java/lang/Object) + * @return CPClass for that class name, or null if not found. + */ + public ConstantPoolEntry getClassPoolEntry(String name) { + String classes[] = bands.getCpClass(); + int index = matchSpecificPoolEntryIndex(classes, name, 0); + if (index == -1) { + return null; + } + try { + return getConstantPoolEntry(CP_CLASS, index); + } catch (Pack200Exception ex) { + throw new Error("Error getting class pool entry"); + } + } + + /** + * Answer the init method for the specified class. + * + * @param cp + * constant pool to search (must be CP_METHOD) + * @param value + * index of init method + * @param desiredClassName + * String class name of the init method + * @return CPMethod init method + * @throws Pack200Exception + */ + public ConstantPoolEntry getInitMethodPoolEntry(int cp, long value, + String desiredClassName) throws Pack200Exception { + int realIndex = -1; + String desiredRegex = REGEX_MATCH_INIT; + if (cp == CP_METHOD) { + realIndex = matchSpecificPoolEntryIndex(bands.getCpMethodClass(), + bands.getCpMethodDescriptor(), desiredClassName, + desiredRegex, (int) value); + } else { + throw new Error("Nothing but CP_METHOD can be an "); + } + return getConstantPoolEntry(cp, realIndex); + } + + /** + * A number of things make use of subsets of structures. In one particular + * example, _super bytecodes will use a subset of method or field classes + * which have just those methods / fields defined in the superclass. + * Similarly, _this bytecodes use just those methods/fields defined in this + * class, and _init bytecodes use just those methods that start with . + * + * This method takes an array of names, a String to match for, an index and + * a boolean as parameters, and answers the array position in the array of + * the indexth element which matches (or equals) the String (depending on + * the state of the boolean) + * + * In other words, if the class array consists of: Object [position 0, 0th + * instance of Object] String [position 1, 0th instance of String] String + * [position 2, 1st instance of String] Object [position 3, 1st instance of + * Object] Object [position 4, 2nd instance of Object] then + * matchSpecificPoolEntryIndex(..., "Object", 2, false) will answer 4. + * matchSpecificPoolEntryIndex(..., "String", 0, false) will answer 1. + * + * @param nameArray + * Array of Strings against which the compareString is tested + * @param compareString + * String for which to search + * @param desiredIndex + * nth element with that match (counting from 0) + * @return int index into nameArray, or -1 if not found. + */ + protected int matchSpecificPoolEntryIndex(String[] nameArray, + String compareString, int desiredIndex) { + return matchSpecificPoolEntryIndex(nameArray, nameArray, compareString, + REGEX_MATCH_ALL, desiredIndex); + } + + /** + * This method's function is to look through pairs of arrays. It keeps track + * of the number of hits it finds using the following basis of comparison + * for a hit: - the primaryArray[index] must be .equals() to the + * primaryCompareString - the secondaryArray[index] .matches() the + * secondaryCompareString. When the desiredIndex number of hits + * has been reached, the index into the original two arrays of + * the element hit is returned. + * + * @param primaryArray + * The first array to search + * @param secondaryArray + * The second array (must be same .length as primaryArray) + * @param primaryCompareString + * The String to compare against primaryArray using .equals() + * @param secondaryCompareRegex + * The String to compare against secondaryArray using .matches() + * @param desiredIndex + * The nth hit whose position we're seeking + * @return int index that represents the position of the nth hit in + * primaryArray and secondaryArray + */ + protected int matchSpecificPoolEntryIndex(String[] primaryArray, + String[] secondaryArray, String primaryCompareString, + String secondaryCompareRegex, int desiredIndex) { + int instanceCount = -1; + List indexList = arrayCache.indexesForArrayKey(primaryArray, primaryCompareString); + if(indexList.isEmpty()) { + // Primary key not found, no chance of finding secondary + return -1; + } + + for(int index=0; index < indexList.size(); index++) { + int arrayIndex = ((Integer)indexList.get(index)).intValue(); + if(regexMatches(secondaryCompareRegex, secondaryArray[arrayIndex])) { + instanceCount++; + if(instanceCount == desiredIndex) { + return arrayIndex; + } + } + } + // We didn't return in the for loop, so the desiredMatch + // with desiredIndex must not exist in the arrays. + return -1; + } + + /** + * We don't want a dependency on regex in Pack200. The only place one exists + * is in matchSpecificPoolEntryIndex(). To eliminate this dependency, we've + * implemented the world's stupidest regexMatch. It knows about the two + * forms we care about: .* (aka REGEX_MATCH_ALL) ^.* (aka + * REGEX_MATCH_INIT) and will answer correctly if those are passed as the + * regexString. + * + * @param regexString + * String against which the compareString will be matched + * @param compareString + * String to match against the regexString + * @return boolean true if the compareString matches the regexString; + * otherwise false. + */ + protected static boolean regexMatches(String regexString, + String compareString) { + if (REGEX_MATCH_ALL.equals(regexString)) { + return true; + } + if (REGEX_MATCH_INIT.equals(regexString)) { + if (compareString.length() < (INITSTRING.length())) { + return false; + } + return (INITSTRING.equals(compareString.substring(0, INITSTRING + .length()))); + } + throw new Error("regex trying to match a pattern I don't know: " + + regexString); + } + + public ConstantPoolEntry getConstantPoolEntry(int cp, long value) + throws Pack200Exception { + int index = (int) value; + if (index == -1) { + return null; + } else if (index < 0) { + throw new Pack200Exception("Cannot have a negative range"); + } else if (cp == UTF_8) { + return bands.cpUTF8Value(index); + } else if (cp == CP_INT) { + return bands.cpIntegerValue(index); + } else if (cp == CP_FLOAT) { + return bands.cpFloatValue(index); + } else if (cp == CP_LONG) { + return bands.cpLongValue(index); + } else if (cp == CP_DOUBLE) { + return bands.cpDoubleValue(index); + } else if (cp == CP_STRING) { + return bands.cpStringValue(index); + } else if (cp == CP_CLASS) { + return bands.cpClassValue(index); + } else if (cp == SIGNATURE) { + throw new Error("I don't know what to do with signatures yet"); + // return null /* new CPSignature(bands.getCpSignature()[index]) */; + } else if (cp == CP_DESCR) { + throw new Error("I don't know what to do with descriptors yet"); + // return null /* new CPDescriptor(bands.getCpDescriptor()[index]) + // */; + } else if (cp == CP_FIELD) { + return bands.cpFieldValue(index); + } else if (cp == CP_METHOD) { + return bands.cpMethodValue(index); + } else if (cp == CP_IMETHOD) { + return bands.cpIMethodValue(index); + } else { + // etc + throw new Error("Get value incomplete"); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/SegmentConstantPoolArrayCache.java b/src/main/java/org/apache/harmony/unpack200/SegmentConstantPoolArrayCache.java new file mode 100644 index 0000000..50df8f7 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/SegmentConstantPoolArrayCache.java @@ -0,0 +1,182 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.IdentityHashMap; +import java.util.List; + +/** + * The SegmentConstantPool spends a lot of time searching + * through large arrays of Strings looking for matches. + * This can be sped up by caching the arrays in HashMaps + * so the String keys are looked up and resolve to positions + * in the array rather than iterating through the arrays + * each time. + * + * Because the arrays only grow (never shrink or change) + * we can use the last known size as a way to determine if + * the array has changed. + * + * Note that this cache must be synchronized externally + * if it is shared. + */ +public class SegmentConstantPoolArrayCache { + + protected IdentityHashMap knownArrays = new IdentityHashMap(1000); + + protected List lastIndexes; + protected String[] lastArray; + protected String lastKey; + + /** + * Answer the indices for the given key in the given + * array. If no such key exists in the cached array, + * answer -1. + * @param array String[] array to search for the value + * @param key String value for which to search + * @return List collection of index positions in the array + */ + public List indexesForArrayKey(String[] array, String key) { + if(!arrayIsCached(array)) { + cacheArray(array); + } + + // If the search is one we've just done, don't even + // bother looking and return the last indices. This + // is a second cache within the cache. This is + // efficient because we usually are looking for + // several secondary elements with the same primary + // key. + if((lastArray == array) && (lastKey == key)) { + return lastIndexes; + } + + // Remember the last thing we found. + lastArray = array; + lastKey = key; + lastIndexes = ((CachedArray)knownArrays.get(array)).indexesForKey(key); + + return lastIndexes; + } + + /** + * Given a String array, answer true if the + * array is correctly cached. Answer false + * if the array is not cached, or if the + * array cache is outdated. + * + * @param array of String + * @return boolean true if up-to-date cache, + * otherwise false. + */ + protected boolean arrayIsCached(String[] array) { + if(!knownArrays.containsKey(array)) { + return false; + } + CachedArray cachedArray = (CachedArray)knownArrays.get(array); + if(cachedArray.lastKnownSize() != array.length) { + return false; + } + return true; + } + + /** + * Cache the array passed in as the argument + * @param array String[] to cache + */ + protected void cacheArray(String[] array) { + if(arrayIsCached(array)) { + throw new IllegalArgumentException("Trying to cache an array that already exists"); + } + knownArrays.put(array, new CachedArray(array)); + // Invalidate the cache-within-a-cache + lastArray = null; + } + + /** + * CachedArray keeps track of the last known size of + * an array as well as a HashMap that knows the mapping + * from element values to the indices of the array + * which contain that value. + */ + protected class CachedArray { + String[] primaryArray; + int lastKnownSize; + HashMap primaryTable; + + public CachedArray(String[] array) { + super(); + this.primaryArray = array; + this.lastKnownSize = array.length; + this.primaryTable = new HashMap(lastKnownSize); + cacheIndexes(); + } + + /** + * Answer the last known size of the array cached. + * If the last known size is not the same as the + * current size, the array must have changed. + * @return int last known size of the cached array + */ + public int lastKnownSize() { + return lastKnownSize; + } + + /** + * Given a particular key, answer a List of + * index locations in the array which contain that + * key. + * + * If no elements are found, answer an empty list. + * + * @param key String element of the array + * @return List of indexes containing that key + * in the array. + */ + public List indexesForKey(String key) { + if(!primaryTable.containsKey(key)) { + return Collections.EMPTY_LIST; + } + return (List)primaryTable.get(key); + } + + /** + * Given a primaryArray, cache its values in a HashMap + * to provide a backwards mapping from element values + * to element indexes. For instance, a primaryArray + * of: + * {"Zero", "Foo", "Two", "Foo"} + * would yield a HashMap of: + * "Zero" -> 0 + * "Foo" -> 1, 3 + * "Two" -> 2 + * which is then cached. + */ + protected void cacheIndexes() { + for(int index=0; index < primaryArray.length; index++) { + String key = primaryArray[index]; + if(!primaryTable.containsKey(key)) { + primaryTable.put(key, new ArrayList()); + } + ((ArrayList)primaryTable.get(key)).add(new Integer(index)); + } + } + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/SegmentHeader.java b/src/main/java/org/apache/harmony/unpack200/SegmentHeader.java new file mode 100644 index 0000000..d48e104 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/SegmentHeader.java @@ -0,0 +1,450 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.ByteArrayInputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +import org.apache.harmony.pack200.BHSDCodec; +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; + +/** + * SegmentHeader is the header band of a {@link Segment} + */ +public class SegmentHeader { + + private int archiveMajor; + + private int archiveMinor; + + private long archiveModtime; + + private long archiveSize; + + private int attributeDefinitionCount; + + private InputStream bandHeadersInputStream; + + private int bandHeadersSize; + + private int classCount; + + private int cpClassCount; + + private int cpDescriptorCount; + + private int cpDoubleCount; + + private int cpFieldCount; + + private int cpFloatCount; + + private int cpIMethodCount; + + private int cpIntCount; + + private int cpLongCount; + + private int cpMethodCount; + + private int cpSignatureCount; + + private int cpStringCount; + + private int cpUTF8Count; + + private int defaultClassMajorVersion; + + private int defaultClassMinorVersion; + + private int innerClassCount; + + private int numberOfFiles; + + private int segmentsRemaining; + + private SegmentOptions options; + + private final Segment segment; + + /** + * The magic header for a Pack200 Segment is 0xCAFED00D. I wonder where they + * get their inspiration from ... + */ + private static final int[] magic = { 0xCA, 0xFE, 0xD0, 0x0D }; + + public SegmentHeader(Segment segment) { + this.segment = segment; + } + + public int getArchiveSizeOffset() { + return archiveSizeOffset; + } + + private int archiveSizeOffset; + + public void read(InputStream in) throws IOException, Pack200Exception, + Error, Pack200Exception { + + int word[] = decodeScalar("archive_magic_word", in, Codec.BYTE1, + magic.length); + for (int m = 0; m < magic.length; m++) + if (word[m] != magic[m]) + throw new Error("Bad header"); + setArchiveMinorVersion(decodeScalar("archive_minver", in, + Codec.UNSIGNED5)); + setArchiveMajorVersion(decodeScalar("archive_majver", in, + Codec.UNSIGNED5)); + options = new SegmentOptions(decodeScalar("archive_options", in, + Codec.UNSIGNED5)); + parseArchiveFileCounts(in); + parseArchiveSpecialCounts(in); + parseCpCounts(in); + parseClassCounts(in); + + if (getBandHeadersSize() > 0) { + byte[] bandHeaders = new byte[getBandHeadersSize()]; + readFully(in, bandHeaders); + setBandHeadersData(bandHeaders); + } + + archiveSizeOffset = archiveSizeOffset - in.available(); + } + + public void unpack() { + + } + + /** + * Sets the minor version of this archive + * + * @param version + * the minor version of the archive + * @throws Pack200Exception + * if the minor version is not 7 + */ + private void setArchiveMinorVersion(int version) throws Pack200Exception { + if (version != 7) + throw new Pack200Exception("Invalid segment minor version"); + archiveMinor = version; + } + + /** + * Sets the major version of this archive. + * + * @param version + * the minor version of the archive + * @throws Pack200Exception + * if the major version is not 150 + */ + private void setArchiveMajorVersion(int version) throws Pack200Exception { + if (version != 150) + throw new Pack200Exception("Invalid segment major version: " + + version); + archiveMajor = version; + } + + public long getArchiveModtime() { + return archiveModtime; + } + + public int getArchiveMajor() { + return archiveMajor; + } + + public int getArchiveMinor() { + return archiveMinor; + } + + public int getAttributeDefinitionCount() { + return attributeDefinitionCount; + } + + public int getClassCount() { + return classCount; + } + + public int getCpClassCount() { + return cpClassCount; + } + + public int getCpDescriptorCount() { + return cpDescriptorCount; + } + + public int getCpDoubleCount() { + return cpDoubleCount; + } + + public int getCpFieldCount() { + return cpFieldCount; + } + + public int getCpFloatCount() { + return cpFloatCount; + } + + public int getCpIMethodCount() { + return cpIMethodCount; + } + + public int getCpIntCount() { + return cpIntCount; + } + + public int getCpLongCount() { + return cpLongCount; + } + + public int getCpMethodCount() { + return cpMethodCount; + } + + public int getCpSignatureCount() { + return cpSignatureCount; + } + + public int getCpStringCount() { + return cpStringCount; + } + + public int getCpUTF8Count() { + return cpUTF8Count; + } + + public int getDefaultClassMajorVersion() { + return defaultClassMajorVersion; + } + + public int getDefaultClassMinorVersion() { + return defaultClassMinorVersion; + } + + public int getInnerClassCount() { + return innerClassCount; + } + + public void setNumberOfFiles(int numberOfFiles) { + this.numberOfFiles = numberOfFiles; + } + + public long getArchiveSize() { + return archiveSize; + } + + /** + * Obtain the band headers data as an input stream. If no band headers are + * present, this will return an empty input stream to prevent any further + * reads taking place. + * + * Note that as a stream, data consumed from this input stream can't be + * re-used. Data is only read from this stream if the encoding is such that + * additional information needs to be decoded from the stream itself. + * + * @return the band headers input stream + */ + public InputStream getBandHeadersInputStream() { + if (bandHeadersInputStream == null) { + bandHeadersInputStream = new ByteArrayInputStream(new byte[0]); + } + return bandHeadersInputStream; + + } + + public int getNumberOfFiles() { + return numberOfFiles; + } + + public int getSegmentsRemaining() { + return segmentsRemaining; + } + + public SegmentOptions getOptions() { + return options; + } + + private void parseArchiveFileCounts(InputStream in) throws IOException, + Pack200Exception { + if (options.hasArchiveFileCounts()) { + setArchiveSize((long)decodeScalar("archive_size_hi", in, Codec.UNSIGNED5) << 32 + | decodeScalar("archive_size_lo", in, Codec.UNSIGNED5)); + archiveSizeOffset = in.available(); + setSegmentsRemaining(decodeScalar("archive_next_count", in, + Codec.UNSIGNED5)); + setArchiveModtime(decodeScalar("archive_modtime", in, + Codec.UNSIGNED5)); + numberOfFiles = decodeScalar("file_count", in, + Codec.UNSIGNED5); + } + } + + private void parseArchiveSpecialCounts(InputStream in) throws IOException, + Pack200Exception { + if (getOptions().hasSpecialFormats()) { + bandHeadersSize = decodeScalar("band_headers_size", in, + Codec.UNSIGNED5); + setAttributeDefinitionCount(decodeScalar("attr_definition_count", + in, Codec.UNSIGNED5)); + } + } + + private void parseClassCounts(InputStream in) throws IOException, + Pack200Exception { + innerClassCount = decodeScalar("ic_count", in, Codec.UNSIGNED5); + defaultClassMinorVersion = decodeScalar("default_class_minver", + in, Codec.UNSIGNED5); + defaultClassMajorVersion = decodeScalar("default_class_majver", + in, Codec.UNSIGNED5); + classCount = decodeScalar("class_count", in, Codec.UNSIGNED5); + } + + private void parseCpCounts(InputStream in) throws IOException, + Pack200Exception { + cpUTF8Count = decodeScalar("cp_Utf8_count", in, Codec.UNSIGNED5); + if (getOptions().hasCPNumberCounts()) { + cpIntCount = decodeScalar("cp_Int_count", in, Codec.UNSIGNED5); + cpFloatCount = decodeScalar("cp_Float_count", in, + Codec.UNSIGNED5); + cpLongCount = decodeScalar("cp_Long_count", in, + Codec.UNSIGNED5); + cpDoubleCount = decodeScalar("cp_Double_count", in, + Codec.UNSIGNED5); + } + cpStringCount = decodeScalar("cp_String_count", in, + Codec.UNSIGNED5); + cpClassCount = decodeScalar("cp_Class_count", in, Codec.UNSIGNED5); + cpSignatureCount = decodeScalar("cp_Signature_count", in, + Codec.UNSIGNED5); + cpDescriptorCount = decodeScalar("cp_Descr_count", in, + Codec.UNSIGNED5); + cpFieldCount = decodeScalar("cp_Field_count", in, Codec.UNSIGNED5); + cpMethodCount = decodeScalar("cp_Method_count", in, + Codec.UNSIGNED5); + cpIMethodCount = decodeScalar("cp_Imethod_count", in, + Codec.UNSIGNED5); + } + + /** + * Decode a number of scalars from the band file. A scalar is like a band, + * but does not perform any band code switching. + * + * @param name + * the name of the scalar (primarily for logging/debugging + * purposes) + * @param in + * the input stream to read from + * @param codec + * the codec for this scalar + * @return an array of decoded long[] values + * @throws IOException + * if there is a problem reading from the underlying input + * stream + * @throws Pack200Exception + * if there is a problem decoding the value or that the value is + * invalid + */ + private int[] decodeScalar(String name, InputStream in, BHSDCodec codec, + int n) throws IOException, Pack200Exception { + segment.log(Segment.LOG_LEVEL_VERBOSE, "Parsed #" + name + " (" + n + + ")"); + return codec.decodeInts(n, in); + } + + /** + * Decode a scalar from the band file. A scalar is like a band, but does not + * perform any band code switching. + * + * @param name + * the name of the scalar (primarily for logging/debugging + * purposes) + * @param in + * the input stream to read from + * @param codec + * the codec for this scalar + * @return the decoded value + * @throws IOException + * if there is a problem reading from the underlying input + * stream + * @throws Pack200Exception + * if there is a problem decoding the value or that the value is + * invalid + */ + private int decodeScalar(String name, InputStream in, BHSDCodec codec) + throws IOException, Pack200Exception { + int ret = codec.decode(in); + segment + .log(Segment.LOG_LEVEL_VERBOSE, "Parsed #" + name + " as " + + ret); + return ret; + } + + public void setArchiveModtime(long archiveModtime) { + this.archiveModtime = archiveModtime; + } + + public void setArchiveSize(long archiveSize) { + this.archiveSize = archiveSize; + } + + private void setAttributeDefinitionCount(long valuie) { + this.attributeDefinitionCount = (int) valuie; + } + + private void setBandHeadersData(byte[] bandHeaders) { + this.bandHeadersInputStream = new ByteArrayInputStream(bandHeaders); + } + + public void setSegmentsRemaining(long value) { + segmentsRemaining = (int) value; + } + + /** + * Completely reads in a byte array, akin to the implementation in + * {@link java.lang.DataInputStream}. TODO Refactor out into a separate + * InputStream handling class + * + * @param in + * the input stream to read from + * @param data + * the byte array to read into + * @throws IOException + * if a problem occurs during reading from the underlying stream + * @throws Pack200Exception + * if a problem occurs with an unexpected value or unsupported + * codec + */ + private void readFully(InputStream in, byte[] data) throws IOException, + Pack200Exception { + int total = in.read(data); + if (total == -1) + throw new EOFException("Failed to read any data from input stream"); + while (total < data.length) { + int delta = in.read(data, total, data.length - total); + if (delta == -1) + throw new EOFException( + "Failed to read some data from input stream"); + total += delta; + } + } + + public int getBandHeadersSize() { + return bandHeadersSize; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/SegmentOptions.java b/src/main/java/org/apache/harmony/unpack200/SegmentOptions.java new file mode 100644 index 0000000..37858a3 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/SegmentOptions.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import org.apache.harmony.pack200.Pack200Exception; + +/** + * Stores the combinations of bit flags that can be used in the segment header + * options. Whilst this could be defined in {@link Segment}, it's cleaner to + * pull it out into a separate class, not least because methods can then be used + * to determine the semantic meaning of the flags. In languages with a + * pre-processor, these may be defined by macros that do bitflag manipulation + * instead. + */ +public class SegmentOptions { + + private static final int DEFLATE_HINT = 1 << 5; + + private static final int HAVE_ALL_CODE_FLAGS = 1 << 2; + + private static final int HAVE_CLASS_FLAGS_HI = 1 << 9; + + // private static final int UNUSED_3 = 2^3; + + private static final int HAVE_CODE_FLAGS_HI = 1 << 10; + + private static final int HAVE_CP_NUMBERS = 1 << 1; + + private static final int HAVE_FIELD_FLAGS_HI = 1 << 10; + + private static final int HAVE_FILE_HEADERS = 1 << 4; + + private static final int HAVE_FILE_MODTIME = 1 << 6; + + private static final int HAVE_FILE_OPTIONS = 1 << 7; + + private static final int HAVE_FILE_SIZE_HI = 1 << 8; + + private static final int HAVE_METHOD_FLAGS_HI = 1 << 11; + + private static final int HAVE_SPECIAL_FORMATS = 1 << 0; + + /** + * The bit flags that are defined as unused by the specification; + * specifically, every bit above bit 13 and bit 3. + */ + private static final int UNUSED = -1 << 13 | 1 << 3; + + private int options; + + /** + * Creates a new segment options with the given integer value. + * + * @param options + * the integer value to use as the flags + * @throws Pack200Exception + * if an unused bit (bit 3 or bit 13+) is non-zero + */ + public SegmentOptions(int options) throws Pack200Exception { + if ((options & UNUSED) != 0) + throw new Pack200Exception("Some unused flags are non-zero"); + this.options = options; + } + + public boolean hasAllCodeFlags() { + return (options & HAVE_ALL_CODE_FLAGS) != 0; + } + + public boolean hasArchiveFileCounts() { + return (options & HAVE_FILE_HEADERS) != 0; + } + + public boolean hasClassFlagsHi() { + return (options & HAVE_CLASS_FLAGS_HI) != 0; + } + + public boolean hasCodeFlagsHi() { + return (options & HAVE_CODE_FLAGS_HI) != 0; + } + + public boolean hasCPNumberCounts() { + return (options & HAVE_CP_NUMBERS) != 0; + } + + public boolean hasFieldFlagsHi() { + return (options & HAVE_FIELD_FLAGS_HI) != 0; + } + + public boolean hasFileModtime() { + return (options & HAVE_FILE_MODTIME) != 0; + } + + public boolean hasFileOptions() { + return (options & HAVE_FILE_OPTIONS) != 0; + } + + public boolean hasFileSizeHi() { + return (options & HAVE_FILE_SIZE_HI) != 0; + } + + public boolean hasMethodFlagsHi() { + return (options & HAVE_METHOD_FLAGS_HI) != 0; + } + + public boolean hasSpecialFormats() { + return (options & HAVE_SPECIAL_FORMATS) != 0; + } + + public boolean shouldDeflate() { + return (options & DEFLATE_HINT) != 0; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/SegmentUtils.java b/src/main/java/org/apache/harmony/unpack200/SegmentUtils.java new file mode 100644 index 0000000..c47a790 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/SegmentUtils.java @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +/** + * Utility class for unpack200 + */ +public final class SegmentUtils { + + public static int countArgs(String descriptor) { + return countArgs(descriptor, 1); + } + + public static int countInvokeInterfaceArgs(String descriptor) { + return countArgs(descriptor, 2); + } + + /** + * Count the number of arguments in the descriptor. Each long or double + * counts as widthOfLongsAndDoubles; all other arguments count as 1. + * + * @param descriptor + * String for which arguments are counted + * @param widthOfLongsAndDoubles + * int increment to apply for longs doubles. This is typically 1 + * when counting arguments alone, or 2 when counting arguments + * for invokeinterface. + * @return integer count + */ + protected static int countArgs(String descriptor, int widthOfLongsAndDoubles) { + int bra = descriptor.indexOf('('); + int ket = descriptor.indexOf(')'); + if (bra == -1 || ket == -1 || ket < bra) + throw new IllegalArgumentException("No arguments"); + + boolean inType = false; + boolean consumingNextType = false; + int count = 0; + for (int i = bra + 1; i < ket; i++) { + char charAt = descriptor.charAt(i); + if (inType && charAt == ';') { + inType = false; + consumingNextType = false; + } else if (!inType && charAt == 'L') { + inType = true; + count++; + } else if (charAt == '[') { + consumingNextType = true; + } else if (inType) { + // NOP + } else { + if (consumingNextType) { + count++; + consumingNextType = false; + } else { + if (charAt == 'D' || charAt == 'J') { + count += widthOfLongsAndDoubles; + } else { + count++; + } + } + } + } + return count; + } + + public static int countMatches(long[] flags, IMatcher matcher) { + int count = 0; + for (int i = 0; i < flags.length; i++) { + if (matcher.matches(flags[i])) + count++; + } + return count; + } + + public static int countBit16(int[] flags) { + int count = 0; + for (int i = 0; i < flags.length; i++) { + if ((flags[i] & (1 << 16)) != 0) + count++; + } + return count; + } + + public static int countBit16(long[] flags) { + int count = 0; + for (int i = 0; i < flags.length; i++) { + if ((flags[i] & (1 << 16)) != 0) + count++; + } + return count; + } + + public static int countBit16(long[][] flags) { + int count = 0; + for (int i = 0; i < flags.length; i++) { + for (int j = 0; j < flags[i].length; j++) { + if ((flags[i][j] & (1 << 16)) != 0) + count++; + } + } + return count; + } + + public static int countMatches(long[][] flags, IMatcher matcher) { + int count = 0; + for (int i = 0; i < flags.length; i++) { + count += countMatches(flags[i], matcher); + } + return count; + } + + /** + * Answer the index of the first character <= '$' in the parameter. This is + * used instead of indexOf('$') because inner classes may be separated by + * any character <= '$' (in other words, Foo#Bar is as valid as Foo$Bar). If + * no $ character is found, answer -1. + * + * @param string + * String to search for $ + * @return first index of $ character, or -1 if not found + */ + public static int indexOfFirstDollar(String string) { + for (int index = 0; index < string.length(); index++) { + if (string.charAt(index) <= '$') { + return index; + } + } + return -1; + } + + private SegmentUtils() { + // Intended to be a helper class + } + + /** + * This is a debugging message to aid the developer in writing this class. + * If the property 'debug.unpack200' is set, this will generate messages to + * stderr; otherwise, it will be silent. + * + * @param message + * @deprecated this may be removed from production code + */ + public static void debug(String message) { + if (System.getProperty("debug.unpack200") != null) { + System.err.println(message); + } + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/AnnotationDefaultAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/AnnotationDefaultAttribute.java new file mode 100644 index 0000000..bd94809 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/AnnotationDefaultAttribute.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * AnnotationDefault class file attribute + */ +public class AnnotationDefaultAttribute extends AnnotationsAttribute { + + private final ElementValue element_value; + + private static CPUTF8 attributeName; + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + public AnnotationDefaultAttribute(ElementValue element_value) { + super(attributeName); + this.element_value = element_value; + } + + protected int getLength() { + return element_value.getLength(); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + element_value.writeBody(dos); + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + element_value.resolve(pool); + } + + public String toString() { + return "AnnotationDefault: " + element_value; + } + + public boolean equals(Object obj) { + return this == obj; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + List nested = new ArrayList(); + nested.add(attributeName); + nested.addAll(element_value.getClassFileEntries()); + ClassFileEntry[] nestedEntries = new ClassFileEntry[nested.size()]; + for (int i = 0; i < nestedEntries.length; i++) { + nestedEntries[i] = (ClassFileEntry) nested.get(i); + } + return nestedEntries; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/AnnotationsAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/AnnotationsAttribute.java new file mode 100644 index 0000000..529cdbb --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/AnnotationsAttribute.java @@ -0,0 +1,190 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Abstract superclass for Annotations attributes + */ +public abstract class AnnotationsAttribute extends Attribute { + + /** + * Class to represent the annotation structure for class file attributes + */ + public static class Annotation { + + private final int num_pairs; + private final CPUTF8[] element_names; + private final ElementValue[] element_values; + private final CPUTF8 type; + + // Resolved values + private int type_index; + private int[] name_indexes; + + public Annotation(int num_pairs, CPUTF8 type, CPUTF8[] element_names, + ElementValue[] element_values) { + this.num_pairs = num_pairs; + this.type = type; + this.element_names = element_names; + this.element_values = element_values; + } + + public int getLength() { + int length = 4; + for (int i = 0; i < num_pairs; i++) { + length += 2; + length += element_values[i].getLength(); + } + return length; + } + + public void resolve(ClassConstantPool pool) { + type.resolve(pool); + type_index = pool.indexOf(type); + name_indexes = new int[num_pairs]; + for (int i = 0; i < element_names.length; i++) { + element_names[i].resolve(pool); + name_indexes[i] = pool.indexOf(element_names[i]); + element_values[i].resolve(pool); + } + } + + public void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(type_index); + dos.writeShort(num_pairs); + for (int i = 0; i < num_pairs; i++) { + dos.writeShort(name_indexes[i]); + element_values[i].writeBody(dos); + } + } + + public List getClassFileEntries() { + List entries = new ArrayList(); + for (int i = 0; i < element_names.length; i++) { + entries.add(element_names[i]); + entries.addAll(element_values[i].getClassFileEntries()); + } + entries.add(type); + return entries; + } + } + + public static class ElementValue { + + private final Object value; + private final int tag; + + // resolved value index if it's a constant + private int constant_value_index = -1; + + public ElementValue(int tag, Object value) { + this.tag = tag; + this.value = value; + } + + public List getClassFileEntries() { + List entries = new ArrayList(1); + if(value instanceof CPNameAndType) { + // used to represent enum, so don't include the actual CPNameAndType + entries.add(((CPNameAndType)value).name); + entries.add(((CPNameAndType)value).descriptor); + } else if(value instanceof ClassFileEntry) { + entries.add(value); + } else if (value instanceof ElementValue[]) { + ElementValue[] values = (ElementValue[]) value; + for (int i = 0; i < values.length; i++) { + entries.addAll(values[i].getClassFileEntries()); + } + } else if (value instanceof Annotation) { + entries.addAll(((Annotation)value).getClassFileEntries()); + } + return entries; + } + + public void resolve(ClassConstantPool pool) { + if (value instanceof CPConstant) { + ((CPConstant) value).resolve(pool); + constant_value_index = pool.indexOf((CPConstant) value); + } else if (value instanceof CPClass) { + ((CPClass) value).resolve(pool); + constant_value_index = pool.indexOf((CPClass) value); + } else if (value instanceof CPNameAndType) { + ((CPNameAndType) value).resolve(pool); + } else if (value instanceof Annotation) { + ((Annotation) value).resolve(pool); + } else if (value instanceof ElementValue[]) { + ElementValue[] nestedValues = (ElementValue[]) value; + for (int i = 0; i < nestedValues.length; i++) { + nestedValues[i].resolve(pool); + } + } + } + + public void writeBody(DataOutputStream dos) throws IOException { + dos.writeByte(tag); + if (constant_value_index != -1) { + dos.writeShort(constant_value_index); + } else if (value instanceof CPNameAndType) { + ((CPNameAndType) value).writeBody(dos); + } else if (value instanceof Annotation) { + ((Annotation) value).writeBody(dos); + } else if (value instanceof ElementValue[]) { + ElementValue[] nestedValues = (ElementValue[]) value; + for (int i = 0; i < nestedValues.length; i++) { + nestedValues[i].writeBody(dos); + } + } + } + + public int getLength() { + switch (tag) { + case 'B': + case 'C': + case 'D': + case 'F': + case 'I': + case 'J': + case 'S': + case 'Z': + case 'c': + return 3; + case 'e': + return 5; + case '[': + int length = 3; + ElementValue[] nestedValues = (ElementValue[]) value; + for (int i = 0; i < nestedValues.length; i++) { + length += nestedValues[i].getLength(); + } + return length; + case '@': + return (1 + ((Annotation) value).getLength()); + } + return 0; + } + } + + public AnnotationsAttribute(CPUTF8 attributeName) { + super(attributeName); + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/Attribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/Attribute.java new file mode 100644 index 0000000..6e68a1f --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/Attribute.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Abstract superclass for class file attributes + */ +public abstract class Attribute extends ClassFileEntry { + + protected final CPUTF8 attributeName; + + private int attributeNameIndex; + + public Attribute(CPUTF8 attributeName) { + this.attributeName = attributeName; + } + + protected void doWrite(DataOutputStream dos) throws IOException { + dos.writeShort(attributeNameIndex); + dos.writeInt(getLength()); + writeBody(dos); + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (this.getClass() != obj.getClass()) + return false; + final Attribute other = (Attribute) obj; + if (attributeName == null) { + if (other.attributeName != null) + return false; + } else if (!attributeName.equals(other.attributeName)) + return false; + return true; + } + + protected CPUTF8 getAttributeName() { + return attributeName; + } + + protected abstract int getLength(); + + /** + * Answer the length of the receiver including its header (the u2 for the + * attribute name and the u4 for the attribute length). This is relevant + * when attributes are nested within other attributes - the outer attribute + * needs to take the inner attribute headers into account when calculating + * its length. + * + * @return int adjusted length + */ + protected int getLengthIncludingHeader() { + return getLength() + 2 + 4; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + return new ClassFileEntry[] { getAttributeName() }; + } + + /** + * Answer true if the receiver needs to have BCI renumbering applied to it; + * otherwise answer false. + * + * @return boolean BCI renumbering required + */ + public boolean hasBCIRenumbering() { + return false; + } + + /** + * Answer true if the receiver is a source file attribute (which gets + * special handling when the class is built); otherwise answer false. + * + * @return boolean source file attribute + */ + public boolean isSourceFileAttribute() { + return false; + } + + public int hashCode() { + final int PRIME = 31; + int result = 1; + result = PRIME * result + + ((attributeName == null) ? 0 : attributeName.hashCode()); + return result; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + attributeNameIndex = pool.indexOf(attributeName); + } + + protected abstract void writeBody(DataOutputStream dos) throws IOException; + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/BCIRenumberedAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/BCIRenumberedAttribute.java new file mode 100644 index 0000000..526f593 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/BCIRenumberedAttribute.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.List; + +import org.apache.harmony.pack200.Pack200Exception; + +/** + * Abstract superclass for attributes that have some part encoded with a BCI + * renumbering + */ +public abstract class BCIRenumberedAttribute extends Attribute { + + protected boolean renumbered; + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#hasBCIRenumbering() + */ + public boolean hasBCIRenumbering() { + return true; + } + + public BCIRenumberedAttribute(CPUTF8 attributeName) { + super(attributeName); + } + + protected abstract int getLength(); + + protected abstract void writeBody(DataOutputStream dos) throws IOException; + + public abstract String toString(); + + protected abstract int[] getStartPCs(); + + /** + * In Pack200, line number tables are BCI renumbered. This method takes the + * byteCodeOffsets (which is a List of Integers specifying the offset in the + * byte code array of each instruction) and updates the start_pcs so that it + * points to the instruction index itself, not the BCI renumbering of the + * instruction. + * + * @param byteCodeOffsets + * List of Integer offsets of the bytecode array + * @throws Pack200Exception + */ + public void renumber(List byteCodeOffsets) throws Pack200Exception { + if (renumbered) { + throw new Error( + "Trying to renumber a line number table that has already been renumbered"); + } + renumbered = true; + int[] startPCs = getStartPCs(); + for (int index = 0; index < startPCs.length; index++) { + startPCs[index] = ((Integer) byteCodeOffsets.get(startPCs[index])) + .intValue(); + } + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/ByteCode.java b/src/main/java/org/apache/harmony/unpack200/bytecode/ByteCode.java new file mode 100644 index 0000000..cc4d0e1 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/ByteCode.java @@ -0,0 +1,383 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.harmony.unpack200.Segment; +import org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm; + +/** + * A bytecode class file entry. + */ +public class ByteCode extends ClassFileEntry { + + public static ByteCode getByteCode(int opcode) { + int byteOpcode = 0xFF & opcode; + if(ByteCodeForm.get(byteOpcode).hasNoOperand()) { + if(null == noArgByteCodes[byteOpcode]) { + noArgByteCodes[byteOpcode] = new ByteCode(byteOpcode); + } + return noArgByteCodes[byteOpcode]; + } + return new ByteCode(byteOpcode); + } + + private static ByteCode[] noArgByteCodes = new ByteCode[255]; + + private final ByteCodeForm byteCodeForm; + + private ClassFileEntry[] nested; + private int[][] nestedPositions; + private int[] rewrite; + + private int byteCodeOffset = -1; + private int[] byteCodeTargets; + + protected ByteCode(int opcode) { + this(opcode, ClassFileEntry.NONE); + } + + protected ByteCode(int opcode, ClassFileEntry[] nested) { + this.byteCodeForm = ByteCodeForm.get(opcode); + this.rewrite = byteCodeForm.getRewriteCopy(); + this.nested = nested; + } + + protected void doWrite(DataOutputStream dos) throws IOException { + for (int i = 0; i < rewrite.length; i++) { + dos.writeByte(rewrite[i]); + } + } + + public boolean equals(Object obj) { + return this == obj; + } + + public void extractOperands(OperandManager operandManager, Segment segment, + int codeLength) { + // Given an OperandTable, figure out which operands + // the receiver needs and stuff them in operands. + // Later on the operands can be rewritten (But that's + // later, not now). + ByteCodeForm currentByteCodeForm = getByteCodeForm(); + currentByteCodeForm.setByteCodeOperands(this, operandManager, + codeLength); + } + + protected ByteCodeForm getByteCodeForm() { + return byteCodeForm; + } + + public int getLength() { + return rewrite.length; + } + + public String getName() { + return getByteCodeForm().getName(); + } + + public ClassFileEntry[] getNestedClassFileEntries() { + return nested; + } + + public int getOpcode() { + return getByteCodeForm().getOpcode(); + } + + public int getOperandType() { + return getByteCodeForm().getOperandType(); + } + + private boolean hashcodeComputed; + private int cachedHashCode; + + private void generateHashCode() { + cachedHashCode = objectHashCode(); + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.ClassFileEntry#resolve(org.apache.harmony.unpack200.bytecode.ClassConstantPool) + */ + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + if (nested.length > 0) { + // Update the bytecode rewrite array so that it points + // to the elements of the nested array. + for (int index = 0; index < nested.length; index++) { + int argLength = getNestedPosition(index)[1]; + switch (argLength) { + + case 1: + setOperandByte(pool.indexOf(nested[index]), + getNestedPosition(index)[0]); + break; + + case 2: + setOperand2Bytes(pool.indexOf(nested[index]), + getNestedPosition(index)[0]); + break; + + default: + throw new Error("Unhandled resolve " + this); + } + } + } + } + + /** + * Given an array of ints which correspond to bytes in the operand of the + * bytecode, set the rewrite bytes of the operand to be the appropriate + * values. All values in operands[] will be masked with 0xFF so they fit + * into a byte. + * + * @param operands + * int[] rewrite operand bytes + */ + public void setOperandBytes(int[] operands) { + int firstOperandIndex = getByteCodeForm().firstOperandIndex(); + int byteCodeFormLength = getByteCodeForm().operandLength(); + if (firstOperandIndex < 1) { + // No operand rewriting permitted for this bytecode + throw new Error("Trying to rewrite " + this + + " that has no rewrite"); + } + + if (byteCodeFormLength != operands.length) { + throw new Error("Trying to rewrite " + this + " with " + + operands.length + " but bytecode has length " + + byteCodeForm.operandLength()); + } + + for (int index = 0; index < byteCodeFormLength; index++) { + rewrite[index + firstOperandIndex] = operands[index] & 0xFF; + } + } + + /** + * Given an int operand, set the rewrite bytes for that position and the one + * immediately following it to a high-byte, low-byte encoding of the + * operand. + * + * @param operand + * int to set the rewrite bytes to + * @param position + * int position in the operands of the rewrite bytes. For a + * rewrite array of {100, -1, -1, -1} position 0 is the first -1, + * position 1 is the second -1, etc. + */ + public void setOperand2Bytes(int operand, int position) { + int firstOperandIndex = getByteCodeForm().firstOperandIndex(); + int byteCodeFormLength = getByteCodeForm().getRewrite().length; + if (firstOperandIndex < 1) { + // No operand rewriting permitted for this bytecode + throw new Error("Trying to rewrite " + this + + " that has no rewrite"); + } + + if (firstOperandIndex + position + 1 > byteCodeFormLength) { + throw new Error("Trying to rewrite " + this + + " with an int at position " + position + + " but this won't fit in the rewrite array"); + } + + rewrite[firstOperandIndex + position] = (operand & 0xFF00) >> 8; + rewrite[firstOperandIndex + position + 1] = operand & 0xFF; + } + + /** + * This is just like setOperandInt, but takes special care when the operand + * is less than 0 to make sure it's written correctly. + * + * @param operand + * int to set the rewrite bytes to + * @param position + * int position of the operands in the rewrite bytes + */ + public void setOperandSigned2Bytes(int operand, int position) { + if (operand >= 0) { + setOperand2Bytes(operand, position); + } else { + int twosComplementOperand = 0x10000 + operand; + setOperand2Bytes(twosComplementOperand, position); + } + } + + /** + * Given an int operand, treat it as a byte and set the rewrite byte for + * that position to that value. Mask of anything beyond 0xFF. + * + * @param operand + * int to set the rewrite byte to (unsigned) + * @param position + * int position in the operands of the rewrite bytes. For a + * rewrite array of {100, -1, -1, -1} position 0 is the first -1, + * position 1 is the second -1, etc. + */ + public void setOperandByte(int operand, int position) { + int firstOperandIndex = getByteCodeForm().firstOperandIndex(); + int byteCodeFormLength = getByteCodeForm().operandLength(); + if (firstOperandIndex < 1) { + // No operand rewriting permitted for this bytecode + throw new Error("Trying to rewrite " + this + + " that has no rewrite"); + } + + if (firstOperandIndex + position > byteCodeFormLength) { + throw new Error("Trying to rewrite " + this + + " with an byte at position " + position + + " but this won't fit in the rewrite array"); + } + + rewrite[firstOperandIndex + position] = operand & 0xFF; + } + + public String toString() { + return getByteCodeForm().getName(); + } + + public void setNested(ClassFileEntry[] nested) { + this.nested = nested; + } + + /** + * nestedPositions is an array of arrays of ints. Each subarray specifies a + * position of a nested element (from the nested[] array) and the length of + * that element. + * + * For instance, one might have a nested of: {CPClass java/lang/Foo, CPFloat + * 3.14} The nestedPositions would then be: {{0,2},{2,2}} In other words, + * when the bytecode is resolved, the CPClass will be resolved to an int and + * inserted at position 0 and 1 of the rewrite arguments (the first + * occurrences of -1). The CPFloat will be resolved to an int position and + * inserted at positions 2 and 3 of the rewrite arguments. + * + * @param nestedPositions + */ + public void setNestedPositions(int[][] nestedPositions) { + this.nestedPositions = nestedPositions; + } + + public int[][] getNestedPositions() { + return nestedPositions; + } + + public int[] getNestedPosition(int index) { + return getNestedPositions()[index]; + } + + /** + * This method will answer true if the receiver is a multi-bytecode + * instruction (such as aload0_putfield_super); otherwise, it will answer + * false. + * + * @return boolean true if multibytecode, false otherwise + */ + public boolean hasMultipleByteCodes() { + return getByteCodeForm().hasMultipleByteCodes(); + } + + /** + * ByteCodes may need to know their position in the code array (in + * particular, label byte codes need to know where they are in order to + * calculate their targets). This method lets the CodeAttribute specify + * where the byte code is. + * + * Since there are no aload0+label instructions, this method doesn't worry + * about multioperation bytecodes. + * + * @param byteCodeOffset + * int position in code array. + */ + public void setByteCodeIndex(int byteCodeOffset) { + this.byteCodeOffset = byteCodeOffset; + } + + public int getByteCodeIndex() { + return byteCodeOffset; + } + + /** + * Some ByteCodes (in particular, those with labels) have to keep track of + * byteCodeTargets. These are initially offsets in the CodeAttribute array + * relative to the byteCodeOffset, but later get fixed up to point to the + * absolute position in the CodeAttribute array. This method sets the + * targets. + * + * @param byteCodeTargets + * int index in array + */ + public void setByteCodeTargets(int[] byteCodeTargets) { + this.byteCodeTargets = byteCodeTargets; + } + + public int[] getByteCodeTargets() { + return byteCodeTargets; + } + + /** + * Some ByteCodes (in particular, those with labels need to be fixed up + * after all the bytecodes in the CodeAttribute have been added. (This can't + * be done beforehand because the CodeAttribute needs to be complete before + * targets can be assigned.) + * + * @param codeAttribute + * the code attribute + */ + public void applyByteCodeTargetFixup(CodeAttribute codeAttribute) { + getByteCodeForm().fixUpByteCodeTargets(this, codeAttribute); + } + + /** + * Some bytecodes (the ones with variable lengths) can't have a static + * rewrite array - they need the ability to update the array. This method + * permits that. + * + * Note that this should not be called from bytecodes which have a static + * rewrite; use the table in ByteCodeForm instead to specify those rewrites. + * + * @param rewrite + */ + public void setRewrite(int[] rewrite) { + this.rewrite = rewrite; + } + + /** + * Some bytecodes (the ones with variable lengths) can't have a static + * rewrite array - they need the ability to update the array. This method + * permits their associated bytecode formst to query their rewrite array. + * + * Note that this should not be called from bytecodes which have a static + * rewrite; use the table in ByteCodeForm instead to specify those rewrites. + */ + public int[] getRewrite() { + return rewrite; + } + + public boolean nestedMustStartClassPool() { + return byteCodeForm.nestedMustStartClassPool(); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPClass.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPClass.java new file mode 100644 index 0000000..5587209 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPClass.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Constant pool entry for a class + */ +public class CPClass extends ConstantPoolEntry { + + private int index; + + public String name; + + private final CPUTF8 utf8; + + /** + * Creates a new CPClass + * + * @param name + * @param globalIndex + * index in CpBands + * @throws NullPointerException + * if name is null + */ + public CPClass(CPUTF8 name, int globalIndex) { + super(ConstantPoolEntry.CP_Class, globalIndex); + if (name == null) { + throw new NullPointerException("Null arguments are not allowed"); + } + this.name = name.underlyingString(); + this.utf8 = name; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (this.getClass() != obj.getClass()) + return false; + final CPClass other = (CPClass) obj; + return utf8.equals(other.utf8); + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + return new ClassFileEntry[] { utf8, }; + } + + private boolean hashcodeComputed; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + cachedHashCode = utf8.hashCode(); + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + index = pool.indexOf(utf8); + } + + public String toString() { + return "Class: " + getName(); + } + + public String getName() { + return name; + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(index); + } +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPConstant.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPConstant.java new file mode 100644 index 0000000..ab4be3a --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPConstant.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +/** + * Abstract superclass for constant pool constant entries such as numbers or + * Strings + */ +public abstract class CPConstant extends ConstantPoolEntry { + + private final Object value; + + /** + * Create a new CPConstant + * + * @param tag + * @param value + * @param globalIndex + * index in CpBands + * @throws NullPointerException + * if value is null + */ + public CPConstant(byte tag, Object value, int globalIndex) { + super(tag, globalIndex); + this.value = value; + if (value == null) { + throw new NullPointerException("Null arguments are not allowed"); + } + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (this.getClass() != obj.getClass()) + return false; + final CPConstant other = (CPConstant) obj; + if (value == null) { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + + public int hashCode() { + final int PRIME = 31; + int result = 1; + result = PRIME * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + protected Object getValue() { + return value; + } +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPConstantNumber.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPConstantNumber.java new file mode 100644 index 0000000..9b9d203 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPConstantNumber.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +/** + * Abstract superclass for constant pool entries that are numbers. + */ +public abstract class CPConstantNumber extends CPConstant { + + public CPConstantNumber(byte tag, Object value, int globalIndex) { + super(tag, value, globalIndex); + } + + protected Number getNumber() { + return (Number) getValue(); + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPDouble.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPDouble.java new file mode 100644 index 0000000..b7d0910 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPDouble.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Double constant pool entry. + */ +public class CPDouble extends CPConstantNumber { + + public CPDouble(Double value, int globalIndex) { + super(ConstantPoolEntry.CP_Double, value, globalIndex); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeDouble(getNumber().doubleValue()); + } + + public String toString() { + return "Double: " + getValue(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPField.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPField.java new file mode 100644 index 0000000..c05f1fc --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPField.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.util.List; + +/** + * Field constant pool entry. + */ +public class CPField extends CPMember { + + public CPField(CPUTF8 name, CPUTF8 descriptor, long flags, List attributes) { + super(name, descriptor, flags, attributes); + } + + public String toString() { + return "Field: " + name + "(" + descriptor + ")"; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPFieldRef.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPFieldRef.java new file mode 100644 index 0000000..adba84f --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPFieldRef.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Field reference constant pool entry. + */ +public class CPFieldRef extends ConstantPoolEntry { + + CPClass className; + transient int classNameIndex; + private final CPNameAndType nameAndType; + transient int nameAndTypeIndex; + + public CPFieldRef(CPClass className, CPNameAndType descriptor, int globalIndex) { + super(ConstantPoolEntry.CP_Fieldref, globalIndex); + this.className = className; + this.nameAndType = descriptor; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + return new ClassFileEntry[] { className, nameAndType }; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + nameAndTypeIndex = pool.indexOf(nameAndType); + classNameIndex = pool.indexOf(className); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(classNameIndex); + dos.writeShort(nameAndTypeIndex); + } + + public String toString() { + return "FieldRef: " + className + "#" + nameAndType; + } + + private boolean hashcodeComputed; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + int result = 1; + result = PRIME * result + + ((className == null) ? 0 : className.hashCode()); + result = PRIME * result + + ((nameAndType == null) ? 0 : nameAndType.hashCode()); + cachedHashCode = result; + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final CPFieldRef other = (CPFieldRef) obj; + if (className == null) { + if (other.className != null) + return false; + } else if (!className.equals(other.className)) + return false; + if (nameAndType == null) { + if (other.nameAndType != null) + return false; + } else if (!nameAndType.equals(other.nameAndType)) + return false; + return true; + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPFloat.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPFloat.java new file mode 100644 index 0000000..dedcb32 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPFloat.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Float constant pool entry. + */ +public class CPFloat extends CPConstantNumber { + + public CPFloat(Float value, int globalIndex) { + super(ConstantPoolEntry.CP_Float, value, globalIndex); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeFloat(getNumber().floatValue()); + } + + public String toString() { + return "Float: " + getValue(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPInteger.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPInteger.java new file mode 100644 index 0000000..531d95e --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPInteger.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Integer constant pool entry. + */ +public class CPInteger extends CPConstantNumber { + + public CPInteger(Integer value, int globalIndex) { + super(ConstantPoolEntry.CP_Integer, value, globalIndex); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeInt(getNumber().intValue()); + } + + public String toString() { + return "Integer: " + getValue(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPInterfaceMethodRef.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPInterfaceMethodRef.java new file mode 100644 index 0000000..5ead087 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPInterfaceMethodRef.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law + * or agreed to in writing, software distributed under the License is + * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +/** + * Interface method reference constant pool entry. + */ +public class CPInterfaceMethodRef extends CPRef { + + public CPInterfaceMethodRef(CPClass className, CPNameAndType descriptor, int globalIndex) { + super(ConstantPoolEntry.CP_InterfaceMethodref, className, descriptor, globalIndex); + } + + /** + * This method answers the value this method will use for an invokeinterface + * call. This is equal to 1 + the count of all the args, where longs and + * doubles count for 2 and all others count for 1. + * + * @return integer count + */ + public int invokeInterfaceCount() { + return nameAndType.invokeInterfaceCount(); + } + + private boolean hashcodeComputed; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + int result = 1; + result = PRIME * result + className.hashCode(); + result = PRIME * result + nameAndType.hashCode(); + cachedHashCode = result; + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPLong.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPLong.java new file mode 100644 index 0000000..288f91d --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPLong.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Long constant pool entry. + */ +public class CPLong extends CPConstantNumber { + + public CPLong(Long value, int globalIndex) { + super(ConstantPoolEntry.CP_Long, value, globalIndex); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeLong(getNumber().longValue()); + } + + public String toString() { + return "Long: " + getValue(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPMember.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPMember.java new file mode 100644 index 0000000..a390299 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPMember.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +/** + * Superclass for member constant pool entries, such as fields or methods. + */ +public class CPMember extends ClassFileEntry { + + List attributes; + short flags; + CPUTF8 name; + transient int nameIndex; + protected final CPUTF8 descriptor; + transient int descriptorIndex; + + /** + * Create a new CPMember + * + * @param name + * @param descriptor + * @param flags + * @param attributes + * @throws NullPointerException + * if name or descriptor is null + */ + public CPMember(CPUTF8 name, CPUTF8 descriptor, long flags, List attributes) { + this.name = name; + this.descriptor = descriptor; + this.flags = (short) flags; + this.attributes = (attributes == null ? Collections.EMPTY_LIST + : attributes); + if (name == null || descriptor == null) { + throw new NullPointerException("Null arguments are not allowed"); + } + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + int attributeCount = attributes.size(); + ClassFileEntry[] entries = new ClassFileEntry[attributeCount + 2]; + entries[0] = name; + entries[1] = descriptor; + for (int i = 0; i < attributeCount; i++) { + entries[i + 2] = (Attribute) attributes.get(i); + } + return entries; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + nameIndex = pool.indexOf(name); + descriptorIndex = pool.indexOf(descriptor); + for(int it = 0; it < attributes.size(); it++) { + Attribute attribute = (Attribute) attributes.get(it); + attribute.resolve(pool); + } + } + + public int hashCode() { + final int PRIME = 31; + int result = 1; + result = PRIME * result + attributes.hashCode(); + result = PRIME * result + descriptor.hashCode(); + result = PRIME * result + flags; + result = PRIME * result + name.hashCode(); + return result; + } + + public String toString() { + return "CPMember: " + name + "(" + descriptor + ")"; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final CPMember other = (CPMember) obj; + if (!attributes.equals(other.attributes)) + return false; + if (!descriptor.equals(other.descriptor)) + return false; + if (flags != other.flags) + return false; + if (!name.equals(other.name)) + return false; + return true; + } + + protected void doWrite(DataOutputStream dos) throws IOException { + dos.writeShort(flags); + dos.writeShort(nameIndex); + dos.writeShort(descriptorIndex); + int attributeCount = attributes.size(); + dos.writeShort(attributeCount); + for (int i = 0; i < attributeCount; i++) { + Attribute attribute = (Attribute) attributes.get(i); + attribute.doWrite(dos); + } + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPMethod.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPMethod.java new file mode 100644 index 0000000..b76d75a --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPMethod.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.util.List; + +/** + * Method constant pool entry. + */ +public class CPMethod extends CPMember { + + public CPMethod(CPUTF8 name, CPUTF8 descriptor, long flags, List attributes) { + super(name, descriptor, flags, attributes); + } + + public String toString() { + return "Method: " + name + "(" + descriptor + ")"; + } + + private boolean hashcodeComputed; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + int result = 1; + result = PRIME * result + name.hashCode(); + result = PRIME * result + descriptor.hashCode(); + cachedHashCode = result; + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPMethodRef.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPMethodRef.java new file mode 100644 index 0000000..86226ac --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPMethodRef.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +/** + * Method reference constant pool entry. + */ +public class CPMethodRef extends CPRef { + + public CPMethodRef(CPClass className, CPNameAndType descriptor, int globalIndex) { + super(ConstantPoolEntry.CP_Methodref, className, descriptor, globalIndex); + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + return new ClassFileEntry[] { className, nameAndType }; + } + + + private boolean hashcodeComputed; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + int result = 1; + result = PRIME * result + className.hashCode(); + result = PRIME * result + nameAndType.hashCode(); + cachedHashCode = result; + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPNameAndType.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPNameAndType.java new file mode 100644 index 0000000..b57da6c --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPNameAndType.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.harmony.unpack200.SegmentUtils; + +/** + * Name and Type pair constant pool entry. + */ +public class CPNameAndType extends ConstantPoolEntry { + + CPUTF8 descriptor; + + transient int descriptorIndex; + + CPUTF8 name; + + transient int nameIndex; + + /** + * Create a new CPNameAndType + * + * @param name + * @param descriptor + * @param globalIndex - index in CpBands + * @throws NullPointerException + * if name or descriptor is null + */ + public CPNameAndType(CPUTF8 name, CPUTF8 descriptor, int globalIndex) { + super(ConstantPoolEntry.CP_NameAndType, globalIndex); + this.name = name; + this.descriptor = descriptor; + if (name == null || descriptor == null) { + throw new NullPointerException("Null arguments are not allowed"); + } + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + return new ClassFileEntry[] { name, descriptor }; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + descriptorIndex = pool.indexOf(descriptor); + nameIndex = pool.indexOf(name); + } + + /* + * field_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 + * attributes_count; attribute_info attributes[attributes_count]; } + */ + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(nameIndex); + dos.writeShort(descriptorIndex); + } + + public String toString() { + return "NameAndType: " + name + "(" + descriptor + ")"; + } + + private boolean hashcodeComputed; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + int result = 1; + result = PRIME * result + descriptor.hashCode(); + result = PRIME * result + name.hashCode(); + cachedHashCode = result; + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final CPNameAndType other = (CPNameAndType) obj; + if (!descriptor.equals(other.descriptor)) + return false; + if (!name.equals(other.name)) + return false; + return true; + } + + /** + * Answers the invokeinterface count argument when the receiver is treated + * as an invokeinterface target. This value is not meaningful if the + * receiver is not an invokeinterface target. + * + * @return count + */ + public int invokeInterfaceCount() { + return 1 + SegmentUtils.countInvokeInterfaceArgs(descriptor + .underlyingString()); + } +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPRef.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPRef.java new file mode 100644 index 0000000..bcdcbe3 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPRef.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Abstract superclass for reference constant pool entries, such as a method or + * field reference. + */ +public abstract class CPRef extends ConstantPoolEntry { + + CPClass className; + transient int classNameIndex; + + protected CPNameAndType nameAndType; + transient int nameAndTypeIndex; + + /** + * Create a new CPRef + * + * @param type + * @param className + * @param descriptor + * @param globalIndex + * index in CpBands + * @throws NullPointerException + * if descriptor or className is null + */ + public CPRef(byte type, CPClass className, CPNameAndType descriptor, int globalIndex) { + super(type, globalIndex); + this.className = className; + this.nameAndType = descriptor; + if (descriptor == null || className == null) { + throw new NullPointerException("Null arguments are not allowed"); + } + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + if (this.hashCode() != obj.hashCode()) { + return false; + } + final CPRef other = (CPRef) obj; + if (!className.equals(other.className)) + return false; + if (!nameAndType.equals(other.nameAndType)) + return false; + return true; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + ClassFileEntry[] entries = new ClassFileEntry[2]; + entries[0] = className; + entries[1] = nameAndType; + return entries; + } + + public int hashCode() { + final int PRIME = 37; + return (PRIME * className.hashCode()) + nameAndType.hashCode(); + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + nameAndTypeIndex = pool.indexOf(nameAndType); + classNameIndex = pool.indexOf(className); + } + + protected String cachedToString; + + public String toString() { + if (cachedToString == null) { + String type; + if (getTag() == ConstantPoolEntry.CP_Fieldref) { + type = "FieldRef"; //$NON-NLS-1$ + } else if (getTag() == ConstantPoolEntry.CP_Methodref) { + type = "MethoddRef"; //$NON-NLS-1$ + } else if (getTag() == ConstantPoolEntry.CP_InterfaceMethodref) { + type = "InterfaceMethodRef"; //$NON-NLS-1$ + } else { + type = "unknown"; //$NON-NLS-1$ + } + cachedToString = type + ": " + className + "#" + nameAndType; //$NON-NLS-1$ //$NON-NLS-2$ + } + return cachedToString; + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(classNameIndex); + dos.writeShort(nameAndTypeIndex); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPString.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPString.java new file mode 100644 index 0000000..ca2548a --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPString.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * String constant pool entry. + */ +public class CPString extends CPConstant { + + private transient int nameIndex; + private final CPUTF8 name; + + public CPString(CPUTF8 value, int globalIndex) { + super(ConstantPoolEntry.CP_String, value, globalIndex); + this.name = value; + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(nameIndex); + } + + public String toString() { + return "String: " + getValue(); + } + + /** + * Allows the constant pool entries to resolve their nested entries + * + * @param pool + */ + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + nameIndex = pool.indexOf(name); + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + return new ClassFileEntry[] { name }; + } + + private boolean hashcodeComputed; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + int result = 1; + result = PRIME * result + name.hashCode(); + cachedHashCode = result; + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CPUTF8.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CPUTF8.java new file mode 100644 index 0000000..8aa4239 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CPUTF8.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * UTF8 constant pool entry, used for storing long Strings. + */ +public class CPUTF8 extends ConstantPoolEntry { + + private final String utf8; + + /** + * Creates a new CPUTF8 instance + * + * @param utf8 + * @param globalIndex - index in CpBands + * @throws NullPointerException + * if utf8 is null + */ + public CPUTF8(String utf8, int globalIndex) { + super(ConstantPoolEntry.CP_UTF8, globalIndex); + this.utf8 = utf8; + if (utf8 == null) { + throw new NullPointerException("Null arguments are not allowed"); + } + } + + public CPUTF8(String string) { + this(string, -1); + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (this.getClass() != obj.getClass()) + return false; + final CPUTF8 other = (CPUTF8) obj; + return utf8.equals(other.utf8); + } + + private boolean hashcodeComputed; + private int cachedHashCode; + + private void generateHashCode() { + hashcodeComputed = true; + final int PRIME = 31; + cachedHashCode = PRIME + utf8.hashCode(); + } + + public int hashCode() { + if (!hashcodeComputed) + generateHashCode(); + return cachedHashCode; + } + + public String toString() { + return "UTF8: " + utf8; + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeUTF(utf8); + } + + public String underlyingString() { + return utf8; + } + + public void setGlobalIndex(int index) { + globalIndex = index; + } +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/ClassConstantPool.java b/src/main/java/org/apache/harmony/unpack200/bytecode/ClassConstantPool.java new file mode 100644 index 0000000..a9b00f6 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/ClassConstantPool.java @@ -0,0 +1,277 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; + +import org.apache.harmony.unpack200.Segment; + +/** + * The Class constant pool + */ +public class ClassConstantPool { + + protected HashSet entriesContainsSet = new HashSet(); + protected HashSet othersContainsSet = new HashSet(); + + private final HashSet mustStartClassPool = new HashSet(); + + protected Map indexCache; + + public String toString() { + return entries.toString(); + } + + private final List others = new ArrayList(500); + private final List entries = new ArrayList(500); + + private boolean resolved; + + public ClassFileEntry add(ClassFileEntry entry) { + if (entry instanceof ByteCode) { + return null; + } + if (entry instanceof ConstantPoolEntry) { + if (entriesContainsSet.add(entry)) { + entries.add(entry); + } + } else { + if (othersContainsSet.add(entry)) { + others.add(entry); + } + } + + return entry; + } + + public void addNestedEntries() { + boolean added = true; + + // initial assignment + ArrayList parents = new ArrayList(512); + ArrayList children = new ArrayList(512); + + // adding old entries + parents.addAll(entries); + parents.addAll(others); + + // while there any parents to traverse and at least one change in target + // storage was made + while(added || parents.size() > 0) { + + children.clear(); + + int entriesOriginalSize = entries.size(); + int othersOriginalSize = others.size(); + + // get the parents' children and add them to buffer + // concurrently add parents to target storage + for(int indexParents = 0; indexParents < parents.size(); indexParents++) { + ClassFileEntry entry = (ClassFileEntry) parents.get(indexParents); + + // traverse children + ClassFileEntry[] entryChildren = entry.getNestedClassFileEntries(); + for(int c = 0; c < entryChildren.length; c++) { + children.add(entryChildren[c]); + } + + boolean isAtStart = (entry instanceof ByteCode) + && ((ByteCode) entry).nestedMustStartClassPool(); + + if (isAtStart) { + for (int c = 0; c < entryChildren.length; c++) { + mustStartClassPool.add(entryChildren[c]); + } + } + + // add parent + add(entry); + } + + added = !(entries.size() == entriesOriginalSize && others.size() == othersOriginalSize); + + // parents are not needed anymore + // children now become parents + parents.clear(); + parents.addAll(children); + + + } + } + + public int indexOf(ClassFileEntry entry) { + if (!resolved) + throw new IllegalStateException( + "Constant pool is not yet resolved; this does not make any sense"); + if (null == indexCache) { + throw new IllegalStateException("Index cache is not initialized!"); + } + Integer entryIndex = ((Integer) indexCache.get(entry)); + // If the entry isn't found, answer -1. Otherwise answer the entry. + if (entryIndex != null) { + return entryIndex.intValue() + 1; + } + return -1; + } + + public int size() { + return entries.size(); + } + + public ClassFileEntry get(int i) { + if (!resolved) + throw new IllegalStateException( + "Constant pool is not yet resolved; this does not make any sense"); + return (ClassFileEntry) entries.get(--i); + } + + public void resolve(Segment segment) { + initialSort(); + sortClassPool(); + + resolved = true; + + for(int it = 0; it < entries.size(); it++) { + ClassFileEntry entry = (ClassFileEntry) entries.get(it); + entry.resolve(this); + } + + for(int it = 0; it < others.size(); it++) { + ClassFileEntry entry = (ClassFileEntry) others.get(it); + entry.resolve(this); + } + + } + + private void initialSort() { + TreeSet inCpAll = new TreeSet(new Comparator() { + public int compare(Object arg0, Object arg1) { + return ((ConstantPoolEntry)arg0).getGlobalIndex() - ((ConstantPoolEntry)arg1).getGlobalIndex(); + } + }); + TreeSet cpUtf8sNotInCpAll = new TreeSet(new Comparator() { + + public int compare(Object arg0, Object arg1) { + return ((CPUTF8)arg0).underlyingString().compareTo(((CPUTF8)arg1).underlyingString()); + } + + }); + TreeSet cpClassesNotInCpAll = new TreeSet(new Comparator() { + + public int compare(Object arg0, Object arg1) { + return ((CPClass)arg0).getName().compareTo(((CPClass)arg1).getName()); + } + + }); + + + for(int index = 0; index < entries.size(); index++) { + ConstantPoolEntry entry = (ConstantPoolEntry) entries.get(index); + if(entry.getGlobalIndex() == -1) { + if (entry instanceof CPUTF8) { + cpUtf8sNotInCpAll.add(entry); + } else if (entry instanceof CPClass) { + cpClassesNotInCpAll.add(entry); + } else { + throw new Error("error"); + } + } else { + inCpAll.add(entry); + } + } + entries.clear(); + entries.addAll(inCpAll); + entries.addAll(cpUtf8sNotInCpAll); + entries.addAll(cpClassesNotInCpAll); + } + + public List entries() { + return Collections.unmodifiableList(entries); + } + + protected void sortClassPool() { + // Now that everything has been resolved, do one + // final sort of the class pool. This fixes up + // references to objects which need to be at the + // start of the class pool + + + ArrayList startOfPool = new ArrayList(entries.size()); + ArrayList finalSort = new ArrayList(entries.size()); + + for(int i = 0; i < entries.size(); i++) { + ClassFileEntry nextEntry = (ClassFileEntry) entries.get(i); + if (mustStartClassPool.contains(nextEntry)) { + startOfPool.add(nextEntry); + } else { + finalSort.add(nextEntry); + } + } + + // copy over and rebuild the cache + // + indexCache = new HashMap(entries.size()); + int index = 0; + + entries.clear(); + + for(int itIndex = 0; itIndex < startOfPool.size(); itIndex++) { + ClassFileEntry entry = (ClassFileEntry) startOfPool.get(itIndex); + indexCache.put(entry, new Integer(index)); + + if (entry instanceof CPLong || entry instanceof CPDouble) { + entries.add(entry); // these get 2 slots because of their size + entries.add(entry); + index += 2; + } else { + entries.add(entry); + index += 1; + } + } + + for(int itFinal = 0; itFinal < finalSort.size(); itFinal++) { + ClassFileEntry entry = (ClassFileEntry) finalSort.get(itFinal); + indexCache.put(entry, new Integer(index)); + + if (entry instanceof CPLong || entry instanceof CPDouble) { + entries.add(entry); // these get 2 slots because of their size + entries.add(entry); + index += 2; + } else { + entries.add(entry); + index += 1; + } + } + + } + + public ClassFileEntry addWithNestedEntries(ClassFileEntry entry) { + add(entry); + ClassFileEntry[] nestedEntries = entry.getNestedClassFileEntries(); + for (int i = 0; i < nestedEntries.length; i++) { + addWithNestedEntries(nestedEntries[i]); + } + return entry; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/ClassFile.java b/src/main/java/org/apache/harmony/unpack200/bytecode/ClassFile.java new file mode 100644 index 0000000..e8d4bc6 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/ClassFile.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * ClassFile is used to represent and write out Java class files. + */ +public class ClassFile { + + public int major; + public int minor; + private final int magic = 0xCAFEBABE; + public ClassConstantPool pool = new ClassConstantPool(); + public int accessFlags; + public int thisClass; + public int superClass; + public int[] interfaces; + public ClassFileEntry[] fields; + public ClassFileEntry[] methods; + public Attribute[] attributes; + + public void write(DataOutputStream dos) throws IOException { + dos.writeInt(magic); + dos.writeShort(minor); + dos.writeShort(major); + dos.writeShort(pool.size() + 1); + for (int i = 1; i <= pool.size(); i++) { + ConstantPoolEntry entry; + (entry = (ConstantPoolEntry) pool.get(i)).doWrite(dos); + // Doubles and longs take up two spaces in the pool, but only one + // gets written + if (entry.getTag() == ConstantPoolEntry.CP_Double + || entry.getTag() == ConstantPoolEntry.CP_Long) + i++; + } + dos.writeShort(accessFlags); + dos.writeShort(thisClass); + dos.writeShort(superClass); + dos.writeShort(interfaces.length); + for (int i = 0; i < interfaces.length; i++) { + dos.writeShort(interfaces[i]); + } + dos.writeShort(fields.length); + for (int i = 0; i < fields.length; i++) { + fields[i].write(dos); + } + dos.writeShort(methods.length); + for (int i = 0; i < methods.length; i++) { + methods[i].write(dos); + } + dos.writeShort(attributes.length); + for (int i = 0; i < attributes.length; i++) { + attributes[i].write(dos); + } + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/ClassFileEntry.java b/src/main/java/org/apache/harmony/unpack200/bytecode/ClassFileEntry.java new file mode 100644 index 0000000..440ed6b --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/ClassFileEntry.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * The abstract superclass for all types of class file entries. + */ +public abstract class ClassFileEntry { + + protected static final ClassFileEntry[] NONE = new ClassFileEntry[0]; + private boolean resolved; + + protected abstract void doWrite(DataOutputStream dos) throws IOException; + + public abstract boolean equals(Object arg0); + + protected ClassFileEntry[] getNestedClassFileEntries() { + return NONE; + } + + public abstract int hashCode(); + + /** + * Allows the constant pool entries to resolve their nested entries + * + * @param pool + */ + protected void resolve(ClassConstantPool pool) { + resolved = true; + } + + protected boolean isResolved() { + return resolved; + } + + protected int objectHashCode() { + return super.hashCode(); + } + + public abstract String toString(); + + public final void write(DataOutputStream dos) throws IOException { + if (!resolved) + throw new IllegalStateException("Entry has not been resolved"); + doWrite(dos); + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/CodeAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/CodeAttribute.java new file mode 100644 index 0000000..42bba52 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/CodeAttribute.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.harmony.unpack200.Segment; + +public class CodeAttribute extends BCIRenumberedAttribute { + + public List attributes = new ArrayList(); + // instances + public List byteCodeOffsets = new ArrayList(); + public List byteCodes = new ArrayList(); + public int codeLength; + public List exceptionTable; // of ExceptionTableEntry + public int maxLocals; + public int maxStack; + private static CPUTF8 attributeName; + + public CodeAttribute(int maxStack, int maxLocals, byte codePacked[], + Segment segment, OperandManager operandManager, List exceptionTable) { + super(attributeName); + this.maxLocals = maxLocals; + this.maxStack = maxStack; + this.codeLength = 0; + this.exceptionTable = exceptionTable; + byteCodeOffsets.add(new Integer(0)); + int byteCodeIndex = 0; + for (int i = 0; i < codePacked.length; i++) { + ByteCode byteCode = ByteCode.getByteCode(codePacked[i] & 0xff); + // Setting the offset must happen before extracting operands + // because label bytecodes need to know their offsets. + byteCode.setByteCodeIndex(byteCodeIndex); + byteCodeIndex++; + byteCode.extractOperands(operandManager, segment, codeLength); + byteCodes.add(byteCode); + codeLength += byteCode.getLength(); + int lastBytecodePosition = ((Integer) byteCodeOffsets + .get(byteCodeOffsets.size() - 1)).intValue(); + // This code assumes all multiple byte bytecodes are + // replaced by a single-byte bytecode followed by + // another bytecode. + if (byteCode.hasMultipleByteCodes()) { + byteCodeOffsets.add(new Integer(lastBytecodePosition + 1)); + byteCodeIndex++; + } + // I've already added the first element (at 0) before + // entering this loop, so make sure I don't add one + // after the last element. + if (i < (codePacked.length - 1)) { + byteCodeOffsets.add(new Integer(lastBytecodePosition + + byteCode.getLength())); + } + if (byteCode.getOpcode() == 0xC4) { + // Special processing for wide bytecode - it knows what its + // instruction is from the opcode manager, so ignore the + // next instruction + i++; + } + } + // Now that all the bytecodes know their positions and + // sizes, fix up the byte code targets + // At this point, byteCodes may be a different size than + // codePacked because of wide bytecodes. + for (int i = 0; i < byteCodes.size(); i++) { + ByteCode byteCode = (ByteCode) byteCodes.get(i); + byteCode.applyByteCodeTargetFixup(this); + } + } + + protected int getLength() { + int attributesSize = 0; + for(int it = 0; it < attributes.size(); it++) { + Attribute attribute = (Attribute) attributes.get(it); + attributesSize += attribute.getLengthIncludingHeader(); + } + return 2 + 2 + 4 + codeLength + 2 + exceptionTable.size() + * (2 + 2 + 2 + 2) + 2 + attributesSize; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + ArrayList nestedEntries = new ArrayList(attributes.size() + byteCodes.size() + 10); + nestedEntries.add(getAttributeName()); + nestedEntries.addAll(byteCodes); + nestedEntries.addAll(attributes); + // Don't forget to add the ExceptionTable catch_types + for(int iter = 0; iter < exceptionTable.size(); iter++) { + ExceptionTableEntry entry = (ExceptionTableEntry) exceptionTable.get(iter); + CPClass catchType = entry.getCatchType(); + // If the catch type is null, this is a finally + // block. If it's not null, we need to add the + // CPClass to the list of nested class file entries. + if (catchType != null) { + nestedEntries.add(catchType); + } + } + ClassFileEntry[] nestedEntryArray = new ClassFileEntry[nestedEntries + .size()]; + nestedEntries.toArray(nestedEntryArray); + return nestedEntryArray; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + for(int it = 0; it < attributes.size(); it++) { + Attribute attribute = (Attribute) attributes.get(it); + attribute.resolve(pool); + } + + for(int it = 0; it < byteCodes.size(); it++) { + ByteCode byteCode = (ByteCode) byteCodes.get(it); + byteCode.resolve(pool); + } + + for(int it = 0; it < exceptionTable.size(); it++) { + ExceptionTableEntry entry = (ExceptionTableEntry) exceptionTable.get(it); + entry.resolve(pool); + } + } + + public String toString() { + return "Code: " + getLength() + " bytes"; + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(maxStack); + dos.writeShort(maxLocals); + + dos.writeInt(codeLength); + for(int it = 0; it < byteCodes.size(); it++) { + ByteCode byteCode = (ByteCode) byteCodes.get(it); + byteCode.write(dos); + } + + dos.writeShort(exceptionTable.size()); + for(int it = 0; it < exceptionTable.size(); it++) { + ExceptionTableEntry entry = (ExceptionTableEntry) exceptionTable.get(it); + entry.write(dos); + } + + dos.writeShort(attributes.size()); + for(int it = 0; it < attributes.size(); it++) { + Attribute attribute = (Attribute) attributes.get(it); + attribute.write(dos); + } + } + + public void addAttribute(Attribute attribute) { + attributes.add(attribute); + if(attribute instanceof LocalVariableTableAttribute) { + ((LocalVariableTableAttribute)attribute).setCodeLength(codeLength); + } + if(attribute instanceof LocalVariableTypeTableAttribute) { + ((LocalVariableTypeTableAttribute)attribute).setCodeLength(codeLength); + } + } + + public List attributes() { + return attributes; + } + + public boolean equals(Object obj) { + return this == obj; + } + + protected int[] getStartPCs() { + // Do nothing here as we've overriden renumber + return null; + } + + public void renumber(List byteCodeOffsets) { + for(int iter = 0; iter < exceptionTable.size(); iter++) { + ExceptionTableEntry entry = (ExceptionTableEntry) exceptionTable.get(iter); + entry.renumber(byteCodeOffsets); + } + } + + public static void setAttributeName(CPUTF8 attributeName) { + CodeAttribute.attributeName = attributeName; + } +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/ConstantPoolEntry.java b/src/main/java/org/apache/harmony/unpack200/bytecode/ConstantPoolEntry.java new file mode 100644 index 0000000..cde2749 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/ConstantPoolEntry.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Abstract superclass for constant pool entries + */ +public abstract class ConstantPoolEntry extends ClassFileEntry { + + public static final byte CP_Class = 7; + + public static final byte CP_Double = 6; + + public static final byte CP_Fieldref = 9; + + public static final byte CP_Float = 4; + + public static final byte CP_Integer = 3; + + /* + * class MemberRef extends ConstantPoolEntry { private int index; + * Class(String name) { super(CP_Class); index = pool.indexOf(name); } void + * writeBody(DataOutputStream dos) throws IOException { + * dos.writeShort(index); } } + */ + + public static final byte CP_InterfaceMethodref = 11; + + public static final byte CP_Long = 5; + + public static final byte CP_Methodref = 10; + + public static final byte CP_NameAndType = 12; + + public static final byte CP_String = 8; + + public static final byte CP_UTF8 = 1; + + byte tag; + + protected int globalIndex; + + ConstantPoolEntry(byte tag, int globalIndex) { + this.tag = tag; + this.globalIndex = globalIndex; + } + + public abstract boolean equals(Object obj); + + public byte getTag() { + return tag; + } + + public abstract int hashCode(); + + public void doWrite(DataOutputStream dos) throws IOException { + dos.writeByte(tag); + writeBody(dos); + } + + protected abstract void writeBody(DataOutputStream dos) throws IOException; + + public int getGlobalIndex() { + return globalIndex; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/ConstantValueAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/ConstantValueAttribute.java new file mode 100644 index 0000000..13b9aa8 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/ConstantValueAttribute.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * An {@link Attribute} representing a constant. + */ +public class ConstantValueAttribute extends Attribute { + + private int constantIndex; + + private final ClassFileEntry entry; + + private static CPUTF8 attributeName; + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + + public ConstantValueAttribute(ClassFileEntry entry) { + super(attributeName); + if (entry == null) { + throw new NullPointerException(); + } + this.entry = entry; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (this.getClass() != obj.getClass()) + return false; + final ConstantValueAttribute other = (ConstantValueAttribute) obj; + if (entry == null) { + if (other.entry != null) + return false; + } else if (!entry.equals(other.entry)) + return false; + return true; + } + + protected int getLength() { + return 2; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + return new ClassFileEntry[] { getAttributeName(), entry }; + } + + public int hashCode() { + final int PRIME = 31; + int result = super.hashCode(); + result = PRIME * result + ((entry == null) ? 0 : entry.hashCode()); + return result; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + entry.resolve(pool); + this.constantIndex = pool.indexOf(entry); + } + + public String toString() { + return "Constant:" + entry; + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(constantIndex); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/DeprecatedAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/DeprecatedAttribute.java new file mode 100644 index 0000000..e302565 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/DeprecatedAttribute.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Deprecated class file attribute. + */ +public class DeprecatedAttribute extends Attribute { + + private static CPUTF8 attributeName; + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + + public DeprecatedAttribute() { + super(attributeName); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#getLength() + */ + protected int getLength() { + return 0; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#writeBody(java.io.DataOutputStream) + */ + protected void writeBody(DataOutputStream dos) throws IOException { + // No body + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.ClassFileEntry#toString() + */ + public String toString() { + return "Deprecated Attribute"; + } + + public boolean equals(Object obj) { + return this == obj; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/EnclosingMethodAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/EnclosingMethodAttribute.java new file mode 100644 index 0000000..9f9b0cf --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/EnclosingMethodAttribute.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Enclosing method class file attribute. + */ +public class EnclosingMethodAttribute extends Attribute { + + private int class_index; + private int method_index; + private final CPClass cpClass; + private final CPNameAndType method; + private static CPUTF8 attributeName; + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + + public EnclosingMethodAttribute(CPClass cpClass, CPNameAndType method) { + super(attributeName); + this.cpClass = cpClass; + this.method = method; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + if(method != null) { + return new ClassFileEntry[] {attributeName, cpClass, method}; + } else { + return new ClassFileEntry[] {attributeName, cpClass}; + } + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#getLength() + */ + protected int getLength() { + return 4; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + cpClass.resolve(pool); + class_index = pool.indexOf(cpClass); + if(method != null) { + method.resolve(pool); + method_index = pool.indexOf(method); + } else { + method_index = 0; + } + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#writeBody(java.io.DataOutputStream) + */ + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(class_index); + dos.writeShort(method_index); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.ClassFileEntry#toString() + */ + public String toString() { + return "EnclosingMethod"; + } + + public boolean equals(Object obj) { + return this == obj; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/ExceptionTableEntry.java b/src/main/java/org/apache/harmony/unpack200/bytecode/ExceptionTableEntry.java new file mode 100644 index 0000000..2611ec8 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/ExceptionTableEntry.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * An entry in an exception table. + */ +public class ExceptionTableEntry { + + private final int startPC; + private final int endPC; + private final int handlerPC; + private final CPClass catchType; + + private int startPcRenumbered; + private int endPcRenumbered; + private int handlerPcRenumbered; + private int catchTypeIndex; + + /** + * Create a new ExceptionTableEntry. Exception tables are of two kinds: + * either a normal one (with a Throwable as the catch_type) or a finally + * clause (which has no catch_type). In the class file, the finally clause + * is represented as catch_type == 0. + * + * To create a finally clause with this method, pass in null for the + * catchType. + * + * @param startPC + * int + * @param endPC + * int + * @param handlerPC + * int + * @param catchType + * CPClass (if it's a normal catch) or null (if it's a finally + * clause). + */ + public ExceptionTableEntry(int startPC, int endPC, int handlerPC, + CPClass catchType) { + this.startPC = startPC; + this.endPC = endPC; + this.handlerPC = handlerPC; + this.catchType = catchType; + } + + public void write(DataOutputStream dos) throws IOException { + dos.writeShort(startPcRenumbered); + dos.writeShort(endPcRenumbered); + dos.writeShort(handlerPcRenumbered); + dos.writeShort(catchTypeIndex); + } + + public void renumber(List byteCodeOffsets) { + startPcRenumbered = ((Integer) byteCodeOffsets.get(startPC)).intValue(); + int endPcIndex = startPC + endPC; + endPcRenumbered = ((Integer) byteCodeOffsets.get(endPcIndex)) + .intValue(); + int handlerPcIndex = endPcIndex + handlerPC; + handlerPcRenumbered = ((Integer) byteCodeOffsets.get(handlerPcIndex)) + .intValue(); + } + + public CPClass getCatchType() { + return catchType; + } + + public void resolve(ClassConstantPool pool) { + if (catchType == null) { + // If the catch type is a finally clause + // the index is always 0. + catchTypeIndex = 0; + return; + } + catchType.resolve(pool); + catchTypeIndex = pool.indexOf(catchType); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/ExceptionsAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/ExceptionsAttribute.java new file mode 100644 index 0000000..39d26a0 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/ExceptionsAttribute.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * Exceptions class file attribute + */ +public class ExceptionsAttribute extends Attribute { + + private static CPUTF8 attributeName; + + private static int hashCode(Object[] array) { + final int prime = 31; + if (array == null) + return 0; + int result = 1; + for (int index = 0; index < array.length; index++) { + result = prime * result + + (array[index] == null ? 0 : array[index].hashCode()); + } + return result; + } + + private transient int[] exceptionIndexes; + + private final CPClass[] exceptions; + + public ExceptionsAttribute(CPClass[] exceptions) { + super(attributeName); + this.exceptions = exceptions; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + final ExceptionsAttribute other = (ExceptionsAttribute) obj; + if (!Arrays.equals(exceptions, other.exceptions)) + return false; + return true; + } + + protected int getLength() { + return 2 + 2 * exceptions.length; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + ClassFileEntry[] result = new ClassFileEntry[exceptions.length + 1]; + for (int i = 0; i < exceptions.length; i++) { + result[i] = exceptions[i]; + } + result[exceptions.length] = getAttributeName(); + return result; + } + + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ExceptionsAttribute.hashCode(exceptions); + return result; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + exceptionIndexes = new int[exceptions.length]; + for (int i = 0; i < exceptions.length; i++) { + exceptions[i].resolve(pool); + exceptionIndexes[i] = pool.indexOf(exceptions[i]); + } + } + + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("Exceptions: "); + for (int i = 0; i < exceptions.length; i++) { + sb.append(exceptions[i]); + sb.append(' '); + } + return sb.toString(); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(exceptionIndexes.length); + for (int i = 0; i < exceptionIndexes.length; i++) { + dos.writeShort(exceptionIndexes[i]); + } + } + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/InnerClassesAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/InnerClassesAttribute.java new file mode 100644 index 0000000..0c9e1c3 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/InnerClassesAttribute.java @@ -0,0 +1,185 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Inner classes class file attribute + */ +public class InnerClassesAttribute extends Attribute { + + private static CPUTF8 attributeName; + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + + private static class InnerClassesEntry { + + CPClass inner_class_info; + CPClass outer_class_info; + CPUTF8 inner_class_name; + + int inner_class_info_index = -1; + int outer_class_info_index = -1; + int inner_name_index = -1; + int inner_class_access_flags = -1; + + public InnerClassesEntry(CPClass innerClass, CPClass outerClass, + CPUTF8 innerName, int flags) { + this.inner_class_info = innerClass; + this.outer_class_info = outerClass; + this.inner_class_name = innerName; + this.inner_class_access_flags = flags; + } + + /** + * Determine the indices of the things in the receiver which point to + * elements of the ClassConstantPool + * + * @param pool + * ClassConstantPool which holds the CPClass and CPUTF8 + * objects. + */ + public void resolve(ClassConstantPool pool) { + if (inner_class_info != null) { + inner_class_info.resolve(pool); + inner_class_info_index = pool.indexOf(inner_class_info); + } else { + inner_class_info_index = 0; + } + + if (inner_class_name != null) { + inner_class_name.resolve(pool); + inner_name_index = pool.indexOf(inner_class_name); + } else { + inner_name_index = 0; + } + + if (outer_class_info != null) { + outer_class_info.resolve(pool); + outer_class_info_index = pool.indexOf(outer_class_info); + } else { + outer_class_info_index = 0; + } + } + + public void write(DataOutputStream dos) throws IOException { + dos.writeShort(inner_class_info_index); + dos.writeShort(outer_class_info_index); + dos.writeShort(inner_name_index); + dos.writeShort(inner_class_access_flags); + } + + } + + private final List innerClasses = new ArrayList(); + private final List nestedClassFileEntries = new ArrayList(); + + public InnerClassesAttribute(String name) { + super(attributeName); + nestedClassFileEntries.add(getAttributeName()); + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (this.getClass() != obj.getClass()) + return false; + final InnerClassesAttribute other = (InnerClassesAttribute) obj; + if (getAttributeName() == null) { + if (other.getAttributeName() != null) + return false; + } else if (!getAttributeName().equals(other.getAttributeName())) + return false; + return true; + } + + protected int getLength() { + return 2 + ((2 + 2 + 2 + 2) * innerClasses.size()); + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + ClassFileEntry[] result = new ClassFileEntry[nestedClassFileEntries + .size()]; + for (int index = 0; index < result.length; index++) { + result[index] = (ClassFileEntry) nestedClassFileEntries.get(index); + } + return result; + } + + public int hashCode() { + final int PRIME = 31; + int result = super.hashCode(); + result = PRIME + * result + + ((getAttributeName() == null) ? 0 : getAttributeName() + .hashCode()); + return result; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + for(int it = 0; it < innerClasses.size(); it++) { + InnerClassesEntry entry = (InnerClassesEntry) innerClasses.get(it); + entry.resolve(pool); + } + } + + public String toString() { + return "InnerClasses: " + getAttributeName(); + } + + protected void doWrite(DataOutputStream dos) throws IOException { + // Hack so I can see what's being written. + super.doWrite(dos); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(innerClasses.size()); + + for(int it = 0; it < innerClasses.size(); it++) { + InnerClassesEntry entry = (InnerClassesEntry) innerClasses.get(it); + entry.write(dos); + } + } + + public void addInnerClassesEntry(CPClass innerClass, CPClass outerClass, + CPUTF8 innerName, int flags) { + if (innerClass != null) { + nestedClassFileEntries.add(innerClass); + } + if (outerClass != null) { + nestedClassFileEntries.add(outerClass); + } + if (innerName != null) { + nestedClassFileEntries.add(innerName); + } + addInnerClassesEntry(new InnerClassesEntry(innerClass, outerClass, + innerName, flags)); + } + + private void addInnerClassesEntry(InnerClassesEntry innerClassesEntry) { + innerClasses.add(innerClassesEntry); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/LineNumberTableAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/LineNumberTableAttribute.java new file mode 100644 index 0000000..57e5ec1 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/LineNumberTableAttribute.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Line number table + */ +public class LineNumberTableAttribute extends BCIRenumberedAttribute { + + private final int line_number_table_length; + private final int[] start_pcs; + private final int[] line_numbers; + private static CPUTF8 attributeName; + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + + public LineNumberTableAttribute(int line_number_table_length, + int[] start_pcs, int[] line_numbers) { + super(attributeName); + this.line_number_table_length = line_number_table_length; + this.start_pcs = start_pcs; + this.line_numbers = line_numbers; + } + + protected int getLength() { + return 2 + (4 * line_number_table_length); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(line_number_table_length); + for (int i = 0; i < line_number_table_length; i++) { + dos.writeShort(start_pcs[i]); + dos.writeShort(line_numbers[i]); + } + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.ClassFileEntry#toString() + */ + public String toString() { + return "LineNumberTable: " + line_number_table_length + " lines"; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#getNestedClassFileEntries() + */ + protected ClassFileEntry[] getNestedClassFileEntries() { + return new ClassFileEntry[] { getAttributeName() }; + } + + + public boolean equals(Object obj) { + return this == obj; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#resolve(org.apache.harmony.unpack200.bytecode.ClassConstantPool) + */ + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + } + + protected int[] getStartPCs() { + return start_pcs; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/LocalVariableTableAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/LocalVariableTableAttribute.java new file mode 100644 index 0000000..f8156c4 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/LocalVariableTableAttribute.java @@ -0,0 +1,171 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.harmony.pack200.Pack200Exception; + +/** + * Local variable table + */ +public class LocalVariableTableAttribute extends BCIRenumberedAttribute { + + private int local_variable_table_length; + private final int[] start_pcs; + private final int[] lengths; + private int[] name_indexes; + private int[] descriptor_indexes; + private final int[] indexes; + private final CPUTF8[] names; + private final CPUTF8[] descriptors; + private int codeLength; + private static CPUTF8 attributeName; + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + + public LocalVariableTableAttribute(int local_variable_table_length, + int[] start_pcs, int[] lengths, CPUTF8[] names, + CPUTF8[] descriptors, int[] indexes) { + super(attributeName); + this.local_variable_table_length = local_variable_table_length; + this.start_pcs = start_pcs; + this.lengths = lengths; + this.names = names; + this.descriptors = descriptors; + this.indexes = indexes; + } + + + public void setCodeLength(int length) { + codeLength = length; + } + + protected int getLength() { + return 2 + (10 * local_variable_table_length); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(local_variable_table_length); + for (int i = 0; i < local_variable_table_length; i++) { + dos.writeShort(start_pcs[i]); + dos.writeShort(lengths[i]); + dos.writeShort(name_indexes[i]); + dos.writeShort(descriptor_indexes[i]); + dos.writeShort(indexes[i]); + } + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + ArrayList nestedEntries = new ArrayList(); + nestedEntries.add(getAttributeName()); + for (int i = 0; i < local_variable_table_length; i++) { + nestedEntries.add(names[i]); + nestedEntries.add(descriptors[i]); + } + ClassFileEntry[] nestedEntryArray = new ClassFileEntry[nestedEntries + .size()]; + nestedEntries.toArray(nestedEntryArray); + return nestedEntryArray; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + name_indexes = new int[local_variable_table_length]; + descriptor_indexes = new int[local_variable_table_length]; + for (int i = 0; i < local_variable_table_length; i++) { + names[i].resolve(pool); + descriptors[i].resolve(pool); + name_indexes[i] = pool.indexOf(names[i]); + descriptor_indexes[i] = pool.indexOf(descriptors[i]); + } + } + + public String toString() { + return "LocalVariableTable: " + +local_variable_table_length + + " variables"; + } + + protected int[] getStartPCs() { + return start_pcs; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.BCIRenumberedAttribute#renumber(java.util.List) + */ + public void renumber(List byteCodeOffsets) throws Pack200Exception { + // Remember the unrenumbered start_pcs, since that's used later + // to calculate end position. + int[] unrenumbered_start_pcs = new int[start_pcs.length]; + System.arraycopy(start_pcs, 0, unrenumbered_start_pcs, 0, + start_pcs.length); + + // Next renumber start_pcs in place + super.renumber(byteCodeOffsets); + + // lengths are BRANCH5 encoded, not BCI-encoded. + // In other words: + // start_pc is BCI5 start_pc + // end_pc is byteCodeOffset[(index of start_pc in byteCodeOffset) + + // (encoded length)] + // real length = end_pc - start_pc + // special case if end_pc is beyond end of bytecode array + + int maxSize = codeLength; + + // Iterate through the lengths and update each in turn. + // This is done in place in the lengths array. + for (int index = 0; index < lengths.length; index++) { + int start_pc = start_pcs[index]; + int revisedLength = -1; + int encodedLength = lengths[index]; + + // First get the index of the start_pc in the byteCodeOffsets + int indexOfStartPC = unrenumbered_start_pcs[index]; + // Given the index of the start_pc, we can now add + // the encodedLength to it to get the stop index. + int stopIndex = indexOfStartPC + encodedLength; + if (stopIndex < 0) { + throw new Pack200Exception("Error renumbering bytecode indexes"); + } + // Length can either be an index into the byte code offsets, or one + // beyond the + // end of the byte code offsets. Need to determine which this is. + if (stopIndex == byteCodeOffsets.size()) { + // Pointing to one past the end of the byte code array + revisedLength = maxSize - start_pc; + } else { + // We're indexed into the byte code array + int stopValue = ((Integer) byteCodeOffsets.get(stopIndex)) + .intValue(); + revisedLength = stopValue - start_pc; + } + lengths[index] = revisedLength; + } + } + + public boolean equals(Object obj) { + return this == obj; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/LocalVariableTypeTableAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/LocalVariableTypeTableAttribute.java new file mode 100644 index 0000000..e6662ce --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/LocalVariableTypeTableAttribute.java @@ -0,0 +1,172 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.harmony.pack200.Pack200Exception; + +/** + * Local variable type table. + */ +public class LocalVariableTypeTableAttribute extends BCIRenumberedAttribute { + + private int local_variable_type_table_length; + private final int[] start_pcs; + private final int[] lengths; + private int[] name_indexes; + private int[] signature_indexes; + private final int[] indexes; + private final CPUTF8[] names; + private final CPUTF8[] signatures; + private int codeLength; + private static CPUTF8 attributeName; + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + + public LocalVariableTypeTableAttribute( + int local_variable_type_table_length, int[] start_pcs, + int[] lengths, CPUTF8[] names, CPUTF8[] signatures, int[] indexes) { + super(attributeName); + this.local_variable_type_table_length = local_variable_type_table_length; + this.start_pcs = start_pcs; + this.lengths = lengths; + this.names = names; + this.signatures = signatures; + this.indexes = indexes; + } + + public void setCodeLength(int length) { + codeLength = length; + } + + protected int getLength() { + return 2 + (10 * local_variable_type_table_length); + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(local_variable_type_table_length); + for (int i = 0; i < local_variable_type_table_length; i++) { + dos.writeShort(start_pcs[i]); + dos.writeShort(lengths[i]); + dos.writeShort(name_indexes[i]); + dos.writeShort(signature_indexes[i]); + dos.writeShort(indexes[i]); + } + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + name_indexes = new int[local_variable_type_table_length]; + signature_indexes = new int[local_variable_type_table_length]; + for (int i = 0; i < local_variable_type_table_length; i++) { + names[i].resolve(pool); + signatures[i].resolve(pool); + name_indexes[i] = pool.indexOf(names[i]); + signature_indexes[i] = pool.indexOf(signatures[i]); + } + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + ArrayList nestedEntries = new ArrayList(); + nestedEntries.add(getAttributeName()); + for (int i = 0; i < local_variable_type_table_length; i++) { + nestedEntries.add(names[i]); + nestedEntries.add(signatures[i]); + } + ClassFileEntry[] nestedEntryArray = new ClassFileEntry[nestedEntries + .size()]; + nestedEntries.toArray(nestedEntryArray); + return nestedEntryArray; + } + + protected int[] getStartPCs() { + return start_pcs; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.BCIRenumberedAttribute#renumber(java.util.List) + */ + public void renumber(List byteCodeOffsets) throws Pack200Exception { + // Remember the unrenumbered start_pcs, since that's used later + // to calculate end position. + int[] unrenumbered_start_pcs = new int[start_pcs.length]; + System.arraycopy(start_pcs, 0, unrenumbered_start_pcs, 0, + start_pcs.length); + + // Next renumber start_pcs in place + super.renumber(byteCodeOffsets); + + // lengths are BRANCH5 encoded, not BCI-encoded. + // In other words: + // start_pc is BCI5 start_pc + // end_pc is byteCodeOffset[(index of start_pc in byteCodeOffset) + + // (encoded length)] + // real length = end_pc - start_pc + // special case if end_pc is beyond end of bytecode array + + int maxSize = codeLength; + + // Iterate through the lengths and update each in turn. + // This is done in place in the lengths array. + for (int index = 0; index < lengths.length; index++) { + int start_pc = start_pcs[index]; + int revisedLength = -1; + int encodedLength = lengths[index]; + + // First get the index of the start_pc in the byteCodeOffsets + int indexOfStartPC = unrenumbered_start_pcs[index]; + // Given the index of the start_pc, we can now add + // the encodedLength to it to get the stop index. + int stopIndex = indexOfStartPC + encodedLength; + if (stopIndex < 0) { + throw new Pack200Exception("Error renumbering bytecode indexes"); + } + // Length can either be an index into the byte code offsets, or one + // beyond the + // end of the byte code offsets. Need to determine which this is. + if (stopIndex == byteCodeOffsets.size()) { + // Pointing to one past the end of the byte code array + revisedLength = maxSize - start_pc; + } else { + // We're indexed into the byte code array + int stopValue = ((Integer) byteCodeOffsets.get(stopIndex)) + .intValue(); + revisedLength = stopValue - start_pc; + } + lengths[index] = revisedLength; + } + } + + + public String toString() { + return "LocalVariableTypeTable: " + +local_variable_type_table_length + + " varaibles"; + } + + public boolean equals(Object obj) { + return this == obj; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/NewAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/NewAttribute.java new file mode 100644 index 0000000..2642d61 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/NewAttribute.java @@ -0,0 +1,276 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * A compressor-defined class file attribute. + */ +public class NewAttribute extends BCIRenumberedAttribute { + + private final List lengths = new ArrayList(); // List of Integers + private final List body = new ArrayList(); + private ClassConstantPool pool; + private final int layoutIndex; + + public NewAttribute(CPUTF8 attributeName, int layoutIndex) { + super(attributeName); + this.layoutIndex = layoutIndex; + } + + public int getLayoutIndex() { + return layoutIndex; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#getLength() + */ + protected int getLength() { + int length = 0; + for(int iter = 0; iter < lengths.size(); iter++) { + length += ((Integer)lengths.get(iter)).intValue(); + } + return length; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#writeBody(java.io.DataOutputStream) + */ + protected void writeBody(DataOutputStream dos) throws IOException { + for (int i = 0; i < lengths.size(); i++) { + int length = ((Integer) lengths.get(i)).intValue(); + Object obj = body.get(i); + long value = 0; + if (obj instanceof Long) { + value = ((Long) obj).longValue(); + } else if (obj instanceof ClassFileEntry) { + value = pool.indexOf(((ClassFileEntry) obj)); + } else if (obj instanceof BCValue) { + value = ((BCValue) obj).actualValue; + } + // Write + if (length == 1) { + dos.writeByte((int) value); + } else if (length == 2) { + dos.writeShort((int) value); + } else if (length == 4) { + dos.writeInt((int) value); + } else if (length == 8) { + dos.writeLong(value); + } + } + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.ClassFileEntry#toString() + */ + public String toString() { + return attributeName.underlyingString(); + } + + public void addInteger(int length, long value) { + lengths.add(new Integer(length)); + body.add(new Long(value)); + } + + public void addBCOffset(int length, int value) { + lengths.add(new Integer(length)); + body.add(new BCOffset(value)); + } + + public void addBCIndex(int length, int value) { + lengths.add(new Integer(length)); + body.add(new BCIndex(value)); + } + + public void addBCLength(int length, int value) { + lengths.add(new Integer(length)); + body.add(new BCLength(value)); + } + + public void addCPConstant(int length, CPConstant constant) { + lengths.add(new Integer(length)); + body.add(constant); + } + + public void addCPClass(int length, CPClass class1) { + lengths.add(new Integer(length)); + body.add(class1); + } + + public void addCPUTF8(int length, CPUTF8 cputf8) { + lengths.add(new Integer(length)); + body.add(cputf8); + } + + public void addCPNameAndType(int length, CPNameAndType type) { + lengths.add(new Integer(length)); + body.add(type); + } + + public void addCPFieldRef(int length, CPFieldRef ref) { + lengths.add(new Integer(length)); + body.add(ref); + } + + public void addCPMethodRef(int length, CPMethodRef ref) { + lengths.add(new Integer(length)); + body.add(ref); + } + + public void addCPIMethodRef(int length, CPInterfaceMethodRef ref) { + lengths.add(new Integer(length)); + body.add(ref); + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + for(int iter = 0; iter < body.size(); iter++) { + Object element = body.get(iter); + if (element instanceof ClassFileEntry) { + ((ClassFileEntry) element).resolve(pool); + } + } + this.pool = pool; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + int total = 1; + for(int iter = 0; iter < body.size(); iter++) { + Object element = body.get(iter); + if (element instanceof ClassFileEntry) { + total++; + } + } + ClassFileEntry[] nested = new ClassFileEntry[total]; + nested[0] = getAttributeName(); + int i = 1; + for(int iter = 0; iter < body.size(); iter++) { + Object element = body.get(iter); + if (element instanceof ClassFileEntry) { + nested[i] = (ClassFileEntry) element; + i++; + } + } + return nested; + } + + private static class BCOffset extends BCValue { + + private final int offset; + private int index; + + public BCOffset(int offset) { + this.offset = offset; + } + + public void setIndex(int index) { + this.index = index; + } + + } + + private static class BCIndex extends BCValue { + + private final int index; + + public BCIndex(int index) { + this.index = index; + } + } + + private static class BCLength extends BCValue { + + private final int length; + + public BCLength(int length) { + this.length = length; + } + } + + // Bytecode-related value (either a bytecode index or a length) + private static abstract class BCValue { + + int actualValue; + + public void setActualValue(int value) { + this.actualValue = value; + } + + } + + protected int[] getStartPCs() { + // Don't need to return anything here as we've overridden renumber + return null; + } + + public void renumber(List byteCodeOffsets) { + if (!renumbered) { + Object previous = null; + for (Iterator iter = body.iterator(); iter.hasNext();) { + Object obj = iter.next(); + if (obj instanceof BCIndex) { + BCIndex bcIndex = (BCIndex) obj; + bcIndex.setActualValue(((Integer) byteCodeOffsets + .get(bcIndex.index)).intValue()); + } else if (obj instanceof BCOffset) { + BCOffset bcOffset = (BCOffset) obj; + if (previous instanceof BCIndex) { + int index = ((BCIndex) previous).index + + bcOffset.offset; + bcOffset.setIndex(index); + bcOffset.setActualValue(((Integer) byteCodeOffsets + .get(index)).intValue()); + } else if (previous instanceof BCOffset) { + int index = ((BCOffset) previous).index + + bcOffset.offset; + bcOffset.setIndex(index); + bcOffset.setActualValue(((Integer) byteCodeOffsets + .get(index)).intValue()); + } else { + // Not sure if this should be able to happen + bcOffset.setActualValue(((Integer) byteCodeOffsets + .get(bcOffset.offset)).intValue()); + } + } else if (obj instanceof BCLength) { + // previous must be a BCIndex + BCLength bcLength = (BCLength) obj; + BCIndex prevIndex = (BCIndex) previous; + int index = prevIndex.index + bcLength.length; + int actualLength = ((Integer) byteCodeOffsets.get(index)) + .intValue() + - prevIndex.actualValue; + bcLength.setActualValue(actualLength); + } + previous = obj; + } + renumbered = true; + } + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/OperandManager.java b/src/main/java/org/apache/harmony/unpack200/bytecode/OperandManager.java new file mode 100644 index 0000000..d4a0acb --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/OperandManager.java @@ -0,0 +1,242 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.harmony.unpack200.bytecode; + +import org.apache.harmony.unpack200.Segment; +import org.apache.harmony.unpack200.SegmentConstantPool; + +/** + * This class keeps track of operands used. It provides API to let other classes + * get next elements, and also knows about which classes have been used recently + * in super, this and new references. + */ +public class OperandManager { + + int[] bcCaseCount; + int[] bcCaseValue; + int[] bcByte; + int[] bcShort; + int[] bcLocal; + int[] bcLabel; + int[] bcIntRef; + int[] bcFloatRef; + int[] bcLongRef; + int[] bcDoubleRef; + int[] bcStringRef; + int[] bcClassRef; + int[] bcFieldRef; + int[] bcMethodRef; + int[] bcIMethodRef; + int[] bcThisField; + int[] bcSuperField; + int[] bcThisMethod; + int[] bcSuperMethod; + int[] bcInitRef; + int[] wideByteCodes; + + int bcCaseCountIndex; + int bcCaseValueIndex; + int bcByteIndex; + int bcShortIndex; + int bcLocalIndex; + int bcLabelIndex; + int bcIntRefIndex; + int bcFloatRefIndex; + int bcLongRefIndex; + int bcDoubleRefIndex; + int bcStringRefIndex; + int bcClassRefIndex; + int bcFieldRefIndex; + int bcMethodRefIndex; + int bcIMethodRefIndex; + int bcThisFieldIndex; + int bcSuperFieldIndex; + int bcThisMethodIndex; + int bcSuperMethodIndex; + int bcInitRefIndex; + int wideByteCodeIndex; + + Segment segment; + + String currentClass; + String superClass; + String newClass; + + public OperandManager(int[] bcCaseCount, int[] bcCaseValue, int[] bcByte, + int[] bcShort, int[] bcLocal, int[] bcLabel, int[] bcIntRef, + int[] bcFloatRef, int[] bcLongRef, int[] bcDoubleRef, + int[] bcStringRef, int[] bcClassRef, int[] bcFieldRef, + int[] bcMethodRef, int[] bcIMethodRef, int[] bcThisField, + int[] bcSuperField, int[] bcThisMethod, int[] bcSuperMethod, + int[] bcInitRef, int[] wideByteCodes) { + this.bcCaseCount = bcCaseCount; + this.bcCaseValue = bcCaseValue; + this.bcByte = bcByte; + this.bcShort = bcShort; + this.bcLocal = bcLocal; + this.bcLabel = bcLabel; + this.bcIntRef = bcIntRef; + this.bcFloatRef = bcFloatRef; + this.bcLongRef = bcLongRef; + this.bcDoubleRef = bcDoubleRef; + this.bcStringRef = bcStringRef; + this.bcClassRef = bcClassRef; + this.bcFieldRef = bcFieldRef; + this.bcMethodRef = bcMethodRef; + this.bcIMethodRef = bcIMethodRef; + + this.bcThisField = bcThisField; + this.bcSuperField = bcSuperField; + this.bcThisMethod = bcThisMethod; + this.bcSuperMethod = bcSuperMethod; + this.bcInitRef = bcInitRef; + this.wideByteCodes = wideByteCodes; + } + + public int nextCaseCount() { + return bcCaseCount[bcCaseCountIndex++]; + } + + public int nextCaseValues() { + return bcCaseValue[bcCaseValueIndex++]; + } + + public int nextByte() { + return bcByte[bcByteIndex++]; + } + + public int nextShort() { + return bcShort[bcShortIndex++]; + } + + public int nextLocal() { + return bcLocal[bcLocalIndex++]; + } + + public int nextLabel() { + return bcLabel[bcLabelIndex++]; + } + + public int nextIntRef() { + return bcIntRef[bcIntRefIndex++]; + } + + public int nextFloatRef() { + return bcFloatRef[bcFloatRefIndex++]; + } + + public int nextLongRef() { + return bcLongRef[bcLongRefIndex++]; + } + + public int nextDoubleRef() { + return bcDoubleRef[bcDoubleRefIndex++]; + } + + public int nextStringRef() { + return bcStringRef[bcStringRefIndex++]; + } + + public int nextClassRef() { + return bcClassRef[bcClassRefIndex++]; + } + + public int nextFieldRef() { + return bcFieldRef[bcFieldRefIndex++]; + } + + public int nextMethodRef() { + return bcMethodRef[bcMethodRefIndex++]; + } + + public int nextIMethodRef() { + return bcIMethodRef[bcIMethodRefIndex++]; + } + + public int nextThisFieldRef() { + return bcThisField[bcThisFieldIndex++]; + } + + public int nextSuperFieldRef() { + return bcSuperField[bcSuperFieldIndex++]; + } + + public int nextThisMethodRef() { + return bcThisMethod[bcThisMethodIndex++]; + } + + public int nextSuperMethodRef() { + return bcSuperMethod[bcSuperMethodIndex++]; + } + + public int nextInitRef() { + return bcInitRef[bcInitRefIndex++]; + } + + public int nextWideByteCode() { + return wideByteCodes[wideByteCodeIndex++]; + } + + public void setSegment(Segment segment) { + this.segment = segment; + } + + public Segment getSegment() { + return segment; + } + + public SegmentConstantPool globalConstantPool() { + return segment.getConstantPool(); + } + + public void setCurrentClass(String string) { + currentClass = string; + } + + public void setSuperClass(String string) { + superClass = string; + } + + public void setNewClass(String string) { + newClass = string; + } + + public String getCurrentClass() { + if (null == currentClass) { + throw new Error("Current class not set yet"); + } else { + return currentClass; + } + } + + public String getSuperClass() { + if (null == superClass) { + throw new Error("SuperClass not set yet"); + } else { + return superClass; + } + } + + public String getNewClass() { + if (null == newClass) { + throw new Error("New class not set yet"); + } else { + return newClass; + } + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/RuntimeVisibleorInvisibleAnnotationsAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/RuntimeVisibleorInvisibleAnnotationsAttribute.java new file mode 100644 index 0000000..6d7daa5 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/RuntimeVisibleorInvisibleAnnotationsAttribute.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Annotations class file attribute, either a RuntimeVisibleAnnotations + * attribute or a RuntimeInvisibleAnnotations attribute. + */ +public class RuntimeVisibleorInvisibleAnnotationsAttribute extends + AnnotationsAttribute { + + private final int num_annotations; + private final Annotation[] annotations; + + public RuntimeVisibleorInvisibleAnnotationsAttribute(CPUTF8 name, + Annotation[] annotations) { + super(name); + this.num_annotations = annotations.length; + this.annotations = annotations; + } + + protected int getLength() { + int length = 2; + for (int i = 0; i < num_annotations; i++) { + length += annotations[i].getLength(); + } + return length; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + for (int i = 0; i < annotations.length; i++) { + annotations[i].resolve(pool); + } + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(num_annotations); + for (int i = 0; i < num_annotations; i++) { + annotations[i].writeBody(dos); + } + } + + public String toString() { + return attributeName.underlyingString() + ": " + num_annotations + + " annotations"; + } + + public boolean equals(Object obj) { + return this == obj; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + List nested = new ArrayList(); + nested.add(attributeName); + for (int i = 0; i < annotations.length; i++) { + nested.addAll(annotations[i].getClassFileEntries()); + } + ClassFileEntry[] nestedEntries = new ClassFileEntry[nested.size()]; + for (int i = 0; i < nestedEntries.length; i++) { + nestedEntries[i] = (ClassFileEntry) nested.get(i); + } + return nestedEntries; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/RuntimeVisibleorInvisibleParameterAnnotationsAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/RuntimeVisibleorInvisibleParameterAnnotationsAttribute.java new file mode 100644 index 0000000..02ccd3e --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/RuntimeVisibleorInvisibleParameterAnnotationsAttribute.java @@ -0,0 +1,130 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Parameter annotations class file attribute, either a + * RuntimeVisibleParameterAnnotations attribute or a + * RuntimeInvisibleParameterAnnotations attribute. + */ +public class RuntimeVisibleorInvisibleParameterAnnotationsAttribute extends + AnnotationsAttribute { + + private final int num_parameters; + private final ParameterAnnotation[] parameter_annotations; + + public RuntimeVisibleorInvisibleParameterAnnotationsAttribute(CPUTF8 name, + ParameterAnnotation[] parameter_annotations) { + super(name); + this.num_parameters = parameter_annotations.length; + this.parameter_annotations = parameter_annotations; + } + + protected int getLength() { + int length = 1; + for (int i = 0; i < num_parameters; i++) { + length += parameter_annotations[i].getLength(); + } + return length; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + for (int i = 0; i < parameter_annotations.length; i++) { + parameter_annotations[i].resolve(pool); + } + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeByte(num_parameters); + for (int i = 0; i < num_parameters; i++) { + parameter_annotations[i].writeBody(dos); + } + } + + public String toString() { + return attributeName.underlyingString() + ": " + num_parameters + + " parameter annotations"; + } + + /** + * ParameterAnnotation represents the annotations on a single parameter. + */ + public static class ParameterAnnotation { + + private final Annotation[] annotations; + private final int num_annotations; + + public ParameterAnnotation(Annotation[] annotations) { + this.num_annotations = annotations.length; + this.annotations = annotations; + } + + public void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(num_annotations); + for (int i = 0; i < annotations.length; i++) { + annotations[i].writeBody(dos); + } + } + + public void resolve(ClassConstantPool pool) { + for (int i = 0; i < annotations.length; i++) { + annotations[i].resolve(pool); + } + } + + public int getLength() { + int length = 2; + for (int i = 0; i < annotations.length; i++) { + length += annotations[i].getLength(); + } + return length; + } + + public List getClassFileEntries() { + List nested = new ArrayList(); + for (int i = 0; i < annotations.length; i++) { + nested.addAll(annotations[i].getClassFileEntries()); + } + return nested; + } + + } + + public boolean equals(Object obj) { + return this == obj; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + List nested = new ArrayList(); + nested.add(attributeName); + for (int i = 0; i < parameter_annotations.length; i++) { + nested.addAll(parameter_annotations[i].getClassFileEntries()); + } + ClassFileEntry[] nestedEntries = new ClassFileEntry[nested.size()]; + for (int i = 0; i < nestedEntries.length; i++) { + nestedEntries[i] = (ClassFileEntry) nested.get(i); + } + return nestedEntries; + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/SignatureAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/SignatureAttribute.java new file mode 100644 index 0000000..02bdb43 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/SignatureAttribute.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Signature class file attribute + */ +public class SignatureAttribute extends Attribute { + + private int signature_index; + private final CPUTF8 signature; + + private static CPUTF8 attributeName; + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + + public SignatureAttribute(CPUTF8 value) { + super(attributeName); + this.signature = value; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#getLength() + */ + protected int getLength() { + return 2; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + return new ClassFileEntry[] { getAttributeName(), signature }; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + signature.resolve(pool); + signature_index = pool.indexOf(signature); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#writeBody(java.io.DataOutputStream) + */ + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(signature_index); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.ClassFileEntry#toString() + */ + public String toString() { + // TODO Auto-generated method stub + return "Signature: " + signature; + } + + + public boolean equals(Object obj) { + return this == obj; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/SourceFileAttribute.java b/src/main/java/org/apache/harmony/unpack200/bytecode/SourceFileAttribute.java new file mode 100644 index 0000000..e01224a --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/SourceFileAttribute.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode; + +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Source file class file attribute + */ +public class SourceFileAttribute extends Attribute { + + private final CPUTF8 name; + private int nameIndex; + private static CPUTF8 attributeName; + + public static void setAttributeName(CPUTF8 cpUTF8Value) { + attributeName = cpUTF8Value; + } + + public SourceFileAttribute(CPUTF8 name) { + super(attributeName); + this.name = name; + } + + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (this.getClass() != obj.getClass()) + return false; + final SourceFileAttribute other = (SourceFileAttribute) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.Attribute#isSourceFileAttribute() + */ + public boolean isSourceFileAttribute() { + return true; + } + + protected int getLength() { + return 2; + } + + protected ClassFileEntry[] getNestedClassFileEntries() { + return new ClassFileEntry[] { getAttributeName(), name }; + } + + public int hashCode() { + final int PRIME = 31; + int result = super.hashCode(); + result = PRIME * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + protected void resolve(ClassConstantPool pool) { + super.resolve(pool); + nameIndex = pool.indexOf(name); + } + + public String toString() { + return "SourceFile: " + name; + } + + protected void writeBody(DataOutputStream dos) throws IOException { + dos.writeShort(nameIndex); + } +} \ No newline at end of file diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ByteCodeForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ByteCodeForm.java new file mode 100644 index 0000000..62250d0 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ByteCodeForm.java @@ -0,0 +1,684 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.CodeAttribute; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +public class ByteCodeForm { + + // Operand types. Those with no operands and + // those with operands on the operand stack are + // treated similarly. These types are used to + // distinguish different kinds of non-stack + // bytecode operands + protected static final int TYPE_NONE = 0; + protected static final int TYPE_BYTE = 1; + protected static final int TYPE_SHORT = 2; + protected static final int TYPE_INTREF = 3; + protected static final int TYPE_FLOATREF = 4; + protected static final int TYPE_STRINGREF = 5; + protected static final int TYPE_CLASSREF = 6; + protected static final int TYPE_LONG = 7; + protected static final int TYPE_DOUBLE = 8; + protected static final int TYPE_LOCAL = 9; + protected static final int TYPE_LABEL = 10; + protected static final int TYPE_FIELDREF = 11; + protected static final int TYPE_METHODREF = 12; + protected static final int TYPE_IMETHODREF = 13; + protected static final int TYPE_WIDE = 14; + protected static final int TYPE_IINC = 15; + protected static final int TYPE_SWITCH = 16; + protected static final int TYPE_MULTIANEWARRAY = 17; + protected static final int TYPE_THISFIELDREF = 18; + protected static final int TYPE_THISMETHODREF = 19; + protected static final int TYPE_SUPERFIELDREF = 20; + protected static final int TYPE_SUPERMETHODREF = 21; + protected static final int TYPE_THISINITMETHODREF = 22; + protected static final int TYPE_SUPERINITMETHODREF = 23; + protected static final int TYPE_NEWINITMETHODREF = 24; + protected static final int TYPE_NEWCLASSREF = 25; + + protected static final boolean WIDENED = true; + + protected static final ByteCodeForm[] byteCodeArray = new ByteCodeForm[256]; + protected static final Map byteCodesByName = new HashMap(256); + static { + byteCodeArray[0] = new NoArgumentForm(0, "nop"); + byteCodeArray[1] = new NoArgumentForm(1, "aconst_null"); + byteCodeArray[2] = new NoArgumentForm(2, "iconst_m1"); + byteCodeArray[3] = new NoArgumentForm(3, "iconst_0"); + byteCodeArray[4] = new NoArgumentForm(4, "iconst_1"); + byteCodeArray[5] = new NoArgumentForm(5, "iconst_2"); + byteCodeArray[6] = new NoArgumentForm(6, "iconst_3"); + byteCodeArray[7] = new NoArgumentForm(7, "iconst_4"); + byteCodeArray[8] = new NoArgumentForm(8, "iconst_5"); + byteCodeArray[9] = new NoArgumentForm(9, "lconst_0"); + byteCodeArray[10] = new NoArgumentForm(10, "lconst_1"); + byteCodeArray[11] = new NoArgumentForm(11, "fconst_0"); + byteCodeArray[12] = new NoArgumentForm(12, "fconst_1"); + byteCodeArray[13] = new NoArgumentForm(13, "fconst_2"); + byteCodeArray[14] = new NoArgumentForm(14, "dconst_0"); + byteCodeArray[15] = new NoArgumentForm(15, "dconst_1"); + byteCodeArray[16] = new ByteForm(16, "bipush", new int[] { 16, -1 }); + byteCodeArray[17] = new ShortForm(17, "sipush", + new int[] { 17, -1, -1 }); + byteCodeArray[18] = new StringRefForm(18, "ldc", new int[] { 18, -1 }); + byteCodeArray[19] = new StringRefForm(19, "ldc_w", new int[] { 19, -1, + -1 }, WIDENED); + byteCodeArray[20] = new LongForm(20, "ldc2_w", new int[] { 20, -1, -1 }); + byteCodeArray[21] = new LocalForm(21, "iload", new int[] { 21, -1 }); + byteCodeArray[22] = new LocalForm(22, "lload", new int[] { 22, -1 }); + byteCodeArray[23] = new LocalForm(23, "fload", new int[] { 23, -1 }); + byteCodeArray[24] = new LocalForm(24, "dload", new int[] { 24, -1 }); + byteCodeArray[25] = new LocalForm(25, "aload", new int[] { 25, -1 }); + byteCodeArray[26] = new NoArgumentForm(26, "iload_0"); + byteCodeArray[27] = new NoArgumentForm(27, "iload_1"); + byteCodeArray[28] = new NoArgumentForm(28, "iload_2"); + byteCodeArray[29] = new NoArgumentForm(29, "iload_3"); + byteCodeArray[30] = new NoArgumentForm(30, "lload_0"); + byteCodeArray[31] = new NoArgumentForm(31, "lload_1"); + byteCodeArray[32] = new NoArgumentForm(32, "lload_2"); + byteCodeArray[33] = new NoArgumentForm(33, "lload_3"); + byteCodeArray[34] = new NoArgumentForm(34, "fload_0"); + byteCodeArray[35] = new NoArgumentForm(35, "fload_1"); + byteCodeArray[36] = new NoArgumentForm(36, "fload_2"); + byteCodeArray[37] = new NoArgumentForm(37, "fload_3"); + byteCodeArray[38] = new NoArgumentForm(38, "dload_0"); + byteCodeArray[39] = new NoArgumentForm(39, "dload_1"); + byteCodeArray[40] = new NoArgumentForm(40, "dload_2"); + byteCodeArray[41] = new NoArgumentForm(41, "dload_3"); + byteCodeArray[42] = new NoArgumentForm(42, "aload_0"); + byteCodeArray[43] = new NoArgumentForm(43, "aload_1"); + byteCodeArray[44] = new NoArgumentForm(44, "aload_2"); + byteCodeArray[45] = new NoArgumentForm(45, "aload_3"); + byteCodeArray[46] = new NoArgumentForm(46, "iaload"); + byteCodeArray[47] = new NoArgumentForm(47, "laload"); + byteCodeArray[48] = new NoArgumentForm(48, "faload"); + byteCodeArray[49] = new NoArgumentForm(49, "daload"); + byteCodeArray[50] = new NoArgumentForm(50, "aaload"); + byteCodeArray[51] = new NoArgumentForm(51, "baload"); + byteCodeArray[52] = new NoArgumentForm(52, "caload"); + byteCodeArray[53] = new NoArgumentForm(53, "saload"); + byteCodeArray[54] = new LocalForm(54, "istore", new int[] { 54, -1 }); + byteCodeArray[55] = new LocalForm(55, "lstore", new int[] { 55, -1 }); + byteCodeArray[56] = new LocalForm(56, "fstore", new int[] { 56, -1 }); + byteCodeArray[57] = new LocalForm(57, "dstore", new int[] { 57, -1 }); + byteCodeArray[58] = new LocalForm(58, "astore", new int[] { 58, -1 }); + byteCodeArray[59] = new NoArgumentForm(59, "istore_0"); + byteCodeArray[60] = new NoArgumentForm(60, "istore_1"); + byteCodeArray[61] = new NoArgumentForm(61, "istore_2"); + byteCodeArray[62] = new NoArgumentForm(62, "istore_3"); + byteCodeArray[63] = new NoArgumentForm(63, "lstore_0"); + byteCodeArray[64] = new NoArgumentForm(64, "lstore_1"); + byteCodeArray[65] = new NoArgumentForm(65, "lstore_2"); + byteCodeArray[66] = new NoArgumentForm(66, "lstore_3"); + byteCodeArray[67] = new NoArgumentForm(67, "fstore_0"); + byteCodeArray[68] = new NoArgumentForm(68, "fstore_1"); + byteCodeArray[69] = new NoArgumentForm(69, "fstore_2"); + byteCodeArray[70] = new NoArgumentForm(70, "fstore_3"); + byteCodeArray[71] = new NoArgumentForm(71, "dstore_0"); + byteCodeArray[72] = new NoArgumentForm(72, "dstore_1"); + byteCodeArray[73] = new NoArgumentForm(73, "dstore_2"); + byteCodeArray[74] = new NoArgumentForm(74, "dstore_3"); + byteCodeArray[75] = new NoArgumentForm(75, "astore_0"); + byteCodeArray[76] = new NoArgumentForm(76, "astore_1"); + byteCodeArray[77] = new NoArgumentForm(77, "astore_2"); + byteCodeArray[78] = new NoArgumentForm(78, "astore_3"); + byteCodeArray[79] = new NoArgumentForm(79, "iastore"); + byteCodeArray[80] = new NoArgumentForm(80, "lastore"); + byteCodeArray[81] = new NoArgumentForm(81, "fastore"); + byteCodeArray[82] = new NoArgumentForm(82, "dastore"); + byteCodeArray[83] = new NoArgumentForm(83, "aastore"); + byteCodeArray[84] = new NoArgumentForm(84, "bastore"); + byteCodeArray[85] = new NoArgumentForm(85, "castore"); + byteCodeArray[86] = new NoArgumentForm(86, "sastore"); + byteCodeArray[87] = new NoArgumentForm(87, "pop"); + byteCodeArray[88] = new NoArgumentForm(88, "pop2"); + byteCodeArray[89] = new NoArgumentForm(89, "dup"); + byteCodeArray[90] = new NoArgumentForm(90, "dup_x1"); + byteCodeArray[91] = new NoArgumentForm(91, "dup_x2"); + byteCodeArray[92] = new NoArgumentForm(92, "dup2"); + byteCodeArray[93] = new NoArgumentForm(93, "dup2_x1"); + byteCodeArray[94] = new NoArgumentForm(94, "dup2_x2"); + byteCodeArray[95] = new NoArgumentForm(95, "swap"); + byteCodeArray[96] = new NoArgumentForm(96, "iadd"); + byteCodeArray[97] = new NoArgumentForm(97, "ladd"); + byteCodeArray[98] = new NoArgumentForm(98, "fadd"); + byteCodeArray[99] = new NoArgumentForm(99, "dadd"); + byteCodeArray[100] = new NoArgumentForm(100, "isub"); + byteCodeArray[101] = new NoArgumentForm(101, "lsub"); + byteCodeArray[102] = new NoArgumentForm(102, "fsub"); + byteCodeArray[103] = new NoArgumentForm(103, "dsub"); + byteCodeArray[104] = new NoArgumentForm(104, "imul"); + byteCodeArray[105] = new NoArgumentForm(105, "lmul"); + byteCodeArray[106] = new NoArgumentForm(106, "fmul"); + byteCodeArray[107] = new NoArgumentForm(107, "dmul"); + byteCodeArray[108] = new NoArgumentForm(108, "idiv"); + byteCodeArray[109] = new NoArgumentForm(109, "ldiv"); + byteCodeArray[110] = new NoArgumentForm(110, "fdiv"); + byteCodeArray[111] = new NoArgumentForm(111, "ddiv"); + byteCodeArray[112] = new NoArgumentForm(112, "irem"); + byteCodeArray[113] = new NoArgumentForm(113, "lrem"); + byteCodeArray[114] = new NoArgumentForm(114, "frem"); + byteCodeArray[115] = new NoArgumentForm(115, "drem"); + byteCodeArray[116] = new NoArgumentForm(116, ""); + byteCodeArray[117] = new NoArgumentForm(117, "lneg"); + byteCodeArray[118] = new NoArgumentForm(118, "fneg"); + byteCodeArray[119] = new NoArgumentForm(119, "dneg"); + byteCodeArray[120] = new NoArgumentForm(120, "ishl"); + byteCodeArray[121] = new NoArgumentForm(121, "lshl"); + byteCodeArray[122] = new NoArgumentForm(122, "ishr"); + byteCodeArray[123] = new NoArgumentForm(123, "lshr"); + byteCodeArray[124] = new NoArgumentForm(124, "iushr"); + byteCodeArray[125] = new NoArgumentForm(125, "lushr"); + byteCodeArray[126] = new NoArgumentForm(126, "iand"); + byteCodeArray[127] = new NoArgumentForm(127, "land"); + byteCodeArray[128] = new NoArgumentForm(128, "ior"); + byteCodeArray[129] = new NoArgumentForm(129, "lor"); + byteCodeArray[130] = new NoArgumentForm(130, "ixor"); + byteCodeArray[131] = new NoArgumentForm(131, "lxor"); + byteCodeArray[132] = new IincForm(132, "iinc", + new int[] { 132, -1, -1 }); + byteCodeArray[133] = new NoArgumentForm(133, "i2l"); + byteCodeArray[134] = new NoArgumentForm(134, "i2f"); + byteCodeArray[135] = new NoArgumentForm(135, "i2d"); + byteCodeArray[136] = new NoArgumentForm(136, "l2i"); + byteCodeArray[137] = new NoArgumentForm(137, "l2f"); + byteCodeArray[138] = new NoArgumentForm(138, "l2d"); + byteCodeArray[139] = new NoArgumentForm(139, "f2i"); + byteCodeArray[140] = new NoArgumentForm(140, "f2l"); + byteCodeArray[141] = new NoArgumentForm(141, "f2d"); + byteCodeArray[142] = new NoArgumentForm(142, "d2i"); + byteCodeArray[143] = new NoArgumentForm(143, "d2l"); + byteCodeArray[144] = new NoArgumentForm(144, "d2f"); + byteCodeArray[145] = new NoArgumentForm(145, "i2b"); + byteCodeArray[146] = new NoArgumentForm(146, "i2c"); + byteCodeArray[147] = new NoArgumentForm(147, "i2s"); + byteCodeArray[148] = new NoArgumentForm(148, "lcmp"); + byteCodeArray[149] = new NoArgumentForm(149, "fcmpl"); + byteCodeArray[150] = new NoArgumentForm(150, "fcmpg"); + byteCodeArray[151] = new NoArgumentForm(151, "dcmpl"); + byteCodeArray[152] = new NoArgumentForm(152, "dcmpg"); + byteCodeArray[153] = new LabelForm(153, "ifeq", + new int[] { 153, -1, -1 }); + byteCodeArray[154] = new LabelForm(154, "ifne", + new int[] { 154, -1, -1 }); + byteCodeArray[155] = new LabelForm(155, "iflt", + new int[] { 155, -1, -1 }); + byteCodeArray[156] = new LabelForm(156, "ifge", + new int[] { 156, -1, -1 }); + byteCodeArray[157] = new LabelForm(157, "ifgt", + new int[] { 157, -1, -1 }); + byteCodeArray[158] = new LabelForm(158, "ifle", + new int[] { 158, -1, -1 }); + byteCodeArray[159] = new LabelForm(159, "if_icmpeq", new int[] { 159, + -1, -1 }); + byteCodeArray[160] = new LabelForm(160, "if_icmpne", new int[] { 160, + -1, -1 }); + byteCodeArray[161] = new LabelForm(161, "if_icmplt", new int[] { 161, + -1, -1 }); + byteCodeArray[162] = new LabelForm(162, "if_icmpge", new int[] { 162, + -1, -1 }); + byteCodeArray[163] = new LabelForm(163, "if_icmpgt", new int[] { 163, + -1, -1 }); + byteCodeArray[164] = new LabelForm(164, "if_icmple", new int[] { 164, + -1, -1 }); + byteCodeArray[165] = new LabelForm(165, "if_acmpeq", new int[] { 165, + -1, -1 }); + byteCodeArray[166] = new LabelForm(166, "if_acmpne", new int[] { 166, + -1, -1 }); + byteCodeArray[167] = new LabelForm(167, "goto", + new int[] { 167, -1, -1 }); + byteCodeArray[168] = new LabelForm(168, "jsr", + new int[] { 168, -1, -1 }); + byteCodeArray[169] = new LocalForm(169, "ret", new int[] { 169, -1 }); + byteCodeArray[170] = new TableSwitchForm(170, "tableswitch"); + byteCodeArray[171] = new LookupSwitchForm(171, "lookupswitch"); + byteCodeArray[172] = new NoArgumentForm(172, "ireturn"); + byteCodeArray[173] = new NoArgumentForm(173, "lreturn"); + byteCodeArray[174] = new NoArgumentForm(174, "freturn"); + byteCodeArray[175] = new NoArgumentForm(175, "dreturn"); + byteCodeArray[176] = new NoArgumentForm(176, "areturn"); + byteCodeArray[177] = new NoArgumentForm(177, "return"); + byteCodeArray[178] = new FieldRefForm(178, "getstatic", new int[] { + 178, -1, -1 }); + byteCodeArray[179] = new FieldRefForm(179, "putstatic", new int[] { + 179, -1, -1 }); + byteCodeArray[180] = new FieldRefForm(180, "getfield", new int[] { 180, + -1, -1 }); + byteCodeArray[181] = new FieldRefForm(181, "putfield", new int[] { 181, + -1, -1 }); + byteCodeArray[182] = new MethodRefForm(182, "invokevirtual", new int[] { + 182, -1, -1 }); + byteCodeArray[183] = new MethodRefForm(183, "invokespecial", new int[] { + 183, -1, -1 }); + byteCodeArray[184] = new MethodRefForm(184, "invokestatic", new int[] { + 184, -1, -1 }); + byteCodeArray[185] = new IMethodRefForm(185, "invokeinterface", + new int[] { 185, -1, -1, /* count */-1, 0 }); + byteCodeArray[186] = new NoArgumentForm(186, "xxxunusedxxx"); + byteCodeArray[187] = new NewClassRefForm(187, "new", new int[] { 187, + -1, -1 }); + byteCodeArray[188] = new ByteForm(188, "newarray", + new int[] { 188, -1 }); + byteCodeArray[189] = new ClassRefForm(189, "anewarray", new int[] { + 189, -1, -1 }); + byteCodeArray[190] = new NoArgumentForm(190, "arraylength"); + byteCodeArray[191] = new NoArgumentForm(191, "athrow"); + byteCodeArray[192] = new ClassRefForm(192, "checkcast", new int[] { + 192, -1, -1 }); + byteCodeArray[193] = new ClassRefForm(193, "instanceof", new int[] { + 193, -1, -1 }); + byteCodeArray[194] = new NoArgumentForm(194, "monitorenter"); + byteCodeArray[195] = new NoArgumentForm(195, "monitorexit"); + byteCodeArray[196] = new WideForm(196, "wide"); + byteCodeArray[197] = new MultiANewArrayForm(197, "multianewarray", + new int[] { 197, -1, -1, -1 }); + byteCodeArray[198] = new LabelForm(198, "ifnull", new int[] { 198, -1, + -1 }); + byteCodeArray[199] = new LabelForm(199, "ifnonnull", new int[] { 199, + -1, -1 }); + byteCodeArray[200] = new LabelForm(200, "goto_w", new int[] { 200, -1, + -1, -1, -1 }, WIDENED); + byteCodeArray[201] = new LabelForm(201, "jsr_w", new int[] { 201, -1, + -1, -1, -1 }, WIDENED); + + // Extra ones defined by pack200 + byteCodeArray[202] = new ThisFieldRefForm(202, "getstatic_this", + new int[] { 178, -1, -1 }); + byteCodeArray[203] = new ThisFieldRefForm(203, "putstatic_this", + new int[] { 179, -1, -1 }); + byteCodeArray[204] = new ThisFieldRefForm(204, "getfield_this", + new int[] { 180, -1, -1 }); + byteCodeArray[205] = new ThisFieldRefForm(205, "putfield_this", + new int[] { 181, -1, -1 }); + byteCodeArray[206] = new ThisMethodRefForm(206, "invokevirtual_this", + new int[] { 182, -1, -1 }); + byteCodeArray[207] = new ThisMethodRefForm(207, "invokespecial_this", + new int[] { 183, -1, -1 }); + byteCodeArray[208] = new ThisMethodRefForm(208, "invokestatic_this", + new int[] { 184, -1, -1 }); + byteCodeArray[209] = new ThisFieldRefForm(209, + "aload_0_getstatic_this", new int[] { 42, 178, -1, -1 }); + byteCodeArray[210] = new ThisFieldRefForm(210, + "aload_0_putstatic_this", new int[] { 42, 179, -1, -1 }); + byteCodeArray[211] = new ThisFieldRefForm(211, "aload_0_getfield_this", + new int[] { 42, 180, -1, -1 }); + byteCodeArray[212] = new ThisFieldRefForm(212, "aload_0_putfield_this", + new int[] { 42, 181, -1, -1 }); + byteCodeArray[213] = new ThisMethodRefForm(213, + "aload_0_invokevirtual_this", new int[] { 42, 182, -1, -1 }); + byteCodeArray[214] = new ThisMethodRefForm(214, + "aload_0_invokespecial_this", new int[] { 42, 183, -1, -1 }); + byteCodeArray[215] = new ThisMethodRefForm(215, + "aload_0_invokestatic_this", new int[] { 42, 184, -1, -1 }); + byteCodeArray[216] = new SuperFieldRefForm(216, "getstatic_super", + new int[] { 178, -1, -1 }); + byteCodeArray[217] = new SuperFieldRefForm(217, "putstatic_super", + new int[] { 179, -1, -1 }); + byteCodeArray[218] = new SuperFieldRefForm(218, "getfield_super", + new int[] { 180, -1, -1 }); + byteCodeArray[219] = new SuperFieldRefForm(219, "putfield_super", + new int[] { 181, -1, -1 }); + byteCodeArray[220] = new SuperMethodRefForm(220, "invokevirtual_super", + new int[] { 182, -1, -1 }); + byteCodeArray[221] = new SuperMethodRefForm(221, "invokespecial_super", + new int[] { 183, -1, -1 }); + byteCodeArray[222] = new SuperMethodRefForm(222, "invokestatic_super", + new int[] { 184, -1, -1 }); + byteCodeArray[223] = new SuperFieldRefForm(223, + "aload_0_getstatic_super", new int[] { 42, 178, -1, -1 }); + byteCodeArray[224] = new SuperFieldRefForm(224, + "aload_0_putstatic_super", new int[] { 42, 179, -1, -1 }); + byteCodeArray[225] = new SuperFieldRefForm(225, + "aload_0_getfield_super", new int[] { 42, 180, -1, -1 }); + byteCodeArray[226] = new SuperFieldRefForm(226, + "aload_0_putfield_super", new int[] { 42, 181, -1, -1 }); + byteCodeArray[227] = new SuperMethodRefForm(227, + "aload_0_invokevirtual_super", new int[] { 42, 182, -1, -1 }); + byteCodeArray[228] = new SuperMethodRefForm(228, + "aload_0_invokespecial_super", new int[] { 42, 183, -1, -1 }); + byteCodeArray[229] = new SuperMethodRefForm(229, + "aload_0_invokestatic_super", new int[] { 42, 184, -1, -1 }); + byteCodeArray[230] = new ThisInitMethodRefForm(230, + "invokespecial_this_init", new int[] { 183, -1, -1 }); + byteCodeArray[231] = new SuperInitMethodRefForm(231, + "invokespecial_super_init", new int[] { 183, -1, -1 }); + byteCodeArray[232] = new NewInitMethodRefForm(232, + "invokespecial_new_init", new int[] { 183, -1, -1 }); + byteCodeArray[233] = new NarrowClassRefForm(233, "cldc", new int[] { + 18, -1 }); + byteCodeArray[234] = new IntRefForm(234, "ildc", new int[] { 18, -1 }); + byteCodeArray[235] = new FloatRefForm(235, "fldc", new int[] { 18, -1 }); + byteCodeArray[236] = new NarrowClassRefForm(236, "cldc_w", new int[] { + 19, -1, -1 }, WIDENED); + byteCodeArray[237] = new IntRefForm(237, "ildc_w", new int[] { 19, -1, + -1 }, WIDENED); + byteCodeArray[238] = new FloatRefForm(238, "fldc_w", new int[] { 19, + -1, -1 }, WIDENED); + byteCodeArray[239] = new DoubleForm(239, "dldc2_w", new int[] { 20, -1, + -1 }); + + // Reserved bytecodes + byteCodeArray[254] = new NoArgumentForm(254, "impdep1"); + byteCodeArray[255] = new NoArgumentForm(255, "impdep2"); + + // Bytecodes that aren't defined in the spec but are useful when + // unpacking (all must be >255) + // maybe wide versions of the others? etc. + + // Put all the bytecodes in a HashMap so we can + // get them by either name or number + for (int i = 0; i < byteCodeArray.length; i++) { + final ByteCodeForm byteCode = byteCodeArray[i]; + if (byteCode != null) { + byteCodesByName.put(byteCode.getName(), byteCode); + } + } + } + + private final int opcode; + private final String name; + private final int[] rewrite; + private int firstOperandIndex; + private int operandLength; + + /** + * Answer a new instance of this class with the specified opcode and name. + * Assume no rewrite. + * + * @param opcode + * int corresponding to the opcode's value + * @param name + * String printable name of the opcode + */ + public ByteCodeForm(int opcode, String name) { + this(opcode, name, new int[] { opcode }); + } + + /** + * Answer a new instance of this class with the specified opcode, name, + * operandType and rewrite + * + * @param opcode + * int corresponding to the opcode's value + * @param name + * String printable name of the opcode + * @param rewrite + * int[] Array of ints. Operand positions (which will later be + * rewritten in ByteCodes) are indicated by -1. + */ + public ByteCodeForm(int opcode, String name, int[] rewrite) { + this.opcode = opcode; + this.name = name; + this.rewrite = rewrite; + calculateOperandPosition(); + } + + protected void calculateOperandPosition() { + firstOperandIndex = -1; + operandLength = -1; + + // Find the first negative number in the rewrite array + int iterationIndex = 0; + while (iterationIndex < rewrite.length) { + if (rewrite[iterationIndex] < 0) { + // Found the first opcode to substitute + firstOperandIndex = iterationIndex; + iterationIndex = rewrite.length; + } else { + iterationIndex++; + } + } + + if (firstOperandIndex == -1) { + // Nothing more to do since the opcode has no operands + return; + } + + // Find the last negative number in the rewrite array + int lastOperandIndex = -1; + iterationIndex = firstOperandIndex; + while (iterationIndex < rewrite.length) { + if (rewrite[iterationIndex] < 0) { + lastOperandIndex = iterationIndex; + } + iterationIndex++; + } + + // Now we have the first index and the last index. + final int difference = lastOperandIndex - firstOperandIndex; + + // If last < first, something is wrong. + if (difference < 0) { + throw new Error( + "Logic error: not finding rewrite operands correctly"); + } + operandLength = difference + 1; + } + + public static ByteCodeForm get(int opcode) { + return (ByteCodeForm) byteCodeArray[opcode]; + } + + public static ByteCodeForm get(String name) { + return (ByteCodeForm) byteCodesByName.get(name); + } + + public String toString() { + return this.getClass().getName() + "(" + getName() + ":" + + getOperandType() + ")"; + } + + public int getOpcode() { + return opcode; + } + + public String getName() { + return name; + } + + public int getOperandType() { + return -1; + } + + public int[] getRewrite() { + return rewrite; + } + + public int[] getRewriteCopy() { + final int[] result = new int[rewrite.length]; + System.arraycopy(rewrite, 0, result, 0, rewrite.length); + return result; + } + + public int firstOperandIndex() { + return firstOperandIndex; + } + + public int operandLength() { + return operandLength; + } + + public boolean hasNoOperand() { + return false; + } + + public boolean hasByteOperand() { + return false; + } + + public boolean hasShortOperand() { + return false; + } + + public boolean hasIntRefOperand() { + return false; + } + + public boolean hasFloatRefOperand() { + return false; + } + + public boolean hasStringRefOperand() { + return false; + } + + public boolean hasClassRefOperand() { + return false; + } + + public boolean hasLongOperand() { + return false; + } + + public boolean hasDoubleOperand() { + return false; + } + + public boolean hasLocalOperand() { + return false; + } + + public boolean hasLabelOperand() { + return false; + } + + public boolean hasFieldRefOperand() { + return false; + } + + public boolean hasMethodRefOperand() { + return false; + } + + public boolean hasIMethodRefOperand() { + return false; + } + + public boolean hasWideOperand() { + return false; + } + + public boolean hasIincOperand() { + return false; + } + + public boolean hasSwitchOperand() { + return false; + } + + public boolean hasMultianewarrayOperand() { + return false; + } + + public boolean hasThisFieldRefOperand() { + return false; + } + + public boolean hasThisMethodRefOperand() { + return false; + } + + public boolean hasSuperFieldRefOperand() { + return false; + } + + public boolean hasSuperMethodRefOperand() { + return false; + } + + public boolean hasThisInitMethodRefOperand() { + return false; + } + + public boolean hasSuperInitMethodRefOperand() { + return false; + } + + public boolean hasNewInitMethodRefOperand() { + return false; + } + + public boolean hasInitMethodRefOperand() { + return false; + } + + /** + * This method will answer true if the receiver is a multi-bytecode + * instruction (such as aload0_putfield_super); otherwise, it will answer + * false. + * + * @return boolean true if multibytecode, false otherwise + */ + public boolean hasMultipleByteCodes() { + if (rewrite.length > 1) { + // Currently, all multi-bytecode instructions + // begin with aload_0, so this is how we test. + if (rewrite[0] == 42) { + // If there's an instruction (not a negative + // number, which is an operand) after the + // aload_0, it's a multibytecode instruction. + return (rewrite[1] > 0); + } + } + return false; + } + + /** + * When passed a byteCode, an OperandTable and a SegmentConstantPool, this + * method will set the rewrite of the byteCode appropriately. + * + * @param byteCode + * ByteCode to be updated (!) + * @param operandManager + * OperandTable from which to draw info + * @param codeLength + * Length of bytes (excluding this bytecode) from the beginning + * of the method. Used in calculating padding for some + * variable-length bytecodes (such as lookupswitch, tableswitch). + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + throw new Error("My subclass should have implemented this"); + } + + /** + * The ByteCodeForm knows how to fix up a bytecode if it needs to be fixed + * up because it holds a Label bytecode. + * + * @param byteCode + * a ByteCode to be fixed up + * @param codeAttribute + * a CodeAttribute used to determine how the ByteCode should be + * fixed up. + */ + public void fixUpByteCodeTargets(ByteCode byteCode, + CodeAttribute codeAttribute) { + // Most ByteCodeForms don't have any fixing up to do. + return; + } + + public boolean nestedMustStartClassPool() { + return false; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ByteForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ByteForm.java new file mode 100644 index 0000000..07a3872 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ByteForm.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the form for bytecodes which have single byte operands. + */ +public class ByteForm extends ByteCodeForm { + + public ByteForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_BYTE; + } + + public boolean hasByteOperand() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.SegmentConstantPool) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + byteCode.setOperandByte(operandManager.nextByte() & 0xFF, 0); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ClassRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ClassRefForm.java new file mode 100644 index 0000000..71c1486 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ClassRefForm.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have class + * references (and only class references). + */ +public class ClassRefForm extends ReferenceForm { + + protected boolean widened; + + public ClassRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public ClassRefForm(int opcode, String name, int[] rewrite, boolean widened) { + this(opcode, name, rewrite); + this.widened = widened; + } + + protected void setNestedEntries(ByteCode byteCode, + OperandManager operandManager, int offset) throws Pack200Exception { + // If the offset is not zero, proceed normally. + if (offset != 0) { + super.setNestedEntries(byteCode, operandManager, offset - 1); + return; + } + // If the offset is 0, ClassRefForms refer to + // the current class. Add that as the nested class. + // (This is true for all bc_classref forms in + // the spec except for multianewarray, which has + // its own form.) + final SegmentConstantPool globalPool = operandManager + .globalConstantPool(); + ClassFileEntry[] nested = null; + // How do I get this class? + nested = new ClassFileEntry[] { globalPool + .getClassPoolEntry(operandManager.getCurrentClass()) }; + byteCode.setNested(nested); + byteCode.setNestedPositions(new int[][] { { 0, 2 } }); + } + + public int getOperandType() { + return TYPE_CLASSREF; + } + + public boolean hasClassRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextClassRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_CLASS; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ClassSpecificReferenceForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ClassSpecificReferenceForm.java new file mode 100644 index 0000000..a3f11a3 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ClassSpecificReferenceForm.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * Abstract superclass of all classes that have class-specific references to + * constant pool information. These classes have a context (a string + * representing a pack200 class) i.e., they send getClassSpecificPoolEntry + * instead of getConstantPoolEntry. + * + */ +public abstract class ClassSpecificReferenceForm extends ReferenceForm { + + public ClassSpecificReferenceForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + protected abstract int getOffset(OperandManager operandManager); + + protected abstract int getPoolID(); + + protected abstract String context(OperandManager operandManager); + + protected void setNestedEntries(ByteCode byteCode, + OperandManager operandManager, int offset) throws Pack200Exception { + final SegmentConstantPool globalPool = operandManager + .globalConstantPool(); + ClassFileEntry[] nested = null; + nested = new ClassFileEntry[] { globalPool.getClassSpecificPoolEntry( + getPoolID(), offset, context(operandManager)) }; + byteCode.setNested(nested); + byteCode.setNestedPositions(new int[][] { { 0, 2 } }); + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/DoubleForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/DoubleForm.java new file mode 100644 index 0000000..30431f0 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/DoubleForm.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have + * double references (and only double references). + */ +public class DoubleForm extends ReferenceForm { + + public DoubleForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_DOUBLE; + } + + public boolean hasDoubleOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextDoubleRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_DOUBLE; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/FieldRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/FieldRefForm.java new file mode 100644 index 0000000..e95544f --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/FieldRefForm.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have field + * references (and only field references). + */ +public class FieldRefForm extends ReferenceForm { + + public FieldRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_FIELDREF; + } + + public boolean hasFieldRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextFieldRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_FIELD; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/FloatRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/FloatRefForm.java new file mode 100644 index 0000000..8b1690a --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/FloatRefForm.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have float + * references (and only float references). + */ +public class FloatRefForm extends SingleByteReferenceForm { + + public FloatRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public FloatRefForm(int opcode, String name, int[] rewrite, boolean widened) { + this(opcode, name, rewrite); + this.widened = widened; + } + + public int getOperandType() { + return TYPE_FLOATREF; + } + + public boolean hasFloatRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextFloatRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_FLOAT; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/IMethodRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/IMethodRefForm.java new file mode 100644 index 0000000..9bb9be1 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/IMethodRefForm.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.CPInterfaceMethodRef; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have + * IMethod references (and only IMethod references). + */ +public class IMethodRefForm extends ReferenceForm { + + public IMethodRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_IMETHODREF; + } + + public boolean hasIMethodRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextIMethodRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_IMETHOD; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.Segment) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + super.setByteCodeOperands(byteCode, operandManager, codeLength); + final int count = ((CPInterfaceMethodRef) byteCode + .getNestedClassFileEntries()[0]).invokeInterfaceCount(); + byteCode.getRewrite()[3] = count; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/IincForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/IincForm.java new file mode 100644 index 0000000..619bb95 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/IincForm.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for the iinc instruction. It has a + * local reference and a byte operand. + */ +public class IincForm extends ByteCodeForm { + + public IincForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_IINC; + } + + public boolean hasIincOperand() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.SegmentConstantPool) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + final int local = operandManager.nextLocal(); + final int constant = operandManager.nextByte(); + byteCode.setOperandBytes(new int[] { local, constant }); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/InitMethodReferenceForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/InitMethodReferenceForm.java new file mode 100644 index 0000000..4d02331 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/InitMethodReferenceForm.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * Abstract superclass of those classes which look up init methods (these are + * class specific methods). They use getInitMethodPoolEntry to find the methods. + */ +public abstract class InitMethodReferenceForm extends + ClassSpecificReferenceForm { + + public InitMethodReferenceForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + protected abstract String context(OperandManager operandManager); + + public boolean hasInitMethodRefOperand() { + return true; + } + + protected int getPoolID() { + return SegmentConstantPool.CP_METHOD; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextInitRef(); + } + + protected void setNestedEntries(ByteCode byteCode, + OperandManager operandManager, int offset) throws Pack200Exception { + final SegmentConstantPool globalPool = operandManager + .globalConstantPool(); + ClassFileEntry[] nested = null; + nested = new ClassFileEntry[] { globalPool.getInitMethodPoolEntry( + SegmentConstantPool.CP_METHOD, offset, context(operandManager)) }; + byteCode.setNested(nested); + byteCode.setNestedPositions(new int[][] { { 0, 2 } }); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/IntRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/IntRefForm.java new file mode 100644 index 0000000..7ebca59 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/IntRefForm.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have int + * references (and only int references). + */ +public class IntRefForm extends SingleByteReferenceForm { + + public IntRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public IntRefForm(int opcode, String name, int[] rewrite, boolean widened) { + this(opcode, name, rewrite); + this.widened = widened; + } + + public int getOperandType() { + return TYPE_INTREF; + } + + public boolean hasIntRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextIntRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_INT; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LabelForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LabelForm.java new file mode 100644 index 0000000..66f621e --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LabelForm.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.CodeAttribute; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have label + * references (and only label references). + */ +public class LabelForm extends ByteCodeForm { + + protected boolean widened; + + public LabelForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public LabelForm(int opcode, String name, int[] rewrite, boolean widened) { + this(opcode, name, rewrite); + this.widened = widened; + } + + public int getOperandType() { + return TYPE_LABEL; + } + + public boolean hasLabelOperand() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#fixUpByteCodeTarget(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.CodeAttribute) + */ + public void fixUpByteCodeTargets(ByteCode byteCode, + CodeAttribute codeAttribute) { + // LabelForms need to fix up the target of label operations + final int originalTarget = byteCode.getByteCodeTargets()[0]; + final int sourceIndex = byteCode.getByteCodeIndex(); + final int absoluteInstructionTargetIndex = sourceIndex + originalTarget; + final int targetValue = ((Integer) codeAttribute.byteCodeOffsets + .get(absoluteInstructionTargetIndex)).intValue(); + final int sourceValue = ((Integer) codeAttribute.byteCodeOffsets + .get(sourceIndex)).intValue(); + // The operand is the difference between the source instruction + // and the destination instruction. + byteCode.setOperandSigned2Bytes(targetValue - sourceValue, 0); + if (widened) { + byteCode.setNestedPositions(new int[][] { { 0, 4 } }); + } else { + byteCode.setNestedPositions(new int[][] { { 0, 2 } }); + } + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.SegmentConstantPool) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + byteCode.setByteCodeTargets(new int[] { operandManager.nextLabel() }); + // The byte code operands actually get set later - + // once we have all the bytecodes - in fixUpByteCodeTarget(). + return; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LocalForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LocalForm.java new file mode 100644 index 0000000..40515ca --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LocalForm.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have float + * references (and only float references). This excludes iinc (which has its own + * form, IincForm). + */ +public class LocalForm extends ByteCodeForm { + + public LocalForm(int opcode, String name) { + super(opcode, name); + } + + public LocalForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_LOCAL; + } + + public boolean hasLocalOperand() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.SegmentConstantPool) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + byteCode.setOperandBytes(new int[] { operandManager.nextLocal() }); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LongForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LongForm.java new file mode 100644 index 0000000..63c1b17 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LongForm.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have long + * references (and only long references). + */ +public class LongForm extends ReferenceForm { + + public LongForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_LONG; + } + + public boolean hasLongOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextLongRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_LONG; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LookupSwitchForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LookupSwitchForm.java new file mode 100644 index 0000000..af8757f --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/LookupSwitchForm.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +public class LookupSwitchForm extends SwitchForm { + + public LookupSwitchForm(int opcode, String name) { + super(opcode, name); + } + + public LookupSwitchForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.SwitchForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandManager, int) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + final int case_count = operandManager.nextCaseCount(); + final int default_pc = operandManager.nextLabel(); + final int case_values[] = new int[case_count]; + for (int index = 0; index < case_count; index++) { + case_values[index] = operandManager.nextCaseValues(); + } + final int case_pcs[] = new int[case_count]; + for (int index = 0; index < case_count; index++) { + case_pcs[index] = operandManager.nextLabel(); + } + + final int[] labelsArray = new int[case_count + 1]; + labelsArray[0] = default_pc; + for (int index = 1; index < case_count + 1; index++) { + labelsArray[index] = case_pcs[index - 1]; + } + byteCode.setByteCodeTargets(labelsArray); + + // All this gets dumped into the rewrite bytes of the + // poor bytecode. + + // Unlike most byte codes, the LookupSwitch is a + // variable-sized bytecode. Because of this, the + // rewrite array has to be defined here individually + // for each bytecode, rather than in the ByteCodeForm + // class. + + // First, there's the bytecode. Then there are 0-3 + // bytes of padding so that the first (default) + // label is on a 4-byte offset. + final int padLength = 3 - (codeLength % 4); + final int rewriteSize = 1 + padLength + 4 // defaultbytes + + 4 // npairs + + (4 * case_values.length) + (4 * case_pcs.length); + + final int[] newRewrite = new int[rewriteSize]; + int rewriteIndex = 0; + + // Fill in what we can now + // opcode + newRewrite[rewriteIndex++] = byteCode.getOpcode(); + + // padding + for (int index = 0; index < padLength; index++) { + newRewrite[rewriteIndex++] = 0; + } + + // defaultbyte + // This gets overwritten by fixUpByteCodeTargets + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + + // npairs + final int npairsIndex = rewriteIndex; + setRewrite4Bytes(case_values.length, npairsIndex, newRewrite); + rewriteIndex += 4; + + // match-offset pairs + // The case_values aren't overwritten, but the + // case_pcs will get overwritten by fixUpByteCodeTargets + for (int index = 0; index < case_values.length; index++) { + // match + setRewrite4Bytes(case_values[index], rewriteIndex, newRewrite); + rewriteIndex += 4; + // offset + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + } + byteCode.setRewrite(newRewrite); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/MethodRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/MethodRefForm.java new file mode 100644 index 0000000..916141b --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/MethodRefForm.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have + * regular method references (and only regular method references). These are: + * invokevirtual invokespecial invokestatic Class-specific references to methods + * are subclasses of ClassSpecificReferenceForm instead. + */ +public class MethodRefForm extends ReferenceForm { + + public MethodRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_METHODREF; + } + + public boolean hasMethodRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextMethodRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_METHOD; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/MultiANewArrayForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/MultiANewArrayForm.java new file mode 100644 index 0000000..90b0924 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/MultiANewArrayForm.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for the multianewarray instruction. + * It has a class reference and a byte operand. + * + * MultiANewArrayForms (like other anewarray forms) do not track the last new(). + */ +public class MultiANewArrayForm extends ClassRefForm { + + public MultiANewArrayForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_MULTIANEWARRAY; + } + + public boolean hasMultianewarrayOperand() { + return true; + } + + public boolean hasClassRefOperand() { + return false; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.SegmentConstantPool) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + // multianewarray has a class ref and a dimension. + // The superclass handles the class ref. + super.setByteCodeOperands(byteCode, operandManager, codeLength); + + // We have to handle the dimension. + final int dimension = operandManager.nextByte(); + byteCode.setOperandByte(dimension, 2); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NarrowClassRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NarrowClassRefForm.java new file mode 100644 index 0000000..1fafef1 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NarrowClassRefForm.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class is used for representations of cldc and cldc_w. In these cases, a + * narrow class ref has one byte and a wide class ref has two bytes. + */ +public class NarrowClassRefForm extends ClassRefForm { + + public NarrowClassRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public NarrowClassRefForm(int opcode, String name, int[] rewrite, + boolean widened) { + super(opcode, name, rewrite, widened); + } + + protected void setNestedEntries(ByteCode byteCode, + OperandManager operandManager, int offset) throws Pack200Exception { + super.setNestedEntries(byteCode, operandManager, offset); + if (!widened) { + byteCode.setNestedPositions(new int[][] { { 0, 1 } }); + } + } + + public boolean nestedMustStartClassPool() { + return !widened; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NewClassRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NewClassRefForm.java new file mode 100644 index 0000000..9c441af --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NewClassRefForm.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.CPClass; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class is an extension of the ClassRefForm. It has two purposes: 1. To + * keep track of the last type used in a new() instruction in the current class. + * 2. To allow the sender to create instances of either a specified class (which + * then becomes the new class) or the last used new class. + */ +public class NewClassRefForm extends ClassRefForm { + + public NewClassRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ReferenceForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandManager) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + ClassFileEntry[] nested = null; + final int offset = getOffset(operandManager); + if (offset == 0) { + // Use current class + final SegmentConstantPool globalPool = operandManager + .globalConstantPool(); + nested = new ClassFileEntry[] { globalPool + .getClassPoolEntry(operandManager.getCurrentClass()) }; + byteCode.setNested(nested); + byteCode.setNestedPositions(new int[][] { { 0, 2 } }); + } else { + // Look up the class in the classpool + try { + // Parent takes care of subtracting one from offset + // to adjust for 1-based global pool + setNestedEntries(byteCode, operandManager, offset); + } catch (final Pack200Exception ex) { + throw new Error("Got a pack200 exception. What to do?"); + } + } + operandManager.setNewClass(((CPClass) byteCode + .getNestedClassFileEntries()[0]).getName()); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NewInitMethodRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NewInitMethodRefForm.java new file mode 100644 index 0000000..e0e80fc --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NewInitMethodRefForm.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class is used to determine which init method should be called, based on + * the last class which was sent a constructor message. + */ +public class NewInitMethodRefForm extends InitMethodReferenceForm { + + public NewInitMethodRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_NEWINITMETHODREF; + } + + public boolean hasNewInitMethodRefOperand() { + return true; + } + + protected String context(OperandManager operandManager) { + final String result = operandManager.getNewClass(); + return result; + } + + protected void setNestedEntries(ByteCode byteCode, + OperandManager operandManager, int offset) throws Pack200Exception { + final SegmentConstantPool globalPool = operandManager + .globalConstantPool(); + ClassFileEntry[] nested = null; + nested = new ClassFileEntry[] { globalPool.getInitMethodPoolEntry( + SegmentConstantPool.CP_METHOD, offset, context(operandManager)) }; + byteCode.setNested(nested); + byteCode.setNestedPositions(new int[][] { { 0, 2 } }); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NoArgumentForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NoArgumentForm.java new file mode 100644 index 0000000..e3a9a09 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/NoArgumentForm.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form of all bytecodes which either have + * no operands (such as nop) or have all their operands passed on the stack (not + * encoded as bytes in the bytecode streams). + */ +public class NoArgumentForm extends ByteCodeForm { + + public NoArgumentForm(int opcode, String name) { + super(opcode, name); + } + + public int getOperandType() { + return TYPE_NONE; + } + + public boolean hasNoOperand() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.SegmentConstantPool) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + // Nothing to do for no-argument form + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ReferenceForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ReferenceForm.java new file mode 100644 index 0000000..d121e16 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ReferenceForm.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * Abstract class of all ByteCodeForms which add a nested entry from the + * globalConstantPool. + */ +public abstract class ReferenceForm extends ByteCodeForm { + + public ReferenceForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + protected abstract int getPoolID(); + + protected abstract int getOffset(OperandManager operandManager); + + protected void setNestedEntries(ByteCode byteCode, + OperandManager operandManager, int offset) throws Pack200Exception { + final SegmentConstantPool globalPool = operandManager + .globalConstantPool(); + ClassFileEntry[] nested = null; + nested = new ClassFileEntry[] { globalPool.getConstantPoolEntry( + getPoolID(), offset) }; + if(nested[0] == null) { + throw new NullPointerException("Null nested entries are not allowed"); + } + byteCode.setNested(nested); + byteCode.setNestedPositions(new int[][] { { 0, 2 } }); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.Segment) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + final int offset = getOffset(operandManager); + try { + setNestedEntries(byteCode, operandManager, offset); + } catch (final Pack200Exception ex) { + throw new Error("Got a pack200 exception. What to do?"); + } + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ShortForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ShortForm.java new file mode 100644 index 0000000..aab12ef --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ShortForm.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the form for bytecodes which have short operands only. + */ +public class ShortForm extends ByteCodeForm { + + public ShortForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_SHORT; + } + + public boolean hasShortOperand() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.SegmentConstantPool) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + byteCode.setOperand2Bytes(operandManager.nextShort(), 0); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SingleByteReferenceForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SingleByteReferenceForm.java new file mode 100644 index 0000000..01e88a1 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SingleByteReferenceForm.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * Some bytecodes (such as (a)ldc, fldc and ildc) have single- byte references + * to the class pool. This class is the abstract superclass of those classes. + */ +public abstract class SingleByteReferenceForm extends ReferenceForm { + + protected boolean widened; + + public SingleByteReferenceForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + protected abstract int getOffset(OperandManager operandManager); + + protected abstract int getPoolID(); + + protected void setNestedEntries(ByteCode byteCode, + OperandManager operandManager, int offset) throws Pack200Exception { + super.setNestedEntries(byteCode, operandManager, offset); + if (widened) { + byteCode.setNestedPositions(new int[][] { { 0, 2 } }); + } else { + byteCode.setNestedPositions(new int[][] { { 0, 1 } }); + } + } + + public boolean nestedMustStartClassPool() { + return !widened; + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/StringRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/StringRefForm.java new file mode 100644 index 0000000..f696a22 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/StringRefForm.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.CPString; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for those bytecodes which have + * string references (and only string references). + */ +public class StringRefForm extends SingleByteReferenceForm { + + public StringRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public StringRefForm(int opcode, String name, int[] rewrite, boolean widened) { + this(opcode, name, rewrite); + this.widened = widened; + } + + public int getOperandType() { + return TYPE_STRINGREF; + } + + public boolean hasStringRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextStringRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_STRING; + } + + protected void setNestedEntries(ByteCode byteCode, + OperandManager operandManager, int offset) throws Pack200Exception { + final SegmentConstantPool globalPool = operandManager + .globalConstantPool(); + ClassFileEntry[] nested = null; + nested = new ClassFileEntry[] { ((CPString) globalPool.getValue( + getPoolID(), offset)) }; + byteCode.setNested(nested); + if (widened) { + byteCode.setNestedPositions(new int[][] { { 0, 2 } }); + } else { + byteCode.setNestedPositions(new int[][] { { 0, 1 } }); + } + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperFieldRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperFieldRefForm.java new file mode 100644 index 0000000..5d2b38c --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperFieldRefForm.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements references to fields defined in the superclass, which + * is set by this class in the OperandManager. Pack200 allows the superclass to + * be inferred from context; this class tracks previous field reference + * superclasses to allow this. + */ +public class SuperFieldRefForm extends ClassSpecificReferenceForm { + + public SuperFieldRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_SUPERFIELDREF; + } + + public boolean hasSuperFieldRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextSuperFieldRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_FIELD; + } + + protected String context(OperandManager operandManager) { + return operandManager.getSuperClass(); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperInitMethodRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperInitMethodRefForm.java new file mode 100644 index 0000000..e3a2c39 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperInitMethodRefForm.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +/** + * This class is used to determine which init method should be called, based on + * the last superclass reference. + */ +public class SuperInitMethodRefForm extends InitMethodReferenceForm { + + public SuperInitMethodRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_SUPERINITMETHODREF; + } + + public boolean hasSuperInitMethodRefOperand() { + return true; + } + + protected String context( + org.apache.harmony.unpack200.bytecode.OperandManager operandManager) { + return operandManager.getSuperClass(); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperMethodRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperMethodRefForm.java new file mode 100644 index 0000000..d6e9227 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SuperMethodRefForm.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements references to methods defined in the superclass, which + * is set by this class in the OperandManager. Pack200 allows the superclass to + * be inferred from context; this class tracks previous method reference + * superclasses to allow this. + */ +public class SuperMethodRefForm extends ClassSpecificReferenceForm { + + public SuperMethodRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_SUPERMETHODREF; + } + + public boolean hasSuperMethodRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextSuperMethodRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_METHOD; + } + + protected String context(OperandManager operandManager) { + return operandManager.getSuperClass(); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SwitchForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SwitchForm.java new file mode 100644 index 0000000..486eb42 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/SwitchForm.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.CodeAttribute; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +public abstract class SwitchForm extends VariableInstructionForm { + + public SwitchForm(int opcode, String name) { + super(opcode, name); + } + + public SwitchForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_SWITCH; + } + + public boolean hasSwitchOperand() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.SegmentConstantPool) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#fixUpByteCodeTargets(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.CodeAttribute) + */ + public void fixUpByteCodeTargets(ByteCode byteCode, + CodeAttribute codeAttribute) { + // SwitchForms need to fix up the target of label operations + final int[] originalTargets = byteCode.getByteCodeTargets(); + final int numberOfLabels = originalTargets.length; + final int[] replacementTargets = new int[numberOfLabels]; + + final int sourceIndex = byteCode.getByteCodeIndex(); + final int sourceValue = ((Integer) codeAttribute.byteCodeOffsets + .get(sourceIndex)).intValue(); + for (int index = 0; index < numberOfLabels; index++) { + final int absoluteInstructionTargetIndex = sourceIndex + + originalTargets[index]; + final int targetValue = ((Integer) codeAttribute.byteCodeOffsets + .get(absoluteInstructionTargetIndex)).intValue(); + replacementTargets[index] = targetValue - sourceValue; + } + final int[] rewriteArray = byteCode.getRewrite(); + for (int index = 0; index < numberOfLabels; index++) { + setRewrite4Bytes(replacementTargets[index], rewriteArray); + } + } + +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/TableSwitchForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/TableSwitchForm.java new file mode 100644 index 0000000..7265bad --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/TableSwitchForm.java @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +public class TableSwitchForm extends SwitchForm { + + public TableSwitchForm(int opcode, String name) { + super(opcode, name); + } + + public TableSwitchForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.SwitchForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandManager, int) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + final int case_count = operandManager.nextCaseCount(); + final int default_pc = operandManager.nextLabel(); + int case_value = -1; + case_value = operandManager.nextCaseValues(); + + final int case_pcs[] = new int[case_count]; + for (int index = 0; index < case_count; index++) { + case_pcs[index] = operandManager.nextLabel(); + } + + final int[] labelsArray = new int[case_count + 1]; + labelsArray[0] = default_pc; + for (int index = 1; index < case_count + 1; index++) { + labelsArray[index] = case_pcs[index - 1]; + } + byteCode.setByteCodeTargets(labelsArray); + + final int lowValue = case_value; + final int highValue = lowValue + case_count - 1; + // All this gets dumped into the rewrite bytes of the + // poor bytecode. + + // Unlike most byte codes, the TableSwitch is a + // variable-sized bytecode. Because of this, the + // rewrite array has to be defined here individually + // for each bytecode, rather than in the ByteCodeForm + // class. + + // First, there's the bytecode. Then there are 0-3 + // bytes of padding so that the first (default) + // label is on a 4-byte offset. + final int padLength = 3 - (codeLength % 4); + final int rewriteSize = 1 + padLength + 4 // defaultbytes + + 4 // lowbyte + + 4 // highbyte + + (4 * case_pcs.length); + + final int[] newRewrite = new int[rewriteSize]; + int rewriteIndex = 0; + + // Fill in what we can now + // opcode + newRewrite[rewriteIndex++] = byteCode.getOpcode(); + + // padding + for (int index = 0; index < padLength; index++) { + newRewrite[rewriteIndex++] = 0; + } + + // defaultbyte + // This gets overwritten by fixUpByteCodeTargets + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + + // lowbyte + final int lowbyteIndex = rewriteIndex; + setRewrite4Bytes(lowValue, lowbyteIndex, newRewrite); + rewriteIndex += 4; + + // highbyte + final int highbyteIndex = rewriteIndex; + setRewrite4Bytes(highValue, highbyteIndex, newRewrite); + rewriteIndex += 4; + + // jump offsets + // The case_pcs will get overwritten by fixUpByteCodeTargets + for (int index = 0; index < case_count; index++) { + // offset + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + newRewrite[rewriteIndex++] = -1; + } + byteCode.setRewrite(newRewrite); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisFieldRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisFieldRefForm.java new file mode 100644 index 0000000..a297a9f --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisFieldRefForm.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements references to fields defined in the current class, + * which is set by this class in the OperandManager. Pack200 allows the current + * class to be inferred from context; this class tracks previous field reference + * classes to allow this. + */ +public class ThisFieldRefForm extends ClassSpecificReferenceForm { + + public ThisFieldRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_THISFIELDREF; + } + + public boolean hasThisFieldRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextThisFieldRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_FIELD; + } + + protected String context(OperandManager operandManager) { + return operandManager.getCurrentClass(); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisInitMethodRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisInitMethodRefForm.java new file mode 100644 index 0000000..6796c58 --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisInitMethodRefForm.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class is used to determine which init method should be called, based on + * the last current class reference. + */ +public class ThisInitMethodRefForm extends InitMethodReferenceForm { + + public ThisInitMethodRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_THISINITMETHODREF; + } + + public boolean hasThisInitMethodRefOperand() { + return true; + } + + protected String context(OperandManager operandManager) { + return operandManager.getCurrentClass(); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisMethodRefForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisMethodRefForm.java new file mode 100644 index 0000000..fa38efd --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/ThisMethodRefForm.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements references to methods defined in the current class, + * which is set by this class in the OperandManager. Pack200 allows the current + * class to be inferred from context; this class tracks previous method + * reference current classes to allow this. + */ +public class ThisMethodRefForm extends ClassSpecificReferenceForm { + + public ThisMethodRefForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_THISMETHODREF; + } + + public boolean hasThisMethodRefOperand() { + return true; + } + + protected int getOffset(OperandManager operandManager) { + return operandManager.nextThisMethodRef(); + } + + protected int getPoolID() { + return SegmentConstantPool.CP_METHOD; + } + + protected String context(OperandManager operandManager) { + return operandManager.getCurrentClass(); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/VariableInstructionForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/VariableInstructionForm.java new file mode 100644 index 0000000..1d1be2f --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/VariableInstructionForm.java @@ -0,0 +1,162 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +/** + * This abstract class implements the common code for instructions which have + * variable lengths. This is currently the *switch instructions and some wide + * (_w) instructions. + */ +public abstract class VariableInstructionForm extends ByteCodeForm { + + public VariableInstructionForm(int opcode, String name) { + super(opcode, name); + } + + public VariableInstructionForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + /** + * Given an int operand, set the rewrite bytes for the next available + * operand position and the three immediately following it to a + * highest-byte, mid-high, mid-low, low-byte encoding of the operand. + * + * Note that unlike the ByteCode setOperand* operations, this starts with an + * actual bytecode rewrite array (rather than a ByteCodeForm prototype + * rewrite array). Also, this method overwrites -1 values in the rewrite + * array - so if you start with an array that looks like: {100, -1, -1, -1, + * -1, 200, -1, -1, -1, -1} then calling setRewrite4Bytes(0, rewrite) the + * first time will convert it to: {100, 0, 0, 0, 0, 200, -1, -1, -1, -1} + * Calling setRewrite4Bytes(0, rewrite) a second time will convert it to: + * {100, 0, 0, 0, 0, 200, 0, 0, 0, 0} + * + * @param operand + * int to set the rewrite bytes to + * @param rewrite + * int[] bytes to rewrite + */ + public void setRewrite4Bytes(int operand, int[] rewrite) { + int firstOperandPosition = -1; + + // Find the first -1 in the rewrite array + for (int index = 0; index < rewrite.length - 3; index++) { + if ((rewrite[index] == -1) && (rewrite[index + 1] == -1) + && (rewrite[index + 2] == -1) && (rewrite[index + 3] == -1)) { + firstOperandPosition = index; + break; + } + } + setRewrite4Bytes(operand, firstOperandPosition, rewrite); + } + + /** + * Given an int operand, set the rewrite bytes for the next available + * operand position and the byte immediately following it to a high-byte, + * low-byte encoding of the operand. + * + * Note that unlike the ByteCode setOperand* operations, this starts with an + * actual bytecode rewrite array (rather than a ByteCodeForm prototype + * rewrite array). Also, this method overwrites -1 values in the rewrite + * array - so if you start with an array that looks like: {100, -1, -1, -1, + * -1, 200, -1, -1, -1, -1} then calling setRewrite2Bytes(0, rewrite) the + * first time will convert it to: {100, 0, 0, -1, -1, 200, -1, -1, -1, -1} + * Calling setRewrite2Bytes(0, rewrite) a second time will convert it to: + * {100, 0, 0, 0, 0, 200, -1, -1, -1, -1} + * + * @param operand + * int to set the rewrite bytes to + * @param rewrite + * int[] bytes to rewrite + */ + public void setRewrite2Bytes(int operand, int[] rewrite) { + int firstOperandPosition = -1; + + // Find the first -1 in the rewrite array + for (int index = 0; index < rewrite.length - 3; index++) { + if ((rewrite[index] == -1) && (rewrite[index + 1] == -1)) { + firstOperandPosition = index; + break; + } + } + setRewrite2Bytes(operand, firstOperandPosition, rewrite); + } + + /** + * This method writes operand directly into the rewrite array at index + * position specified. + * + * @param operand + * value to write + * @param absPosition + * position in array to write. Note that this is absolute + * position in the array, so one can overwrite the bytecode if + * one isn't careful. + * @param rewrite + * array to write into + */ + public void setRewrite4Bytes(int operand, int absPosition, int[] rewrite) { + if (absPosition < 0) { + throw new Error("Trying to rewrite " + this + + " but there is no room for 4 bytes"); + } + + final int byteCodeRewriteLength = rewrite.length; + + if (absPosition + 3 > byteCodeRewriteLength) { + throw new Error("Trying to rewrite " + this + + " with an int at position " + absPosition + + " but this won't fit in the rewrite array"); + } + + rewrite[absPosition] = ((0xFF000000) & operand) >> 24; + rewrite[absPosition + 1] = ((0x00FF0000) & operand) >> 16; + rewrite[absPosition + 2] = ((0x0000FF00) & operand) >> 8; + rewrite[absPosition + 3] = ((0x000000FF) & operand); + } + + /** + * This method writes operand directly into the rewrite array at index + * position specified. + * + * @param operand + * value to write + * @param absPosition + * position in array to write. Note that this is absolute + * position in the array, so one can overwrite the bytecode if + * one isn't careful. + * @param rewrite + * array to write into + */ + public void setRewrite2Bytes(int operand, int absPosition, int[] rewrite) { + if (absPosition < 0) { + throw new Error("Trying to rewrite " + this + + " but there is no room for 4 bytes"); + } + + final int byteCodeRewriteLength = rewrite.length; + + if (absPosition + 1 > byteCodeRewriteLength) { + throw new Error("Trying to rewrite " + this + + " with an int at position " + absPosition + + " but this won't fit in the rewrite array"); + } + + rewrite[absPosition] = ((0xFF00) & operand) >> 8; + rewrite[absPosition + 1] = ((0x00FF) & operand); + } +} diff --git a/src/main/java/org/apache/harmony/unpack200/bytecode/forms/WideForm.java b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/WideForm.java new file mode 100644 index 0000000..eaa1c6f --- /dev/null +++ b/src/main/java/org/apache/harmony/unpack200/bytecode/forms/WideForm.java @@ -0,0 +1,160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.bytecode.forms; + +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * This class implements the byte code form for the wide instruction. Unlike + * other instructions, it can take multiple forms, depending on what is being + * widened. + */ +public class WideForm extends VariableInstructionForm { + + public WideForm(int opcode, String name) { + super(opcode, name); + } + + public WideForm(int opcode, String name, int[] rewrite) { + super(opcode, name, rewrite); + } + + public int getOperandType() { + return TYPE_WIDE; + } + + public boolean hasWideOperand() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.apache.harmony.unpack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.unpack200.bytecode.ByteCode, + * org.apache.harmony.unpack200.bytecode.OperandTable, + * org.apache.harmony.unpack200.SegmentConstantPool) + */ + public void setByteCodeOperands(ByteCode byteCode, + OperandManager operandManager, int codeLength) { + final int instruction = operandManager.nextWideByteCode(); + if (instruction == 132) { + setByteCodeOperandsFormat2(instruction, byteCode, operandManager, + codeLength); + } else { + setByteCodeOperandsFormat1(instruction, byteCode, operandManager, + codeLength); + } + } + + /** + * This method sets the rewrite array for the bytecode using Format 1 of the + * JVM spec: an opcode and two index bytes. This is used for + * ?load/?store/ret + * + * @param instruction + * should be 132 + * @param byteCode + * the byte code whose rewrite array should be updated + * @param operandManager + * the source of the operands + * @param codeLength + * ignored + */ + protected void setByteCodeOperandsFormat1(int instruction, + ByteCode byteCode, OperandManager operandManager, int codeLength) { + + // Even though this code is really similar to the + // code for setByteCodeOperandsFormat2, I've left it + // distinct here. This is so changing one will + // not change the other - if there is a need to change, + // there's a good chance that the formats will + // differ, so an updater will not have to disentangle + // it. + final int local = operandManager.nextLocal(); + + // Unlike most byte codes, the wide bytecode is a + // variable-sized bytecode. Because of this, the + // rewrite array has to be defined here individually + // for each bytecode, rather than in the ByteCodeForm + // class. + + final int[] newRewrite = new int[4]; + int rewriteIndex = 0; + + // Fill in what we can now + // wide opcode + newRewrite[rewriteIndex++] = byteCode.getOpcode(); + + // "real" instruction that is widened + newRewrite[rewriteIndex++] = instruction; + + // Index bytes + setRewrite2Bytes(local, rewriteIndex, newRewrite); + rewriteIndex += 2; + + byteCode.setRewrite(newRewrite); + } + + /** + * This method sets the rewrite array for the bytecode using Format 2 of the + * JVM spec: an opcode, two index bytes, and two constant bytes. This is + * used for iinc. + * + * @param instruction + * int should be 132 + * @param byteCode + * ByteCode whose rewrite array should be updated + * @param operandManager + * OperandManager source of the operands + * @param codeLength + * ignored + */ + protected void setByteCodeOperandsFormat2(int instruction, + ByteCode byteCode, OperandManager operandManager, int codeLength) { + + final int local = operandManager.nextLocal(); + final int constWord = operandManager.nextShort(); + + // Unlike most byte codes, the wide bytecode is a + // variable-sized bytecode. Because of this, the + // rewrite array has to be defined here individually + // for each bytecode, rather than in the ByteCodeForm + // class. + + final int[] newRewrite = new int[6]; + int rewriteIndex = 0; + + // Fill in what we can now + // wide opcode + newRewrite[rewriteIndex++] = byteCode.getOpcode(); + + // "real" instruction that is widened + newRewrite[rewriteIndex++] = instruction; + + // Index bytes + setRewrite2Bytes(local, rewriteIndex, newRewrite); + rewriteIndex += 2; + + // constant bytes + setRewrite2Bytes(constWord, rewriteIndex, newRewrite); + rewriteIndex += 2; // not strictly necessary, but just in case + // something comes along later + + byteCode.setRewrite(newRewrite); + } +} diff --git a/src/main/java5/org/apache/harmony/pack200/Pack200Adapter.java b/src/main/java5/org/apache/harmony/pack200/Pack200Adapter.java new file mode 100644 index 0000000..e2b284c --- /dev/null +++ b/src/main/java5/org/apache/harmony/pack200/Pack200Adapter.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.util.SortedMap; +import java.util.TreeMap; + +/** + * Provides generic JavaBeans support for the Pack/UnpackAdapters + */ +public abstract class Pack200Adapter { + + protected static final int DEFAULT_BUFFER_SIZE = 8192; + + private final PropertyChangeSupport support = new PropertyChangeSupport(this); + + private final SortedMap properties = new TreeMap(); + + public SortedMap properties() { + return properties; + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + support.addPropertyChangeListener(listener); + } + + protected void firePropertyChange(String propertyName, Object oldValue, + Object newValue) { + support.firePropertyChange(propertyName, oldValue, newValue); + } + + public void removePropertyChangeListener(PropertyChangeListener listener) { + support.removePropertyChangeListener(listener); + } + + /** + * Completion between 0..1 + * @param value + */ + protected void completed(double value) { + firePropertyChange("pack.progress", null, String.valueOf((int)(100*value))); //$NON-NLS-1$ + } +} diff --git a/src/main/java5/org/apache/harmony/pack200/Pack200PackerAdapter.java b/src/main/java5/org/apache/harmony/pack200/Pack200PackerAdapter.java new file mode 100644 index 0000000..7059a3f --- /dev/null +++ b/src/main/java5/org/apache/harmony/pack200/Pack200PackerAdapter.java @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.jar.JarFile; +import java.util.jar.JarInputStream; +import java.util.jar.Pack200.Packer; + + +/** + * This class provides the binding between the standard Pack200 interface and the + * internal interface for (un)packing. As this uses generics for the SortedMap, + * this class must be compiled and run on a Java 1.5 system. However, Java 1.5 + * is not necessary to use the internal libraries for unpacking. + */ +public class Pack200PackerAdapter extends Pack200Adapter implements Packer { + + private final PackingOptions options = new PackingOptions(); + + public void pack(JarFile file, OutputStream out) throws IOException { + if (file == null || out == null) + throw new IllegalArgumentException( + "Must specify both input and output streams"); + completed(0); + try { + new org.apache.harmony.pack200.Archive(file, out, options).pack(); + } catch (Pack200Exception e) { + throw new IOException("Failed to pack Jar:" + String.valueOf(e)); + } + completed(1); + } + + public void pack(JarInputStream in, OutputStream out) throws IOException { + if (in == null || out == null) + throw new IllegalArgumentException( + "Must specify both input and output streams"); + completed(0); + PackingOptions options = new PackingOptions(); + + try { + new org.apache.harmony.pack200.Archive(in, out, options).pack(); + } catch (Pack200Exception e) { + throw new IOException("Failed to pack Jar:" + String.valueOf(e)); + } + completed(1); + in.close(); + } + + protected void firePropertyChange(String propertyName, Object oldValue, + Object newValue) { + super.firePropertyChange(propertyName, oldValue, newValue); + if(newValue != null && !newValue.equals(oldValue)) { + if (propertyName.startsWith(CLASS_ATTRIBUTE_PFX)) { + String attributeName = propertyName.substring(CLASS_ATTRIBUTE_PFX.length()); + options.addClassAttributeAction(attributeName, (String)newValue); + } else if (propertyName.startsWith(CODE_ATTRIBUTE_PFX)) { + String attributeName = propertyName.substring(CODE_ATTRIBUTE_PFX.length()); + options.addCodeAttributeAction(attributeName, (String)newValue); + } else if (propertyName.equals(DEFLATE_HINT)) { + options.setDeflateHint((String) newValue); + } else if (propertyName.equals(EFFORT)) { + options.setEffort(Integer.parseInt((String)newValue)); + } else if (propertyName.startsWith(FIELD_ATTRIBUTE_PFX)) { + String attributeName = propertyName.substring(FIELD_ATTRIBUTE_PFX.length()); + options.addFieldAttributeAction(attributeName, (String)newValue); + } else if (propertyName.equals(KEEP_FILE_ORDER)) { + options.setKeepFileOrder(Boolean.parseBoolean((String)newValue)); + } else if (propertyName.startsWith(METHOD_ATTRIBUTE_PFX)) { + String attributeName = propertyName.substring(METHOD_ATTRIBUTE_PFX.length()); + options.addMethodAttributeAction(attributeName, (String)newValue); + } else if (propertyName.equals(MODIFICATION_TIME)) { + options.setModificationTime((String)newValue); + } else if (propertyName.startsWith(PASS_FILE_PFX)) { + if(oldValue != null && !oldValue.equals("")) { + options.removePassFile((String)oldValue); + } + options.addPassFile((String) newValue); + } else if (propertyName.equals(SEGMENT_LIMIT)) { + options.setSegmentLimit(Long.parseLong((String)newValue)); + } else if (propertyName.equals(UNKNOWN_ATTRIBUTE)) { + options.setUnknownAttributeAction((String)newValue); + } + } + } + +} diff --git a/src/main/java5/org/apache/harmony/unpack200/Pack200UnpackerAdapter.java b/src/main/java5/org/apache/harmony/unpack200/Pack200UnpackerAdapter.java new file mode 100644 index 0000000..b51bd85 --- /dev/null +++ b/src/main/java5/org/apache/harmony/unpack200/Pack200UnpackerAdapter.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.jar.JarOutputStream; +import java.util.jar.Pack200.Unpacker; + +import org.apache.harmony.pack200.Pack200Adapter; +import org.apache.harmony.pack200.Pack200Exception; + +/** + * This class provides the binding between the standard Pack200 interface and + * the internal interface for (un)packing. As this uses generics for the + * SortedMap, this class must be compiled and run on a Java 1.5 system. However, + * Java 1.5 is not necessary to use the internal libraries for unpacking. + */ +public class Pack200UnpackerAdapter extends Pack200Adapter implements Unpacker { + /* + * (non-Javadoc) + * + * @see java.util.jar.Pack200.Unpacker#unpack(java.io.InputStream, + * java.util.jar.JarOutputStream) + */ + public void unpack(InputStream in, JarOutputStream out) throws IOException { + if (in == null || out == null) + throw new IllegalArgumentException( + "Must specify both input and output streams"); + completed(0); + try { + new Archive(in, out).unpack(); + } catch (Pack200Exception e) { + throw new IOException("Failed to unpack Jar:" + String.valueOf(e)); + } + completed(1); + in.close(); + } + + /* + * (non-Javadoc) + * + * @see java.util.jar.Pack200.Unpacker#unpack(java.io.File, + * java.util.jar.JarOutputStream) + */ + public void unpack(File file, JarOutputStream out) throws IOException { + if (file == null || out == null) + throw new IllegalArgumentException( + "Must specify both input and output streams"); + int size = (int) file.length(); + int bufferSize = (size > 0 && size < DEFAULT_BUFFER_SIZE ? size + : DEFAULT_BUFFER_SIZE); + InputStream in = new BufferedInputStream(new FileInputStream(file), + bufferSize); + unpack(in, out); + } +} diff --git a/src/test/java/org/apache/harmony/pack200/tests/ArchiveTest.java b/src/test/java/org/apache/harmony/pack200/tests/ArchiveTest.java new file mode 100644 index 0000000..02a69fa --- /dev/null +++ b/src/test/java/org/apache/harmony/pack200/tests/ArchiveTest.java @@ -0,0 +1,456 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200.tests; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.URISyntaxException; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.Archive; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.pack200.PackingOptions; +import org.apache.harmony.unpack200.Segment; + +public class ArchiveTest extends TestCase { + + JarFile in; + OutputStream out; + File file; + + public void testHelloWorld() throws IOException, Pack200Exception, URISyntaxException { + in = new JarFile(new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/hw.jar").toURI())); + file = File.createTempFile("helloworld", ".pack.gz"); + out = new FileOutputStream(file); + new Archive(in, out, null).pack(); + in.close(); + out.close(); + + // now unpack + InputStream in2 = new FileInputStream(file); + File file2 = File.createTempFile("helloworld", ".jar"); + JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2)); + org.apache.harmony.unpack200.Archive archive = new org.apache.harmony.unpack200.Archive( + in2, out2); + archive.unpack(); + out2.close(); + in2.close(); + + JarFile jarFile = new JarFile(file2); + file2.deleteOnExit(); + JarEntry entry = jarFile + .getJarEntry("org/apache/harmony/archive/tests/internal/pack200/HelloWorld.class"); + assertNotNull(entry); + InputStream ours = jarFile.getInputStream(entry); + + JarFile jarFile2 = new JarFile(new File(Segment.class.getResource( + "/org/apache/harmony/pack200/tests/hw.jar").toURI())); + JarEntry entry2 = jarFile2 + .getJarEntry("org/apache/harmony/archive/tests/internal/pack200/HelloWorld.class"); + assertNotNull(entry2); + + InputStream expected = jarFile2.getInputStream(entry2); + + BufferedReader reader1 = new BufferedReader(new InputStreamReader(ours)); + BufferedReader reader2 = new BufferedReader(new InputStreamReader( + expected)); + String line1 = reader1.readLine(); + String line2 = reader2.readLine(); + int i = 1; + while (line1 != null || line2 != null) { + assertEquals("Unpacked class files differ", line2, line1); + line1 = reader1.readLine(); + line2 = reader2.readLine(); + i++; + } + reader1.close(); + reader2.close(); + } + + public void testSQL() throws IOException, Pack200Exception, URISyntaxException { + in = new JarFile(new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI())); + file = File.createTempFile("sql", ".pack"); + out = new FileOutputStream(file); + PackingOptions options = new PackingOptions(); + options.setGzip(false); + Archive ar = new Archive(in, out, options); + ar.pack(); + in.close(); + out.close(); + + // now unpack + InputStream in2 = new FileInputStream(file); + File file2 = File.createTempFile("sqlout", ".jar"); + JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2)); + org.apache.harmony.unpack200.Archive archive = new org.apache.harmony.unpack200.Archive(in2, out2); + archive.unpack(); + JarFile jarFile = new JarFile(file2); + file2.deleteOnExit(); + + File compareFile = new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()); + JarFile jarFile2 = new JarFile(compareFile); + + assertEquals(jarFile2.size(), jarFile.size()); + + compareFiles(jarFile, jarFile2); + } + + public void testLargeClass() throws IOException, Pack200Exception, URISyntaxException { + in = new JarFile(new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/largeClassUnpacked.jar") + .toURI())); + file = File.createTempFile("largeClass", ".pack"); + out = new FileOutputStream(file); + PackingOptions options = new PackingOptions(); + options.setGzip(false); + new Archive(in, out, options).pack(); + in.close(); + out.close(); + + // now unpack + InputStream in2 = new FileInputStream(file); + File file2 = File.createTempFile("largeClassOut", ".jar"); + JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2)); + org.apache.harmony.unpack200.Archive archive = new org.apache.harmony.unpack200.Archive(in2, out2); + archive.unpack(); + JarFile jarFile = new JarFile(file2); + file2.deleteOnExit(); + + File compareFile = new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/largeClassUnpacked.jar").toURI()); + JarFile jarFile2 = new JarFile(compareFile); + + assertEquals(jarFile2.size(), jarFile.size()); + + compareFiles(jarFile, jarFile2); + } + + public void testJNDI() throws IOException, Pack200Exception, URISyntaxException { + in = new JarFile(new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/jndi.jar").toURI())); + file = File.createTempFile("jndi", ".pack"); + out = new FileOutputStream(file); + PackingOptions options = new PackingOptions(); + options.setGzip(false); + new Archive(in, out, options).pack(); + in.close(); + out.close(); + + // now unpack + InputStream in2 = new FileInputStream(file); + File file2 = File.createTempFile("jndiout", ".jar"); + JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2)); + org.apache.harmony.unpack200.Archive archive = new org.apache.harmony.unpack200.Archive(in2, out2); + archive.unpack(); + JarFile jarFile = new JarFile(file2); + file2.deleteOnExit(); + JarFile jarFile2 = new JarFile(new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/jndiUnpacked.jar").toURI())); + + compareFiles(jarFile, jarFile2); + } + + public void testSegmentLimits() throws IOException, Pack200Exception, + URISyntaxException { + in = new JarFile(new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/hw.jar").toURI())); + file = File.createTempFile("helloworld", ".pack.gz"); + out = new FileOutputStream(file); + PackingOptions options = new PackingOptions(); + options.setSegmentLimit(0); + Archive archive = new Archive(in, out, options); + archive.pack(); + in.close(); + out.close(); + + in = new JarFile(new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/hw.jar").toURI())); + file = File.createTempFile("helloworld", ".pack.gz"); + out = new FileOutputStream(file); + options = new PackingOptions(); + options.setSegmentLimit(-1); + archive = new Archive(in, out, options); + archive.pack(); + in.close(); + out.close(); + + in = new JarFile(new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/hw.jar").toURI())); + file = File.createTempFile("helloworld", ".pack.gz"); + out = new FileOutputStream(file); + options = new PackingOptions(); + options.setSegmentLimit(5000); + archive = new Archive(in, out, options); + archive.pack(); + in.close(); + out.close(); + } + + public void testStripDebug() throws IOException, Pack200Exception, URISyntaxException { + in = new JarFile(new File(Archive.class + .getResource("/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI())); + file = File.createTempFile("sql", ".pack"); + out = new FileOutputStream(file); + PackingOptions options = new PackingOptions(); + options.setGzip(false); + options.setStripDebug(true); + Archive archive = new Archive(in, out, options); + archive.pack(); + in.close(); + out.close(); + + // now unpack + InputStream in2 = new FileInputStream(file); + File file2 = File.createTempFile("sqloutNoDebug", ".jar"); + JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2)); + org.apache.harmony.unpack200.Archive u2archive = new org.apache.harmony.unpack200.Archive(in2, out2); + u2archive.unpack(); + + File compareFile = new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/sqlUnpackedNoDebug.jar").toURI()); + JarFile jarFile = new JarFile(file2); + assertTrue(file2.length() < 250000); + file2.deleteOnExit(); + + JarFile jarFile2 = new JarFile(compareFile); + + compareFiles(jarFile, jarFile2); + } + + public void testPassFiles() throws IOException, URISyntaxException, Pack200Exception { + // Don't pass any + in = new JarFile(new File(Archive.class + .getResource("/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI())); + File file0 = File.createTempFile("sql", ".pack"); + out = new FileOutputStream(file0); + PackingOptions options = new PackingOptions(); + options.setGzip(false); + Archive archive = new Archive(in, out, options); + archive.pack(); + in.close(); + out.close(); + + // Pass one file + in = new JarFile(new File(Archive.class + .getResource("/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI())); + file = File.createTempFile("sql", ".pack"); + out = new FileOutputStream(file); + options = new PackingOptions(); + options.setGzip(false); + options.addPassFile("bin/test/org/apache/harmony/sql/tests/java/sql/DatabaseMetaDataTest.class"); + assertTrue(options.isPassFile("bin/test/org/apache/harmony/sql/tests/java/sql/DatabaseMetaDataTest.class")); + archive = new Archive(in, out, options); + archive.pack(); + in.close(); + out.close(); + + // Pass a whole directory + in = new JarFile(new File(Archive.class + .getResource("/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI())); + File file2 = File.createTempFile("sql", ".pack"); + out = new FileOutputStream(file2); + options = new PackingOptions(); + options.setGzip(false); + options.addPassFile("bin/test/org/apache/harmony/sql/tests/java/sql"); + assertTrue(options.isPassFile("bin/test/org/apache/harmony/sql/tests/java/sql/DatabaseMetaDataTest.class")); + assertFalse(options.isPassFile("bin/test/org/apache/harmony/sql/tests/java/sqldata/SqlData.class")); + archive = new Archive(in, out, options); + archive.pack(); + in.close(); + out.close(); + + assertTrue("If files are passed then the pack file should be larger", file.length() > file0.length()); + assertTrue("If more files are passed then the pack file should be larger", file2.length() > file.length()); + + // now unpack + InputStream in2 = new FileInputStream(file); + File file3 = File.createTempFile("sql", ".jar"); + JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file3)); + org.apache.harmony.unpack200.Archive u2archive = new org.apache.harmony.unpack200.Archive(in2, out2); + u2archive.unpack(); + + File compareFile = new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()); + JarFile jarFile = new JarFile(file3); + file2.deleteOnExit(); + + JarFile jarFile2 = new JarFile(compareFile); + // Check that both jars have the same entries + compareJarEntries(jarFile, jarFile2); + + // now unpack the file with lots of passed files + InputStream in3 = new FileInputStream(file2); + File file4 = File.createTempFile("sql", ".jar"); + JarOutputStream out3 = new JarOutputStream(new FileOutputStream(file4)); + u2archive = new org.apache.harmony.unpack200.Archive(in3, out3); + u2archive.unpack(); + jarFile = new JarFile(file4); + jarFile2 = new JarFile(compareFile); + compareJarEntries(jarFile, jarFile2); + } + + public void testAnnotations() throws IOException, Pack200Exception, + URISyntaxException { + in = new JarFile(new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/annotationsUnpacked.jar") + .toURI())); + file = File.createTempFile("annotations", ".pack"); + out = new FileOutputStream(file); + PackingOptions options = new PackingOptions(); + options.setGzip(false); + new Archive(in, out, options).pack(); + in.close(); + out.close(); + + // now unpack + InputStream in2 = new FileInputStream(file); + File file2 = File.createTempFile("annotationsout", ".jar"); + JarOutputStream out2 = new JarOutputStream(new FileOutputStream(file2)); + org.apache.harmony.unpack200.Archive archive = new org.apache.harmony.unpack200.Archive( + in2, out2); + archive.unpack(); + JarFile jarFile = new JarFile(file2); + file2.deleteOnExit(); + JarFile jarFile2 = new JarFile(new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/annotationsUnpacked.jar").toURI())); + + compareFiles(jarFile, jarFile2); + } + + public void testE0() throws Pack200Exception, IOException, URISyntaxException { + File f1 = new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/jndi.jar").toURI()); + in = new JarFile(f1); + file = File.createTempFile("jndiE0", ".pack"); + out = new FileOutputStream(file); + PackingOptions options = new PackingOptions(); + options.setGzip(false); + options.setEffort(0); + Archive archive = new Archive(in, out, options); + archive.pack(); + in.close(); + out.close(); + compareFiles(new JarFile(f1), new JarFile(file)); + + } + +// public void testE0again() throws IOException, Pack200Exception, URISyntaxException { +// JarInputStream inputStream = new JarInputStream(Archive.class.getResourceAsStream("/org/apache/harmony/pack200/tests/jndi.jar")); +// file = File.createTempFile("jndiE0", ".pack"); +// out = new FileOutputStream(file); +// Archive archive = new Archive(inputStream, out, false); +// archive.setEffort(0); +// archive.pack(); +// inputStream.close(); +// out.close(); +// in = new JarFile(new File(Archive.class.getResource( +// "/org/apache/harmony/pack200/tests/jndi.jar").toURI())); +// compareFiles(in, new JarFile(file)); +// } + + public void testMultipleJars() throws URISyntaxException, IOException, Pack200Exception { + File folder = new File(Archive.class + .getResource("/org/apache/harmony/pack200/tests/jars").toURI()); + String[] children = folder.list(); + for (int i = 0; i < children.length; i++) { + if(children[i].endsWith(".jar") && !children[i].endsWith("Unpacked.jar")) { + File inputFile = new File(folder, children[i]); + in = new JarFile(inputFile); + file = File.createTempFile("temp", ".pack.gz"); + out = new FileOutputStream(file); +// System.out.println("packing " + children[i]); + new Archive(in, out, null).pack(); + in.close(); + out.close(); + + // unpack and compare + + } + } + } + + private void compareJarEntries(JarFile jarFile, JarFile jarFile2) + throws IOException { + Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) { + + JarEntry entry = (JarEntry) entries.nextElement(); + assertNotNull(entry); + + String name = entry.getName(); + JarEntry entry2 = jarFile2.getJarEntry(name); + assertNotNull("Missing Entry: " + name, entry2); + } + } + + private void compareFiles(JarFile jarFile, JarFile jarFile2) + throws IOException { + Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) { + + JarEntry entry = (JarEntry) entries.nextElement(); + assertNotNull(entry); + + String name = entry.getName(); + JarEntry entry2 = jarFile2.getJarEntry(name); + assertNotNull("Missing Entry: " + name, entry2); +// assertEquals(entry.getTime(), entry2.getTime()); + if (!name.equals("META-INF/MANIFEST.MF")) { // Manifests aren't + // necessarily + // byte-for-byte + // identical + + InputStream ours = jarFile.getInputStream(entry); + InputStream expected = jarFile2.getInputStream(entry2); + + BufferedReader reader1 = new BufferedReader( + new InputStreamReader(ours)); + BufferedReader reader2 = new BufferedReader( + new InputStreamReader(expected)); + String line1 = reader1.readLine(); + String line2 = reader2.readLine(); + int i = 1; + while (line1 != null || line2 != null) { + assertEquals("Unpacked files differ for " + name, line2, + line1); + line1 = reader1.readLine(); + line2 = reader2.readLine(); + i++; + } + reader1.close(); + reader2.close(); + } + } + jarFile.close(); + jarFile2.close(); + } + +} diff --git a/src/test/java/org/apache/harmony/pack200/tests/BHSDCodecTest.java b/src/test/java/org/apache/harmony/pack200/tests/BHSDCodecTest.java new file mode 100644 index 0000000..90afcf2 --- /dev/null +++ b/src/test/java/org/apache/harmony/pack200/tests/BHSDCodecTest.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200.tests; + +import java.io.ByteArrayInputStream; +import java.io.EOFException; +import java.io.IOException; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.BHSDCodec; +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.CodecEncoding; +import org.apache.harmony.pack200.Pack200Exception; + +/** + * Tests for BHSDCodec + */ +public class BHSDCodecTest extends TestCase { + + public void testEncodeDecode() throws IOException, Pack200Exception { + for (int i = 1; i < 116; i++) { + + BHSDCodec codec = (BHSDCodec) CodecEncoding.getCodec(i, null, null); + + if (!codec.isDelta()) { + // Test encode-decode with a selection of numbers within the + // range of the codec + long largest = codec.largest(); + long smallest = codec.isSigned() ? codec.smallest() : 0; + if(smallest < Integer.MIN_VALUE) smallest = Integer.MIN_VALUE; + long difference = (largest - smallest) / 4; + for (long j = smallest; j <= largest; j += difference) { + if(j > Integer.MAX_VALUE) { + break; + } + byte[] encoded = codec.encode((int)j, 0); + long decoded = 0; + try { + decoded = codec.decode( + new ByteArrayInputStream(encoded), 0); + } catch (EOFException e) { + System.out.println(e); + } + if (j != decoded) { + fail("Failed with codec: " + i + ", " + codec + + " expected: " + j + ", got: " + decoded); + } + } + } + + // Test encode-decode with 0 + assertEquals(0, codec.decode(new ByteArrayInputStream(codec.encode( + 0, 0)), 0)); + } + } + + public void testDeltaEncodings() throws IOException, Pack200Exception { + Codec c = Codec.UDELTA5; + int[] sequence = new int[] {0, 2, 4, 2, 2, 4}; + byte[] encoded = c.encode(sequence); + int[] decoded = c.decodeInts(6, new ByteArrayInputStream(encoded)); + for (int i = 0; i < decoded.length; i++) { + assertEquals(sequence[i], decoded[i]); + } + } + +} \ No newline at end of file diff --git a/src/test/java/org/apache/harmony/pack200/tests/CodecEncodingTest.java b/src/test/java/org/apache/harmony/pack200/tests/CodecEncodingTest.java new file mode 100644 index 0000000..94f61e1 --- /dev/null +++ b/src/test/java/org/apache/harmony/pack200/tests/CodecEncodingTest.java @@ -0,0 +1,311 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200.tests; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.BHSDCodec; +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.CodecEncoding; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.pack200.PopulationCodec; +import org.apache.harmony.pack200.RunCodec; + +/** + * + */ +public class CodecEncodingTest extends TestCase { + + public void testCanonicalEncodings() throws IOException, Pack200Exception { + Codec defaultCodec = new BHSDCodec(2, 16, 0, 0); + assertEquals(defaultCodec, CodecEncoding + .getCodec(0, null, defaultCodec)); + Map map = new HashMap(); + // These are the canonical encodings specified by the Pack200 spec + map.put(new Integer(1), "(1,256)"); + map.put(new Integer(2), "(1,256,1)"); + map.put(new Integer(3), "(1,256,0,1)"); + map.put(new Integer(4), "(1,256,1,1)"); + map.put(new Integer(5), "(2,256)"); + map.put(new Integer(6), "(2,256,1)"); + map.put(new Integer(7), "(2,256,0,1)"); + map.put(new Integer(8), "(2,256,1,1)"); + map.put(new Integer(9), "(3,256)"); + map.put(new Integer(10), "(3,256,1)"); + map.put(new Integer(11), "(3,256,0,1)"); + map.put(new Integer(12), "(3,256,1,1)"); + map.put(new Integer(13), "(4,256)"); + map.put(new Integer(14), "(4,256,1)"); + map.put(new Integer(15), "(4,256,0,1)"); + map.put(new Integer(16), "(4,256,1,1)"); + map.put(new Integer(17), "(5,4)"); + map.put(new Integer(18), "(5,4,1)"); + map.put(new Integer(19), "(5,4,2)"); + map.put(new Integer(20), "(5,16)"); + map.put(new Integer(21), "(5,16,1)"); + map.put(new Integer(22), "(5,16,2)"); + map.put(new Integer(23), "(5,32)"); + map.put(new Integer(24), "(5,32,1)"); + map.put(new Integer(25), "(5,32,2)"); + map.put(new Integer(26), "(5,64)"); + map.put(new Integer(27), "(5,64,1)"); + map.put(new Integer(28), "(5,64,2)"); + map.put(new Integer(29), "(5,128)"); + map.put(new Integer(30), "(5,128,1)"); + map.put(new Integer(31), "(5,128,2)"); + map.put(new Integer(32), "(5,4,0,1)"); + map.put(new Integer(33), "(5,4,1,1)"); + map.put(new Integer(34), "(5,4,2,1)"); + map.put(new Integer(35), "(5,16,0,1)"); + map.put(new Integer(36), "(5,16,1,1)"); + map.put(new Integer(37), "(5,16,2,1)"); + map.put(new Integer(38), "(5,32,0,1)"); + map.put(new Integer(39), "(5,32,1,1)"); + map.put(new Integer(40), "(5,32,2,1)"); + map.put(new Integer(41), "(5,64,0,1)"); + map.put(new Integer(42), "(5,64,1,1)"); + map.put(new Integer(43), "(5,64,2,1)"); + map.put(new Integer(44), "(5,128,0,1)"); + map.put(new Integer(45), "(5,128,1,1)"); + map.put(new Integer(46), "(5,128,2,1)"); + map.put(new Integer(47), "(2,192)"); + map.put(new Integer(48), "(2,224)"); + map.put(new Integer(49), "(2,240)"); + map.put(new Integer(50), "(2,248)"); + map.put(new Integer(51), "(2,252)"); + map.put(new Integer(52), "(2,8,0,1)"); + map.put(new Integer(53), "(2,8,1,1)"); + map.put(new Integer(54), "(2,16,0,1)"); + map.put(new Integer(55), "(2,16,1,1)"); + map.put(new Integer(56), "(2,32,0,1)"); + map.put(new Integer(57), "(2,32,1,1)"); + map.put(new Integer(58), "(2,64,0,1)"); + map.put(new Integer(59), "(2,64,1,1)"); + map.put(new Integer(60), "(2,128,0,1)"); + map.put(new Integer(61), "(2,128,1,1)"); + map.put(new Integer(62), "(2,192,0,1)"); + map.put(new Integer(63), "(2,192,1,1)"); + map.put(new Integer(64), "(2,224,0,1)"); + map.put(new Integer(65), "(2,224,1,1)"); + map.put(new Integer(66), "(2,240,0,1)"); + map.put(new Integer(67), "(2,240,1,1)"); + map.put(new Integer(68), "(2,248,0,1)"); + map.put(new Integer(69), "(2,248,1,1)"); + map.put(new Integer(70), "(3,192)"); + map.put(new Integer(71), "(3,224)"); + map.put(new Integer(72), "(3,240)"); + map.put(new Integer(73), "(3,248)"); + map.put(new Integer(74), "(3,252)"); + map.put(new Integer(75), "(3,8,0,1)"); + map.put(new Integer(76), "(3,8,1,1)"); + map.put(new Integer(77), "(3,16,0,1)"); + map.put(new Integer(78), "(3,16,1,1)"); + map.put(new Integer(79), "(3,32,0,1)"); + map.put(new Integer(80), "(3,32,1,1)"); + map.put(new Integer(81), "(3,64,0,1)"); + map.put(new Integer(82), "(3,64,1,1)"); + map.put(new Integer(83), "(3,128,0,1)"); + map.put(new Integer(84), "(3,128,1,1)"); + map.put(new Integer(85), "(3,192,0,1)"); + map.put(new Integer(86), "(3,192,1,1)"); + map.put(new Integer(87), "(3,224,0,1)"); + map.put(new Integer(88), "(3,224,1,1)"); + map.put(new Integer(89), "(3,240,0,1)"); + map.put(new Integer(90), "(3,240,1,1)"); + map.put(new Integer(91), "(3,248,0,1)"); + map.put(new Integer(92), "(3,248,1,1)"); + map.put(new Integer(93), "(4,192)"); + map.put(new Integer(94), "(4,224)"); + map.put(new Integer(95), "(4,240)"); + map.put(new Integer(96), "(4,248)"); + map.put(new Integer(97), "(4,252)"); + map.put(new Integer(98), "(4,8,0,1)"); + map.put(new Integer(99), "(4,8,1,1)"); + map.put(new Integer(100), "(4,16,0,1)"); + map.put(new Integer(101), "(4,16,1,1)"); + map.put(new Integer(102), "(4,32,0,1)"); + map.put(new Integer(103), "(4,32,1,1)"); + map.put(new Integer(104), "(4,64,0,1)"); + map.put(new Integer(105), "(4,64,1,1)"); + map.put(new Integer(106), "(4,128,0,1)"); + map.put(new Integer(107), "(4,128,1,1)"); + map.put(new Integer(108), "(4,192,0,1)"); + map.put(new Integer(109), "(4,192,1,1)"); + map.put(new Integer(110), "(4,224,0,1)"); + map.put(new Integer(111), "(4,224,1,1)"); + map.put(new Integer(112), "(4,240,0,1)"); + map.put(new Integer(113), "(4,240,1,1)"); + map.put(new Integer(114), "(4,248,0,1)"); + map.put(new Integer(115), "(4,248,1,1)"); + for (int i = 1; i <= 115; i++) { + assertEquals(map.get(new Integer(i)), CodecEncoding.getCodec(i, + null, null).toString()); + } + } + + public void testArbitraryCodec() throws IOException, Pack200Exception { + assertEquals("(1,256)", CodecEncoding.getCodec(116, + new ByteArrayInputStream(new byte[] { 0x00, (byte) 0xFF }), + null).toString()); + assertEquals("(5,128,2,1)", CodecEncoding.getCodec(116, + new ByteArrayInputStream(new byte[] { 0x25, (byte) 0x7F }), + null).toString()); + assertEquals("(2,128,1,1)", CodecEncoding.getCodec(116, + new ByteArrayInputStream(new byte[] { 0x0B, (byte) 0x7F }), + null).toString()); + } + + public void testGetSpecifier() throws IOException, Pack200Exception { + // Test canonical codecs + for (int i = 1; i <= 115; i++) { + assertEquals(i, CodecEncoding.getSpecifier(CodecEncoding.getCodec(i, null, null), null)[0]); + } + + // Test a range of non-canonical codecs + Codec c1 = new BHSDCodec(2, 125, 0, 1); + int[] specifiers = CodecEncoding.getSpecifier(c1, null); + assertEquals(3, specifiers.length); + assertEquals(116, specifiers[0]); + byte[] bytes = new byte[] {(byte) specifiers[1], (byte) specifiers[2]}; + InputStream in = new ByteArrayInputStream(bytes); + assertEquals(c1, CodecEncoding.getCodec(116, in, null)); + + c1 = new BHSDCodec(3, 125, 2, 1); + specifiers = CodecEncoding.getSpecifier(c1, null); + assertEquals(3, specifiers.length); + assertEquals(116, specifiers[0]); + bytes = new byte[] {(byte) specifiers[1], (byte) specifiers[2]}; + in = new ByteArrayInputStream(bytes); + assertEquals(c1, CodecEncoding.getCodec(116, in, null)); + + c1 = new BHSDCodec(4, 125); + specifiers = CodecEncoding.getSpecifier(c1, null); + assertEquals(3, specifiers.length); + assertEquals(116, specifiers[0]); + bytes = new byte[] {(byte) specifiers[1], (byte) specifiers[2]}; + in = new ByteArrayInputStream(bytes); + assertEquals(c1, CodecEncoding.getCodec(116, in, null)); + + c1 = new BHSDCodec(5, 125, 2, 0); + specifiers = CodecEncoding.getSpecifier(c1, null); + assertEquals(3, specifiers.length); + assertEquals(116, specifiers[0]); + bytes = new byte[] {(byte) specifiers[1], (byte) specifiers[2]}; + in = new ByteArrayInputStream(bytes); + assertEquals(c1, CodecEncoding.getCodec(116, in, null)); + + c1 = new BHSDCodec(3, 5, 2, 1); + specifiers = CodecEncoding.getSpecifier(c1, null); + assertEquals(3, specifiers.length); + assertEquals(116, specifiers[0]); + bytes = new byte[] {(byte) specifiers[1], (byte) specifiers[2]}; + in = new ByteArrayInputStream(bytes); + assertEquals(c1, CodecEncoding.getCodec(116, in, null)); + } + + public void testGetSpeciferForRunCodec() throws Pack200Exception, IOException { + RunCodec runCodec = new RunCodec(25, Codec.DELTA5, Codec.BYTE1); + int[] specifiers = CodecEncoding.getSpecifier(runCodec, null); + assertTrue(specifiers[0] > 116); + assertTrue(specifiers[0] < 141); + byte[] bytes = new byte[specifiers.length - 1]; + for (int i = 0; i < bytes.length; i++) { + bytes[i] = (byte) specifiers[i+1]; + } + InputStream in = new ByteArrayInputStream(bytes); + RunCodec runCodec2 = (RunCodec) CodecEncoding.getCodec(specifiers[0], in, null); + assertEquals(runCodec.getK(), runCodec2.getK()); + assertEquals(runCodec.getACodec(), runCodec2.getACodec()); + assertEquals(runCodec.getBCodec(), runCodec2.getBCodec()); + + // One codec is the same as the default + runCodec = new RunCodec(4096, Codec.DELTA5, Codec.BYTE1); + specifiers = CodecEncoding.getSpecifier(runCodec, Codec.DELTA5); + assertTrue(specifiers[0] > 116); + assertTrue(specifiers[0] < 141); + bytes = new byte[specifiers.length - 1]; + for (int i = 0; i < bytes.length; i++) { + bytes[i] = (byte) specifiers[i+1]; + } + in = new ByteArrayInputStream(bytes); + runCodec2 = (RunCodec) CodecEncoding.getCodec(specifiers[0], in, Codec.DELTA5); + assertEquals(runCodec.getK(), runCodec2.getK()); + assertEquals(runCodec.getACodec(), runCodec2.getACodec()); + assertEquals(runCodec.getBCodec(), runCodec2.getBCodec()); + + // Nested run codecs + runCodec = new RunCodec(64, Codec.SIGNED5, new RunCodec(25, Codec.UDELTA5, Codec.DELTA5)); + specifiers = CodecEncoding.getSpecifier(runCodec, null); + assertTrue(specifiers[0] > 116); + assertTrue(specifiers[0] < 141); + bytes = new byte[specifiers.length - 1]; + for (int i = 0; i < bytes.length; i++) { + bytes[i] = (byte) specifiers[i+1]; + } + in = new ByteArrayInputStream(bytes); + runCodec2 = (RunCodec) CodecEncoding.getCodec(specifiers[0], in, null); + assertEquals(runCodec.getK(), runCodec2.getK()); + assertEquals(runCodec.getACodec(), runCodec2.getACodec()); + RunCodec bCodec = (RunCodec) runCodec.getBCodec(); + RunCodec bCodec2 = (RunCodec) runCodec2.getBCodec(); + assertEquals(bCodec.getK(), bCodec2.getK()); + assertEquals(bCodec.getACodec(), bCodec2.getACodec()); + assertEquals(bCodec.getBCodec(), bCodec2.getBCodec()); + + // Nested with one the same as the default + runCodec = new RunCodec(64, Codec.SIGNED5, new RunCodec(25, Codec.UDELTA5, Codec.DELTA5)); + specifiers = CodecEncoding.getSpecifier(runCodec, Codec.UDELTA5); + assertTrue(specifiers[0] > 116); + assertTrue(specifiers[0] < 141); + bytes = new byte[specifiers.length - 1]; + for (int i = 0; i < bytes.length; i++) { + bytes[i] = (byte) specifiers[i+1]; + } + in = new ByteArrayInputStream(bytes); + runCodec2 = (RunCodec) CodecEncoding.getCodec(specifiers[0], in, Codec.UDELTA5); + assertEquals(runCodec.getK(), runCodec2.getK()); + assertEquals(runCodec.getACodec(), runCodec2.getACodec()); + bCodec = (RunCodec) runCodec.getBCodec(); + bCodec2 = (RunCodec) runCodec2.getBCodec(); + assertEquals(bCodec.getK(), bCodec2.getK()); + assertEquals(bCodec.getACodec(), bCodec2.getACodec()); + assertEquals(bCodec.getBCodec(), bCodec2.getBCodec()); + } + + public void testGetSpeciferForPopulationCodec() throws IOException, Pack200Exception { + PopulationCodec pCodec = new PopulationCodec(Codec.BYTE1, Codec.CHAR3, Codec.UNSIGNED5); + int[] specifiers = CodecEncoding.getSpecifier(pCodec, null); + assertTrue(specifiers[0] > 140); + assertTrue(specifiers[0] < 189); + byte[] bytes = new byte[specifiers.length - 1]; + for (int i = 0; i < bytes.length; i++) { + bytes[i] = (byte) specifiers[i+1]; + } + InputStream in = new ByteArrayInputStream(bytes); + PopulationCodec pCodec2 = (PopulationCodec) CodecEncoding.getCodec(specifiers[0], in, null); + assertEquals(pCodec.getFavouredCodec(), pCodec2.getFavouredCodec()); + assertEquals(pCodec.getTokenCodec(), pCodec2.getTokenCodec()); + assertEquals(pCodec.getUnfavouredCodec(), pCodec2.getUnfavouredCodec()); + } + +} diff --git a/src/test/java/org/apache/harmony/pack200/tests/CodecTest.java b/src/test/java/org/apache/harmony/pack200/tests/CodecTest.java new file mode 100644 index 0000000..25818bd --- /dev/null +++ b/src/test/java/org/apache/harmony/pack200/tests/CodecTest.java @@ -0,0 +1,253 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200.tests; + +import java.io.ByteArrayInputStream; +import java.io.EOFException; +import java.io.IOException; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.BHSDCodec; +import org.apache.harmony.pack200.CanonicalCodecFamilies; +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.pack200.RunCodec; + +/** + * + */ +public class CodecTest extends TestCase { + + public void testInvalidCodings() { + for (int i = 0; i < 256; i++) { + try { + new BHSDCodec(1, i); + fail("b=1 -> h=256"); + } catch (IllegalArgumentException e) { + assertTrue(true); + } + } + for (int i = 1; i <= 5; i++) { + try { + new BHSDCodec(i, 256); + if (i == 5) + fail("h=256 -> b!=5"); + } catch (IllegalArgumentException e) { + assertTrue(true); + } + } + + } + + public void testCodecToString() { + assertEquals("(1,256)", Codec.BYTE1.toString()); + assertEquals("(3,128)", Codec.CHAR3.toString()); + assertEquals("(5,4)", Codec.BCI5.toString()); + assertEquals("(5,4,2)", Codec.BRANCH5.toString()); + assertEquals("(5,64)", Codec.UNSIGNED5.toString()); + assertEquals("(5,64,1)", Codec.SIGNED5.toString()); + assertEquals("(5,64,0,1)", Codec.UDELTA5.toString()); + assertEquals("(5,64,1,1)", Codec.DELTA5.toString()); + assertEquals("(5,64,2,1)", Codec.MDELTA5.toString()); + assertEquals("(5,64)", Codec.UNSIGNED5.toString()); + assertEquals("(5,64,1)", Codec.SIGNED5.toString()); + assertEquals("(5,64,1,1)", Codec.DELTA5.toString()); + assertEquals("(5,64,2,1)", Codec.MDELTA5.toString()); + } + + public void testByte1() throws Exception { + for (int i = 0; i < 255; i++) + decode(Codec.BYTE1, new byte[] { (byte) i }, i, 0); + } + + public void testByte1Delta() throws Exception { + Codec BYTE1D = new BHSDCodec(1, 256, 0, 1); + long last = 0; + for (int i = 1; i < 255; i++) + last = decode(BYTE1D, new byte[] { (byte) 1 }, i, last); + } + + public void testByte1DeltaException() throws Exception { + Codec BYTE1D = new BHSDCodec(1, 256, 0, 1); + try { + BYTE1D.decode(new ByteArrayInputStream(new byte[] { (byte) 1 })); + fail("Decoding with a delta stream and not passing a last value should throw exception"); + } catch (Pack200Exception e) { + assertTrue(true); + } + } + + public void testByte1Signed() throws Exception { + Codec BYTE1S2 = new BHSDCodec(1, 256, 2); + decode(BYTE1S2, new byte[] { 0 }, 0, 0); + decode(BYTE1S2, new byte[] { 1 }, 1, 0); + decode(BYTE1S2, new byte[] { 2 }, 2, 0); + decode(BYTE1S2, new byte[] { 3 }, -1, 0); + decode(BYTE1S2, new byte[] { 4 }, 3, 0); + decode(BYTE1S2, new byte[] { 5 }, 4, 0); + decode(BYTE1S2, new byte[] { 6 }, 5, 0); + decode(BYTE1S2, new byte[] { 7 }, -2, 0); + decode(BYTE1S2, new byte[] { 8 }, 6, 0); + decode(BYTE1S2, new byte[] { 9 }, 7, 0); + decode(BYTE1S2, new byte[] { 10 }, 8, 0); + decode(BYTE1S2, new byte[] { 11 }, -3, 0); + } + + public void testCardinality() throws Exception { + BHSDCodec byte1 = Codec.BYTE1; + assertEquals(256, byte1.cardinality()); + assertEquals(0, byte1.smallest()); + assertEquals(255, byte1.largest()); + assertFalse(byte1.encodes(-257)); + assertFalse(byte1.encodes(-256)); + assertFalse(byte1.encodes(-255)); + assertFalse(byte1.encodes(-129)); + assertFalse(byte1.encodes(-128)); + assertFalse(byte1.encodes(-127)); + assertFalse(byte1.encodes(-1)); + assertTrue(byte1.encodes(0)); + assertTrue(byte1.encodes(1)); + assertTrue(byte1.encodes(255)); + assertFalse(byte1.encodes(256)); + BHSDCodec byte1s = new BHSDCodec(1, 256, 1); + assertEquals(256, byte1s.cardinality()); + assertEquals(-128, byte1s.smallest()); + assertEquals(127, byte1s.largest()); + assertFalse(byte1s.encodes(-257)); + assertFalse(byte1s.encodes(-256)); + assertFalse(byte1s.encodes(-255)); + assertFalse(byte1s.encodes(-129)); + assertTrue(byte1s.encodes(-128)); + assertTrue(byte1s.encodes(-127)); + assertTrue(byte1s.encodes(-1)); + assertTrue(byte1s.encodes(0)); + assertTrue(byte1s.encodes(1)); + assertTrue(byte1s.encodes(127)); + assertFalse(byte1s.encodes(128)); + assertFalse(byte1s.encodes(129)); + assertFalse(byte1s.encodes(255)); + assertFalse(byte1s.encodes(256)); + BHSDCodec byte2s = new BHSDCodec(1, 256, 2); + assertEquals(256, byte2s.cardinality()); + assertEquals(-64, byte2s.smallest()); + assertEquals(191, byte2s.largest()); + assertFalse(byte2s.encodes(-257)); + assertFalse(byte2s.encodes(-256)); + assertFalse(byte2s.encodes(-255)); + assertFalse(byte2s.encodes(-129)); + assertFalse(byte2s.encodes(-128)); + assertFalse(byte2s.encodes(-127)); + assertFalse(byte2s.encodes(-65)); + assertTrue(byte2s.encodes(-64)); + assertTrue(byte2s.encodes(-64)); + assertTrue(byte2s.encodes(-1)); + assertTrue(byte2s.encodes(0)); + assertTrue(byte2s.encodes(1)); + assertTrue(byte2s.encodes(127)); + assertTrue(byte2s.encodes(128)); + assertTrue(byte2s.encodes(191)); + assertFalse(byte2s.encodes(192)); + assertFalse(byte2s.encodes(256)); + } + + public void testRunCodec() throws Exception { + RunCodec runCodec = new RunCodec(1, Codec.UNSIGNED5, Codec.BYTE1); + ByteArrayInputStream bais = new ByteArrayInputStream(new byte[] { + (byte) 192, 0, (byte) 192, 0 }); + assertEquals(192, runCodec.decode(bais)); + assertEquals(192, runCodec.decode(bais)); + assertEquals(0, runCodec.decode(bais)); + assertEquals(0, bais.available()); + runCodec = new RunCodec(1, Codec.BYTE1, Codec.UNSIGNED5); + bais = new ByteArrayInputStream(new byte[] { (byte) 192, 0, (byte) 192, + 0 }); + assertEquals(192, runCodec.decode(bais)); + assertEquals(0, runCodec.decode(bais)); + assertEquals(192, runCodec.decode(bais)); + assertEquals(0, bais.available()); + } + + public void testUnsigned5() throws Exception { + decode(Codec.UNSIGNED5, new byte[] { 1 }, 1, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 191 }, 191, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 192, 0 }, 192, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 193, 0 }, 193, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 255, 0 }, 255, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 192, 1 }, 256, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 192, 5 }, 512, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 192, 13 }, 1024, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 192, 29 }, 2048, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 255, (byte) 191 }, 12479, 0); + + decode(Codec.UNSIGNED5, new byte[] { (byte) 192, (byte) 192, 0 }, + 12480, 0); + decode(Codec.UNSIGNED5, + new byte[] { (byte) 255, (byte) 255, (byte) 191 }, 798911, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 192, (byte) 192, + (byte) 192, 0 }, 798912, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 255, (byte) 255, + (byte) 255, (byte) 191 }, 51130559, 0); + decode(Codec.UNSIGNED5, new byte[] { (byte) 192, (byte) 192, + (byte) 192, (byte) 192, 0 }, 51130560, 0); + decodeFail(Codec.UNSIGNED5, new byte[] { (byte) 192 }); + decodeFail(Codec.UNSIGNED5, new byte[] { (byte) 192, (byte) 192 }); + decodeFail(Codec.UNSIGNED5, new byte[] { (byte) 192, (byte) 192, + (byte) 192 }); + decodeFail(Codec.UNSIGNED5, new byte[] { (byte) 192, (byte) 192, + (byte) 192, (byte) 192 }); + } + public void testCodecFamilies() { + checkAscendingCardinalities(CanonicalCodecFamilies.nonDeltaUnsignedCodecs1); + checkAscendingCardinalities(CanonicalCodecFamilies.nonDeltaUnsignedCodecs2); + checkAscendingCardinalities(CanonicalCodecFamilies.nonDeltaUnsignedCodecs3); + checkAscendingCardinalities(CanonicalCodecFamilies.nonDeltaUnsignedCodecs4); + checkAscendingCardinalities(CanonicalCodecFamilies.nonDeltaUnsignedCodecs5); + checkAscendingCardinalities(CanonicalCodecFamilies.deltaUnsignedCodecs1); + checkAscendingCardinalities(CanonicalCodecFamilies.deltaUnsignedCodecs2); + checkAscendingCardinalities(CanonicalCodecFamilies.deltaUnsignedCodecs3); + checkAscendingCardinalities(CanonicalCodecFamilies.deltaUnsignedCodecs4); + checkAscendingCardinalities(CanonicalCodecFamilies.deltaUnsignedCodecs5); + } + + private void checkAscendingCardinalities(BHSDCodec[] family) { + for (int i = 1; i < family.length; i++) { + BHSDCodec previous = family[i-1]; + BHSDCodec codec = family[i]; + assertTrue(codec.largest() >= previous.largest()); + assertTrue(codec.smallest() <= previous.smallest()); + } + } + + private void decodeFail(final Codec codec, final byte[] data) + throws IOException, Pack200Exception { + try { + decode(codec, data, 0, 0); + fail("Should have detected an EOFException"); + } catch (EOFException e) { + assertTrue(true); + } + } + + private long decode(final Codec codec, final byte[] data, final long value, + final long last) throws IOException, Pack200Exception { + final ByteArrayInputStream in = new ByteArrayInputStream(data); + assertEquals(value, codec.decode(in, last)); + assertEquals(-1, in.read()); + return (value); + } +} diff --git a/src/test/java/org/apache/harmony/pack200/tests/HelloWorld.java b/src/test/java/org/apache/harmony/pack200/tests/HelloWorld.java new file mode 100644 index 0000000..76ba7b0 --- /dev/null +++ b/src/test/java/org/apache/harmony/pack200/tests/HelloWorld.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200.tests; + +/** + * This is intended to be used as a test class for unpacking a packed Jar file. + */ +public class HelloWorld { + + int i = 97, j = 42, k = 12345; + float f = 3.142f, g = 2.718f; + long l = 299792458; + double d = 4.0d; + + public static void main(String[] args) { + System.out.println("Hello world"); + } + + public HelloWorld[][] method(int a, int b, int c) { + return null; + } +} diff --git a/src/test/java/org/apache/harmony/pack200/tests/NewAttributeBandsTest.java b/src/test/java/org/apache/harmony/pack200/tests/NewAttributeBandsTest.java new file mode 100644 index 0000000..51ff186 --- /dev/null +++ b/src/test/java/org/apache/harmony/pack200/tests/NewAttributeBandsTest.java @@ -0,0 +1,263 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200.tests; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.AttributeDefinitionBands; +import org.apache.harmony.pack200.CPUTF8; +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.CpBands; +import org.apache.harmony.pack200.NewAttribute; +import org.apache.harmony.pack200.NewAttributeBands; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.pack200.SegmentHeader; +import org.apache.harmony.pack200.AttributeDefinitionBands.AttributeDefinition; +import org.apache.harmony.pack200.NewAttributeBands.Call; +import org.apache.harmony.pack200.NewAttributeBands.Callable; +import org.apache.harmony.pack200.NewAttributeBands.Integral; +import org.apache.harmony.pack200.NewAttributeBands.Reference; +import org.apache.harmony.pack200.NewAttributeBands.Replication; +import org.apache.harmony.pack200.NewAttributeBands.Union; +import org.apache.harmony.pack200.NewAttributeBands.UnionCase; + +/** + * Tests for pack200 support for non-predefined attributes + */ +public class NewAttributeBandsTest extends TestCase { + + public void testEmptyLayout() throws IOException { + CPUTF8 name = new CPUTF8("TestAttribute"); + CPUTF8 layout = new CPUTF8(""); + MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(1, + null, null, new AttributeDefinition(35, + AttributeDefinitionBands.CONTEXT_CLASS, name, layout)); + List layoutElements = newAttributeBands.getLayoutElements(); + assertEquals(0, layoutElements.size()); + } + + public void testIntegralLayouts() throws IOException { + tryIntegral("B"); + tryIntegral("FB"); + tryIntegral("SB"); + tryIntegral("H"); + tryIntegral("FH"); + tryIntegral("SH"); + tryIntegral("I"); + tryIntegral("FI"); + tryIntegral("SI"); + tryIntegral("PB"); + tryIntegral("OB"); + tryIntegral("OSB"); + tryIntegral("POB"); + tryIntegral("PH"); + tryIntegral("OH"); + tryIntegral("OSH"); + tryIntegral("POH"); + tryIntegral("PI"); + tryIntegral("OI"); + tryIntegral("OSI"); + tryIntegral("POI"); + } + + private void tryIntegral(String layoutStr) throws IOException { + CPUTF8 name = new CPUTF8("TestAttribute"); + CPUTF8 layout = new CPUTF8(layoutStr); + MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(1, + null, null, new AttributeDefinition(35, + AttributeDefinitionBands.CONTEXT_CLASS, name, layout)); + List layoutElements = newAttributeBands.getLayoutElements(); + assertEquals(1, layoutElements.size()); + Integral element = (Integral) layoutElements.get(0); + assertEquals(layoutStr, element.getTag()); + } + + public void testReplicationLayouts() throws IOException { + CPUTF8 name = new CPUTF8("TestAttribute"); + CPUTF8 layout = new CPUTF8("NH[PHOHRUHRSHH]"); + MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(1, + null, null, new AttributeDefinition(35, + AttributeDefinitionBands.CONTEXT_CLASS, name, layout)); + List layoutElements = newAttributeBands.getLayoutElements(); + assertEquals(1, layoutElements.size()); + Replication element = (Replication) layoutElements.get(0); + Integral countElement = element.getCountElement(); + assertEquals("H", countElement.getTag()); + List replicatedElements = element.getLayoutElements(); + assertEquals(5, replicatedElements.size()); + Integral firstElement = (Integral) replicatedElements.get(0); + assertEquals("PH", firstElement.getTag()); + Integral secondElement = (Integral) replicatedElements.get(1); + assertEquals("OH", secondElement.getTag()); + Reference thirdElement = (Reference) replicatedElements.get(2); + assertEquals("RUH", thirdElement.getTag()); + Reference fourthElement = (Reference) replicatedElements.get(3); + assertEquals("RSH", fourthElement.getTag()); + Integral fifthElement = (Integral) replicatedElements.get(4); + assertEquals("H", fifthElement.getTag()); + } + + public void testReferenceLayouts() throws IOException { + tryReference("KIB"); + tryReference("KIH"); + tryReference("KII"); + tryReference("KINH"); + tryReference("KJH"); + tryReference("KDH"); + tryReference("KSH"); + tryReference("KQH"); + tryReference("RCH"); + tryReference("RSH"); + tryReference("RDH"); + tryReference("RFH"); + tryReference("RMH"); + tryReference("RIH"); + tryReference("RUH"); + tryReference("RQH"); + tryReference("RQNH"); + tryReference("RQNI"); + } + + private void tryReference(String layoutStr) throws IOException { + CPUTF8 name = new CPUTF8("TestAttribute"); + CPUTF8 layout = new CPUTF8(layoutStr); + MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(1, + null, null, new AttributeDefinition(35, + AttributeDefinitionBands.CONTEXT_CLASS, name, layout)); + List layoutElements = newAttributeBands.getLayoutElements(); + assertEquals(1, layoutElements.size()); + Reference element = (Reference) layoutElements.get(0); + assertEquals(layoutStr, element.getTag()); + } + + public void testUnionLayout() throws IOException { + CPUTF8 name = new CPUTF8("TestAttribute"); + CPUTF8 layout = new CPUTF8("TB(55)[FH](23)[]()[RSH]"); + MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(1, + null, null, new AttributeDefinition(35, + AttributeDefinitionBands.CONTEXT_CLASS, name, layout)); + List layoutElements = newAttributeBands.getLayoutElements(); + assertEquals(1, layoutElements.size()); + Union element = (Union) layoutElements.get(0); + Integral tag = element.getUnionTag(); + assertEquals("B", tag.getTag()); + List unionCases = element.getUnionCases(); + assertEquals(2, unionCases.size()); + UnionCase firstCase = (UnionCase) unionCases.get(0); + assertTrue(firstCase.hasTag(55)); + assertFalse(firstCase.hasTag(23)); + List body = firstCase.getBody(); + assertEquals(1, body.size()); + Integral bodyElement = (Integral) body.get(0); + assertEquals("FH", bodyElement.getTag()); + UnionCase secondCase = (UnionCase) unionCases.get(1); + assertTrue(secondCase.hasTag(23)); + assertFalse(secondCase.hasTag(55)); + body = secondCase.getBody(); + assertEquals(0, body.size()); + List defaultBody = element.getDefaultCaseBody(); + assertEquals(1, defaultBody.size()); + Reference ref = (Reference) defaultBody.get(0); + assertEquals("RSH", ref.getTag()); + } + + public void testLayoutWithCalls() throws IOException { + CPUTF8 name = new CPUTF8("TestAttribute"); + CPUTF8 layout = new CPUTF8( + "[NH[(1)]][RSH NH[RUH(1)]][TB(66,67,73,83,90)[KIH](68)[KDH](70)[KFH](74)[KJH](99)[RSH](101)[RSH RUH](115)[RUH](91)[NH[(0)]](64)[RSH[RUH(0)]]()[]]"); + MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(1, + null, null, new AttributeDefinition(35, + AttributeDefinitionBands.CONTEXT_CLASS, name, layout)); + List layoutElements = newAttributeBands.getLayoutElements(); + assertEquals(3, layoutElements.size()); + Callable firstCallable = (Callable) layoutElements.get(0); + Callable secondCallable = (Callable) layoutElements.get(1); + Callable thirdCallable = (Callable) layoutElements.get(2); + List firstBody = firstCallable.getBody(); + assertEquals(1, firstBody.size()); + Replication rep = (Replication) firstBody.get(0); + List repBody = rep.getLayoutElements(); + assertEquals(1, repBody.size()); + Call call = (Call) repBody.get(0); + assertEquals(1, call.getCallableIndex()); + assertEquals(secondCallable, call.getCallable()); + } + + public void testAddAttributes() throws IOException, Pack200Exception { + CPUTF8 name = new CPUTF8("TestAttribute"); + CPUTF8 layout = new CPUTF8("B"); + MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(1, + null, null, new AttributeDefinition(35, + AttributeDefinitionBands.CONTEXT_CLASS, name, layout)); + newAttributeBands.addAttribute(new NewAttribute(null, "TestAttribute", "B", new byte[] {27}, null, 0, null)); + newAttributeBands.addAttribute(new NewAttribute(null, "TestAttribute", "B", new byte[] {56}, null, 0, null)); + newAttributeBands.addAttribute(new NewAttribute(null, "TestAttribute", "B", new byte[] {3}, null, 0, null)); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + newAttributeBands.pack(out); + // BYTE1 is used for B layouts so we don't need to unpack to test the results + byte[] bytes = out.toByteArray(); + assertEquals(3, bytes.length); + assertEquals(27, bytes[0]); + assertEquals(56, bytes[1]); + assertEquals(3, bytes[2]); + } + + public void testAddAttributesWithReplicationLayout() throws IOException, Pack200Exception { + CPUTF8 name = new CPUTF8("TestAttribute"); + CPUTF8 layout = new CPUTF8("NB[SH]"); + MockNewAttributeBands newAttributeBands = new MockNewAttributeBands(1, + null, null, new AttributeDefinition(35, + AttributeDefinitionBands.CONTEXT_CLASS, name, layout)); + newAttributeBands.addAttribute(new NewAttribute(null, "TestAttribute", "B", new byte[] {1, 0, 100}, null, 0, null)); + short s = -50; + byte b1 = (byte)(s>>>8); + byte b2 = (byte)s; + newAttributeBands.addAttribute(new NewAttribute(null, "TestAttribute", "B", new byte[] {3, 0, 5, 0, 25, b1, b2}, null, 0, null)); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + newAttributeBands.pack(out); + byte[] bytes = out.toByteArray(); + assertEquals(1, bytes[0]); + assertEquals(3, bytes[1]); + byte[] band = new byte[bytes.length - 2]; + System.arraycopy(bytes, 2, band, 0, band.length); + int[] decoded = Codec.SIGNED5.decodeInts(4, new ByteArrayInputStream(band)); + assertEquals(4, decoded.length); + assertEquals(100, decoded[0]); + assertEquals(5, decoded[1]); + assertEquals(25, decoded[2]); + assertEquals(-50, decoded[3]); + } + + private class MockNewAttributeBands extends NewAttributeBands { + + public MockNewAttributeBands(int effort, CpBands cpBands, + SegmentHeader header, AttributeDefinition def) + throws IOException { + super(effort, cpBands, header, def); + } + + public List getLayoutElements() { + return attributeLayoutElements; + } + } + +} diff --git a/src/test/java/org/apache/harmony/pack200/tests/PopulationCodecTest.java b/src/test/java/org/apache/harmony/pack200/tests/PopulationCodecTest.java new file mode 100644 index 0000000..06a07a5 --- /dev/null +++ b/src/test/java/org/apache/harmony/pack200/tests/PopulationCodecTest.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.pack200.tests; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.pack200.PopulationCodec; + +public class PopulationCodecTest extends TestCase { + + public void testPopulationCodec() throws IOException, Pack200Exception { + checkDecode(new byte[] { 4, 5, 6, 4, 2, 1, 3, 0, 7 }, new long[] { 5, + 4, 6, 7 }, Codec.BYTE1); + // Codec.SIGNED5 can be trivial for small n, because the encoding is 2n + // if even, 2n-1 if odd + // Therefore they're left here to explain what the values are :-) + checkDecode(new byte[] { 4 * 2, 4 * 2 - 1, 6 * 2, 4 * 2, 2 * 2, 1 * 2, + 3 * 2, 0, 7 * 2 }, new long[] { -4, 4, 6, 7 }, Codec.SIGNED5); + checkDecode(new byte[] { 4 * 2 - 1, 4 * 2, 6 * 2, 4 * 2, 2 * 2, 1 * 2, + 3 * 2, 0, 7 * 2 }, new long[] { 4, -4, 6, 7 }, Codec.SIGNED5); + checkDecode(new byte[] { 1, 1, 1 }, new long[] { 1 }, Codec.BYTE1); + checkDecode(new byte[] { 2, 2, 1 }, new long[] { 2 }, Codec.BYTE1); + checkDecode(new byte[] { 1, 1, 2 }, new long[] { -1 }, Codec.SIGNED5); + checkDecode(new byte[] { 2, 2, 0, 1, 3 }, new long[] { 3, 2 }, + Codec.BYTE1); + checkDecode(new byte[] { 1, 2, 3, 4, 4, 2, 3, 4, 0, 1 }, new long[] { + 2, 3, 4, 1 }, Codec.BYTE1); + checkDecode(new byte[] { 3, 2, 1, 4, 4, 2, 3, 4, 0, 1 }, new long[] { + 2, 1, 4, 1 }, Codec.BYTE1); + checkDecode(new byte[] { 3, 2, 1, 4, 1, 2, 3, 4, 0, 1 }, new long[] { + 2, 1, 4, 1 }, Codec.BYTE1); + } + + private void checkDecode(byte[] data, long[] expectedResult, Codec codec) + throws IOException, Pack200Exception { + InputStream in = new ByteArrayInputStream(data); + + int[] result = new PopulationCodec(codec, codec, codec).decodeInts( + expectedResult.length, in); + assertEquals(expectedResult.length, result.length); + for (int i = 0; i < expectedResult.length; i++) { + assertEquals(expectedResult[i], result[i]); + } + assertEquals(0, in.available()); + } + +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/AbstractBandsTestCase.java b/src/test/java/org/apache/harmony/unpack200/tests/AbstractBandsTestCase.java new file mode 100644 index 0000000..63626b6 --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/AbstractBandsTestCase.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.AttrDefinitionBands; +import org.apache.harmony.unpack200.AttributeLayoutMap; +import org.apache.harmony.unpack200.Segment; +import org.apache.harmony.unpack200.SegmentHeader; +import org.apache.harmony.unpack200.SegmentOptions; + +/** + * + */ +public abstract class AbstractBandsTestCase extends TestCase { + + protected int numClasses = 1; + protected int[] numMethods = { 1 }; + + public class MockSegmentHeader extends SegmentHeader { + + public MockSegmentHeader(Segment segment) { + super(segment); + } + + public int getClassCount() { + return numClasses; + } + + public SegmentOptions getOptions() { + try { + return new SegmentOptions(0); + } catch (Pack200Exception e) { + return null; + } + } + } + + public class MockAttributeDefinitionBands extends AttrDefinitionBands { + + public MockAttributeDefinitionBands(Segment segment) { + super(segment); + } + + public AttributeLayoutMap getAttributeDefinitionMap() { + try { + return new AttributeLayoutMap(); + } catch (Pack200Exception e) { + fail(e.getLocalizedMessage()); + } + return null; + } + + } + + public class MockSegment extends Segment { + + protected AttrDefinitionBands getAttrDefinitionBands() { + return new MockAttributeDefinitionBands(this); + } + + public SegmentHeader getSegmentHeader() { + return new MockSegmentHeader(this); + } + } + +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java b/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java new file mode 100644 index 0000000..3fbf93f --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/ArchiveTest.java @@ -0,0 +1,199 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.Archive; + +/** + * Tests for org.apache.harmony.unpack200.Archive, which is the main class for + * unpack200. + */ +public class ArchiveTest extends TestCase { + + InputStream in; + JarOutputStream out; + File file; + + public void testJustResourcesGZip() throws Exception { + in = Archive.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/JustResources.pack.gz"); + file = File.createTempFile("Just", "ResourcesGz.jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Archive archive = new Archive(in, out); + archive.unpack(); + } + + // Test with an archive containing Harmony's SQL module, packed with -E1 + public void testWithSqlE1() throws Exception { + in = Archive.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/sql-e1.pack.gz"); + file = File.createTempFile("sql-e1", ".jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Archive archive = new Archive(in, out); + archive.unpack(); + } + + // Test with an archive containing Harmony's SQL module + public void testWithSql() throws Exception { + in = Archive.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/sql.pack.gz"); + file = File.createTempFile("sql", ".jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Archive archive = new Archive(in, out); + archive.unpack(); + JarFile jarFile = new JarFile(file); + file.deleteOnExit(); + + File compareFile = new File(Archive.class.getResource( + "/org/apache/harmony/pack200/tests/sqlUnpacked.jar").toURI()); + + JarFile jarFile2 = new JarFile(compareFile); + + long differenceInJarSizes = Math.abs(compareFile.length() + - file.length()); + + assertTrue("Expected jar files to be a similar size, difference was " + + differenceInJarSizes + " bytes", differenceInJarSizes < 100); + + Enumeration entries = jarFile.entries(); + Enumeration entries2 = jarFile2.entries(); + while(entries.hasMoreElements() && entries2.hasMoreElements()) { + + JarEntry entry = (JarEntry) entries.nextElement(); + assertNotNull(entry); + String name = entry.getName(); + + JarEntry entry2 = (JarEntry) entries2.nextElement(); + assertNotNull(entry2); + String name2 = entry2.getName(); + + assertEquals(name, name2); + + InputStream ours = jarFile.getInputStream(entry); + InputStream expected = jarFile2.getInputStream(entry2); + + BufferedReader reader1 = new BufferedReader(new InputStreamReader(ours)); + BufferedReader reader2 = new BufferedReader(new InputStreamReader( + expected)); + String line1 = reader1.readLine(); + String line2 = reader2.readLine(); + int i = 1; + while (line1 != null || line2 != null) { + assertEquals("Unpacked class files differ for " + name, line2, line1); + line1 = reader1.readLine(); + line2 = reader2.readLine(); + i++; + } + reader1.close(); + reader2.close(); + } + } + + // Test with an archive containing Harmony's Pack200 module, packed with -E1 + public void testWithPack200E1() throws Exception { + in = Archive.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/pack200-e1.pack.gz"); + file = File.createTempFile("p200-e1", ".jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Archive archive = new Archive(in, out); + archive.unpack(); + } + + // Test with an archive containing Harmony's Pack200 module + public void testWithPack200() throws Exception { + in = Archive.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/pack200.pack.gz"); + file = File.createTempFile("p200", ".jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Archive archive = new Archive(in, out); + archive.unpack(); + } + + // Test with an archive containing Harmony's JNDI module + public void testWithJNDIE1() throws Exception { + in = Archive.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/jndi-e1.pack.gz"); + file = File.createTempFile("jndi-e1", ".jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Archive archive = new Archive(in, out); + archive.unpack(); + } + + // Test with an archive containing Annotations + public void testWithAnnotations() throws Exception { + in = Archive.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/annotations.pack.gz"); + file = File.createTempFile("annotations", ".jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Archive archive = new Archive(in, out); + archive.unpack(); + } + + // Test with an archive packed with the -E0 option + public void testWithE0() throws Exception { + in = Archive.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/simple-E0.pack.gz"); + file = File.createTempFile("simple-e0", ".jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Archive archive = new Archive(in, out); + archive.unpack(); + } + + // Test with a class containing lots of local variables (regression test for + // HARMONY-5470) + public void testWithLargeClass() throws Exception { + in = Archive.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/LargeClass.pack.gz"); + file = File.createTempFile("largeClass", ".jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Archive archive = new Archive(in, out); + archive.unpack(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + file.delete(); + } + +} \ No newline at end of file diff --git a/src/test/java/org/apache/harmony/unpack200/tests/AttributeLayoutMapTest.java b/src/test/java/org/apache/harmony/unpack200/tests/AttributeLayoutMapTest.java new file mode 100644 index 0000000..c0f4c6e --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/AttributeLayoutMapTest.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.AttributeLayout; +import org.apache.harmony.unpack200.AttributeLayoutMap; + +public class AttributeLayoutMapTest extends TestCase { + + public void testRepeatable() throws Pack200Exception { + // Check we can retrieve a default layout + AttributeLayoutMap a = new AttributeLayoutMap(); + AttributeLayout layout = a.getAttributeLayout("SourceFile", + AttributeLayout.CONTEXT_CLASS); + assertNotNull(layout); + assertEquals("RUNH", layout.getLayout()); + // and that we can change it + a.add(new AttributeLayout("SourceFile", AttributeLayout.CONTEXT_CLASS, + "FROG", 15)); + layout = a.getAttributeLayout("SourceFile", + AttributeLayout.CONTEXT_CLASS); + assertNotNull(layout); + assertEquals("FROG", layout.getLayout()); + assertTrue(layout.matches(1 << 15)); + assertFalse(layout.matches(1 << 16)); + assertTrue(layout.matches(-1)); + assertFalse(layout.matches(0)); + // and that changes don't affect subsequent defaults + AttributeLayoutMap b = new AttributeLayoutMap(); + layout = b.getAttributeLayout("SourceFile", + AttributeLayout.CONTEXT_CLASS); + assertNotNull(layout); + assertEquals("RUNH", layout.getLayout()); + + } +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/AttributeLayoutTest.java b/src/test/java/org/apache/harmony/unpack200/tests/AttributeLayoutTest.java new file mode 100644 index 0000000..97b4fdc --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/AttributeLayoutTest.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.AttributeLayout; +import org.apache.harmony.unpack200.Segment; +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.CPUTF8; +import org.apache.harmony.unpack200.bytecode.ClassFileEntry; + +public class AttributeLayoutTest extends TestCase { + + public class TestSegment extends Segment { + + public SegmentConstantPool getConstantPool() { + final ClassFileEntry[][] data = new ClassFileEntry[][] { + {}, // ALL + { entry("Zero"), entry("One"), entry("Two"), + entry("Three"), entry("Four"), entry("Five"), + entry("Six"), entry("Seven"), entry("Eight"), + entry("Nine") }, // UTF-8 + {}, + {}, + {}, + {}, + {}, + {}, + { entry("Eins"), entry("Zwei"), entry("Drei"), + entry("Vier"), entry("Funf"), entry("Sechs"), + entry("Sieben"), entry("Acht"), entry("Neun") }, // Signature + }; + return new SegmentConstantPool(null) { + + public ClassFileEntry getValue(int cp, long index) { + if (index == -1) + return null; + return data[cp][(int) index]; + } + + }; + } + + private ClassFileEntry entry(String string) { + return new CPUTF8(string); + } + } + + public void testBadData() { + assertTrue(throwsException(null, AttributeLayout.CONTEXT_CLASS, "")); + assertTrue(throwsException("", AttributeLayout.CONTEXT_CLASS, "")); + assertTrue(!throwsException("name", AttributeLayout.CONTEXT_CLASS, "")); + assertTrue(!throwsException("name", AttributeLayout.CONTEXT_METHOD, "")); + assertTrue(!throwsException("name", AttributeLayout.CONTEXT_FIELD, "")); + assertTrue(!throwsException("name", AttributeLayout.CONTEXT_CODE, "")); + assertTrue(throwsException("name", -1, "")); + assertTrue(throwsException("name", 1234, "")); + } + + public void testLayoutRU() throws Pack200Exception { + AttributeLayout layout = new AttributeLayout("RU", + AttributeLayout.CONTEXT_CLASS, "RU", 1); + Segment segment = new TestSegment(); + assertNull(layout.getValue(-1, segment.getConstantPool())); + assertEquals("Zero", ((CPUTF8)layout.getValue(0, segment.getConstantPool())).underlyingString()); + assertEquals("One", ((CPUTF8)layout.getValue(1, segment.getConstantPool())).underlyingString()); + } + + public void testLayoutRUN() throws Pack200Exception { + AttributeLayout layout = new AttributeLayout("RUN", + AttributeLayout.CONTEXT_CLASS, "RUN", 1); + Segment segment = new TestSegment(); + assertNull(layout.getValue(0, segment.getConstantPool())); + assertEquals("Zero", ((CPUTF8)layout.getValue(1, segment.getConstantPool())).underlyingString()); + assertEquals("One", ((CPUTF8)layout.getValue(2, segment.getConstantPool())).underlyingString()); + } + + public void testLayoutRS() throws Pack200Exception { + AttributeLayout layout = new AttributeLayout("RS", + AttributeLayout.CONTEXT_CLASS, "RS", 1); + Segment segment = new TestSegment(); + assertNull(layout.getValue(-1, segment.getConstantPool())); + assertEquals("Eins", ((CPUTF8)layout.getValue(0, segment.getConstantPool())).underlyingString()); + assertEquals("Zwei", ((CPUTF8)layout.getValue(1, segment.getConstantPool())).underlyingString()); + } + + public void testLayoutRSN() throws Pack200Exception { + AttributeLayout layout = new AttributeLayout("RSN", + AttributeLayout.CONTEXT_CLASS, "RSN", 1); + Segment segment = new TestSegment(); + assertNull(layout.getValue(0, segment.getConstantPool())); + assertEquals("Eins", ((CPUTF8)layout.getValue(1, segment.getConstantPool())).underlyingString()); + assertEquals("Zwei", ((CPUTF8)layout.getValue(2, segment.getConstantPool())).underlyingString()); + } + + public void testGetCodec() throws Pack200Exception { + AttributeLayout layout = new AttributeLayout("O", + AttributeLayout.CONTEXT_CLASS, "HOBS", 1); + assertEquals(Codec.BRANCH5, layout.getCodec()); + layout = new AttributeLayout("P", AttributeLayout.CONTEXT_METHOD, + "PIN", 1); + assertEquals(Codec.BCI5, layout.getCodec()); + layout = new AttributeLayout("S", AttributeLayout.CONTEXT_FIELD, "HS", + 1); + assertEquals(Codec.SIGNED5, layout.getCodec()); + layout = new AttributeLayout("RS", AttributeLayout.CONTEXT_CODE, + "RRRS", 1); + assertEquals(Codec.UNSIGNED5, layout.getCodec()); + layout = new AttributeLayout("KS", AttributeLayout.CONTEXT_CLASS, + "RKS", 1); + assertEquals(Codec.UNSIGNED5, layout.getCodec()); + layout = new AttributeLayout("B", AttributeLayout.CONTEXT_CLASS, + "TRKSB", 1); + assertEquals(Codec.BYTE1, layout.getCodec()); + } + + public boolean throwsException(String name, int context, String layout) { + try { + new AttributeLayout(name, context, layout, -1); + return false; + } catch (Pack200Exception e) { + return true; + } + } +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/BandSetTest.java b/src/test/java/org/apache/harmony/unpack200/tests/BandSetTest.java new file mode 100644 index 0000000..af04f02 --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/BandSetTest.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.BHSDCodec; +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.BandSet; +import org.apache.harmony.unpack200.Segment; +import org.apache.harmony.unpack200.SegmentHeader; + +public class BandSetTest extends TestCase { + + public class MockSegment extends Segment { + + public SegmentHeader getSegmentHeader() { + return new SegmentHeader(this); + } + } + + private final BandSet bandSet = new BandSet(new MockSegment()) { + + public void read(InputStream inputStream) throws IOException, + Pack200Exception { + } + + public void unpack() throws IOException, Pack200Exception { + } + + }; + + public void testDecodeBandInt() throws IOException, Pack200Exception { + BHSDCodec codec = Codec.BYTE1; + byte[] bytes = new byte[] { (byte) 3, (byte) 56, (byte) 122, (byte) 78 }; + InputStream in = new ByteArrayInputStream(bytes); + int[] ints = bandSet.decodeBandInt("Test Band", in, codec, 4); + for (int i = 0; i < ints.length; i++) { + assertEquals("Wrong value in position " + i, ints[i], bytes[i]); + } + } + + public void testParseFlags1() { + + } + + public void testParseFlags2() { + + } + + public void testParseFlags3() { + + } + + public void testParseReferences1() { + + } + + public void testParseReferences2() { + + } + +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/BcBandsTest.java b/src/test/java/org/apache/harmony/unpack200/tests/BcBandsTest.java new file mode 100644 index 0000000..0ce8edf --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/BcBandsTest.java @@ -0,0 +1,672 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.AttrDefinitionBands; +import org.apache.harmony.unpack200.BcBands; +import org.apache.harmony.unpack200.ClassBands; +import org.apache.harmony.unpack200.CpBands; +import org.apache.harmony.unpack200.Segment; +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.CPClass; +import org.apache.harmony.unpack200.bytecode.CPDouble; +import org.apache.harmony.unpack200.bytecode.CPFieldRef; +import org.apache.harmony.unpack200.bytecode.CPFloat; +import org.apache.harmony.unpack200.bytecode.CPInteger; +import org.apache.harmony.unpack200.bytecode.CPInterfaceMethodRef; +import org.apache.harmony.unpack200.bytecode.CPLong; +import org.apache.harmony.unpack200.bytecode.CPMethodRef; +import org.apache.harmony.unpack200.bytecode.CPNameAndType; +import org.apache.harmony.unpack200.bytecode.CPString; +import org.apache.harmony.unpack200.bytecode.CPUTF8; + +/** + * Tests for Pack200 bytecode bands + */ + +/* + * TODO: The number 8 is used in most of the tests in this class as a low + * (non-zero) number that is not likely to indicate a multiple byte number, but + * should be replaced with properly encoded byte arrays when encoding is + * implemented. + */ +public class BcBandsTest extends AbstractBandsTestCase { + + public class MockCpBands extends CpBands { + + private final CPUTF8 cpUTF8 = new CPUTF8("java/lang/String"); + private final CPClass cpClass = new CPClass(cpUTF8, -1); + private final CPNameAndType descriptor = new CPNameAndType(new CPUTF8( + "Hello"), new CPUTF8("(a, b, c)"), -1); + + public MockCpBands(Segment segment) { + super(segment); + } + + public CPString cpStringValue(int index) { + return new CPString(cpUTF8, index); + } + + public CPInteger cpIntegerValue(int index) { + return new CPInteger(new Integer(21), index); + } + + public CPClass cpClassValue(int index) { + return cpClass; + } + + public CPFloat cpFloatValue(int index) { + return new CPFloat(new Float(2.5F), index); + } + + public CPLong cpLongValue(int index) { + return new CPLong(new Long(21L), index); + } + + public CPDouble cpDoubleValue(int index) { + return new CPDouble(new Double(2.5D), index); + } + + public CPFieldRef cpFieldValue(int index) { + return new CPFieldRef(cpClass, descriptor, index); + } + + public CPMethodRef cpMethodValue(int index) { + return new CPMethodRef(cpClass, descriptor, index); + } + + public CPInterfaceMethodRef cpIMethodValue(int index) { + return new CPInterfaceMethodRef(cpClass, descriptor, index); + } + + public String[] getCpClass() { + return new String[] {"Hello"}; + } + + public String[] getCpFieldClass() { + return new String[]{}; + } + + public String[] getCpMethodClass() { + return new String[]{}; + } + + public String[] getCpIMethodClass() { + return new String[]{}; + } + } + + public class MockClassBands extends ClassBands { + + public MockClassBands(Segment segment) { + super(segment); + } + + public long[][] getMethodFlags() { + long[][] flags = new long[numClasses][]; + for (int i = 0; i < flags.length; i++) { + flags[i] = new long[numMethods[i]]; + } + return flags; + } + + public int[] getCodeMaxStack() { + int totalMethods = 0; + for (int i = 0; i < numClasses; i++) { + totalMethods += numMethods[i]; + } + return new int[totalMethods]; + } + + public int[] getCodeMaxNALocals() { + int totalMethods = 0; + for (int i = 0; i < numClasses; i++) { + totalMethods += numMethods[i]; + } + return new int[totalMethods]; + } + + public boolean[] getCodeHasAttributes() { + int totalMethods = 0; + for (int i = 0; i < numClasses; i++) { + totalMethods += numMethods[i]; + } + return new boolean[totalMethods]; + } + + public String[][] getMethodDescr() { + String[][] descr = new String[numClasses][]; + for (int i = 0; i < descr.length; i++) { + descr[i] = new String[numMethods[i]]; + for (int j = 0; j < descr[i].length; j++) { + descr[i][j] = "hello()"; + } + } + return descr; + } + + public int[] getClassThisInts() { + int[] thisClasses = new int[numClasses]; + for (int index = 0; index < numClasses; index++) { + thisClasses[index] = 0; + } + return thisClasses; + } + + public int[] getClassSuperInts() { + int[] superClasses = new int[numClasses]; + for (int index = 0; index < numClasses; index++) { + superClasses[index] = 0; + } + return superClasses; + } + + public ArrayList[][] getMethodAttributes() { + ArrayList[][] attributes = new ArrayList[numClasses][]; + for (int i = 0; i < attributes.length; i++) { + attributes[i] = new ArrayList[numMethods[i]]; + for (int j = 0; j < attributes[i].length; j++) { + attributes[i][j] = new ArrayList(); + } + } + return attributes; + } + + public ArrayList getOrderedCodeAttributes() { + int totalMethods = 0; + for (int classIndex = 0; classIndex < numMethods.length; classIndex++) { + totalMethods = totalMethods + numMethods[classIndex]; + } + ArrayList orderedAttributeList = new ArrayList(); + for (int classIndex = 0; classIndex < totalMethods; classIndex++) { + ArrayList currentAttributes = new ArrayList(); + orderedAttributeList.add(currentAttributes); + } + return orderedAttributeList; + } + } + + public class MockSegment extends AbstractBandsTestCase.MockSegment { + + public CpBands cpBands; + + protected AttrDefinitionBands getAttrDefinitionBands() { + return new MockAttributeDefinitionBands(this); + } + + protected CpBands getCpBands() { + if (null == cpBands) { + cpBands = new MockCpBands(this); + } + return cpBands; + } + + protected ClassBands getClassBands() { + return new MockClassBands(this); + } + + public SegmentConstantPool getConstantPool() { + return cpBands.getConstantPool(); + } + } + + BcBands bcBands = new BcBands(new MockSegment()); + + /** + * Test with single byte instructions that mean all other bands apart from + * bc_codes will be empty. + * + * @throws IOException + * @throws Pack200Exception + */ + public void testSimple() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, (byte) 128, + (byte) 129, (byte) 130, (byte) 131, (byte) 133, (byte) 134, + (byte) 135, (byte) 136, (byte) 137, (byte) 138, (byte) 139, + (byte) 140, (byte) 141, (byte) 142, (byte) 143, (byte) 144, + (byte) 145, (byte) 146, (byte) 147, (byte) 148, (byte) 149, + (byte) 150, (byte) 151, (byte) 172, (byte) 173, (byte) 174, + (byte) 175, (byte) 176, (byte) 177, (byte) 190, (byte) 191, + (byte) 194, (byte) 195, (byte) 255 }; + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(bytes.length - 1, + bcBands.getMethodByteCodePacked()[0][0].length); + } + + /** + * Test with multiple classes but single byte instructions + * + * @throws IOException + * @throws Pack200Exception + */ + public void testMultipleClassesSimple() throws IOException, + Pack200Exception { + numClasses = 2; + numMethods = new int[] { 1, 1 }; + byte[] bytes = new byte[] { 50, 50, (byte) 255, 50, 50, (byte) 255 }; + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length); + assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length); + + numClasses = 1; + numMethods = new int[] { 1 }; + } + + /** + * Test with multiple classes and multiple methods but single byte + * instructions + * + * @throws IOException + * @throws Pack200Exception + */ + public void testMultipleMethodsSimple() throws IOException, + Pack200Exception { + numClasses = 2; + numMethods = new int[] { 3, 1 }; + byte[] bytes = new byte[] { 50, 50, (byte) 255, 50, 50, (byte) 255, 50, + 50, (byte) 255, 50, 50, (byte) 255 }; + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length); + assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length); + + numClasses = 1; + numMethods = new int[] { 1 }; + } + + /** + * Test with codes that require entries in the bc_case_count and + * bc_case_value bands + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcCaseBands() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 170, (byte) 171, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (byte) 255, 2, 5, // bc_case_count + 0, 0, 0, 0, 0, 0, 0, // bc_case_value + 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // bc_label + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(18, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_case_count = bcBands.getBcCaseCount(); + assertEquals(2, bc_case_count.length); + assertEquals(2, bc_case_count[0]); + assertEquals(5, bc_case_count[1]); + int[] bc_case_value = bcBands.getBcCaseValue(); + assertEquals(0, bc_case_value[0]); + assertEquals(0, bc_case_value[1]); + assertEquals(9, bcBands.getBcLabel().length); + } + + /** + * Test with codes that should require entries in the bc_byte band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcByteBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { 16, (byte) 132, (byte) 188, (byte) 197, + (byte) 255, 8, 8, 8, 8, // bc_byte band + 8, // bc_locals band (required by iinc (132)) + 8 }; // bc_class band (required by multianewarray (197)) + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(4, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_byte = bcBands.getBcByte(); + assertEquals(4, bc_byte.length); + for (int i = 0; i < bc_byte.length; i++) { + assertEquals(8, bc_byte[i]); + } + assertEquals(1, bcBands.getBcLocal().length); + assertEquals(1, bcBands.getBcClassRef().length); + } + + /** + * Test with codes that should require entries in the bc_short band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcShortBand() throws IOException, Pack200Exception { + // TODO: Need to fix this testcase so it has enough data to pass. + byte[] bytes = new byte[] { 17, (byte) 196, (byte) 132, (byte) 255, 8, + 8,// bc_short band + 8 }; // bc_locals band (required by wide iinc (196, 132)) + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(3, bcBands.getMethodByteCodePacked()[0][0].length); + assertEquals(2, bcBands.getBcShort().length); + assertEquals(1, bcBands.getBcLocal().length); + } + + /** + * Test with codes that should require entries in the bc_local band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcLocalBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { 21, 22, 23, 24, 25, 54, 55, 56, 57, 58, + (byte) 169, (byte) 255, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; // bc_local + // band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(11, bcBands.getMethodByteCodePacked()[0][0].length); + assertEquals(11, bcBands.getBcLocal().length); + } + + /** + * Test with codes that should require entries in the bc_label band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcLabelBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 159, (byte) 160, (byte) 161, + (byte) 162, (byte) 163, (byte) 164, (byte) 165, (byte) 166, + (byte) 167, (byte) 168, (byte) 170, (byte) 171, (byte) 198, + (byte) 199, (byte) 200, (byte) 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (byte) 255, 2, 2, // bc_case_count + // (required + // by + // tableswitch + // (170) and + // lookupswitch + // (171)) + 0, 0, 0, 0, // bc_case_value + // Now that we're actually doing real label lookup, need valid + // labels + // 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; // bc_label + // band + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // bc_label + // band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(36, bcBands.getMethodByteCodePacked()[0][0].length); + assertEquals(20, bcBands.getBcLabel().length); + } + + public void testWideForms() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 196, (byte) 54, // wide istore + (byte) 196, (byte) 132, // wide iinc + (byte) 255, 0, // bc_short band + 0, 1 }; // bc_locals band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(4, bcBands.getMethodByteCodePacked()[0][0].length); + assertEquals(2, bcBands.getBcLocal().length); + assertEquals(1, bcBands.getBcShort().length); + } + + /** + * Test with codes that should require entries in the bc_intref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcIntRefBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 234, (byte) 237, (byte) 255, 8, 8 }; // bc_intref + // band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_intref = bcBands.getBcIntRef(); + assertEquals(2, bc_intref.length); + } + + /** + * Test with codes that should require entries in the bc_floatref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcFloatRefBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 235, (byte) 238, (byte) 255, 8, 8 }; // bc_floatref + // band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_floatref = bcBands.getBcFloatRef(); + assertEquals(2, bc_floatref.length); + } + + /** + * Test with codes that should require entries in the bc_longref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcLongRefBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { 20, (byte) 255, 8 }; // bc_longref band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(1, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_longref = bcBands.getBcLongRef(); + assertEquals(1, bc_longref.length); + } + + /** + * Test with codes that should require entries in the bc_doubleref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcDoubleRefBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 239, (byte) 255, 8 }; // bc_doubleref + // band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(1, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_doubleref = bcBands.getBcDoubleRef(); + assertEquals(1, bc_doubleref.length); + } + + /** + * Test with codes that should require entries in the bc_stringref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcStringRefBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { 18, 19, (byte) 255, 8, 8 }; // bc_stringref + // band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_stringref = bcBands.getBcStringRef(); + assertEquals(2, bc_stringref.length); + } + + /** + * Test with codes that should require entries in the bc_classref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcClassRefBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 233, (byte) 236, (byte) 255, 8, 8 }; // bc_classref + // band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_classref = bcBands.getBcClassRef(); + assertEquals(2, bc_classref.length); + } + + /** + * Test with codes that should require entries in the bc_fieldref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcFieldRefBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 178, (byte) 179, (byte) 180, + (byte) 181, (byte) 255, 8, 8, 8, 8 }; // bc_fieldref band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(4, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_fieldref = bcBands.getBcFieldRef(); + assertEquals(4, bc_fieldref.length); + } + + /** + * Test with codes that should require entries in the bc_methodref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcMethodRefBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 182, (byte) 183, (byte) 184, + (byte) 255, 8, 8, 8 }; // bc_methodref band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(3, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_methodref = bcBands.getBcMethodRef(); + assertEquals(3, bc_methodref.length); + } + + /** + * Test with codes that should require entries in the bc_imethodref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcIMethodRefBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 185, (byte) 255, 8 }; // bc_imethodref + // band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(1, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_imethodref = bcBands.getBcIMethodRef(); + assertEquals(1, bc_imethodref.length); + } + + /** + * Test with codes that should require entries in the bc_thisfieldref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcThisFieldBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 202, (byte) 203, (byte) 204, + (byte) 205, (byte) 209, (byte) 210, (byte) 211, (byte) 212, + (byte) 255, 8, 8, 8, 8, 8, 8, 8, 8 }; // bc_thisfieldref band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(8, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_thisfield = bcBands.getBcThisField(); + assertEquals(8, bc_thisfield.length); + } + + /** + * Test with codes that should require entries in the bc_superfield band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcSuperFieldBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 216, (byte) 217, (byte) 218, + (byte) 219, (byte) 223, (byte) 224, (byte) 225, (byte) 226, + (byte) 255, 8, 8, 8, 8, 8, 8, 8, 8 }; // bc_superfield band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(8, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_superfield = bcBands.getBcSuperField(); + assertEquals(8, bc_superfield.length); + } + + /** + * Test with codes that should require entries in the bc_thismethod band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcThisMethodBand() throws IOException, Pack200Exception { + byte[] bytes = new byte[] { (byte) 206, (byte) 207, (byte) 208, + (byte) 213, (byte) 214, (byte) 215, (byte) 255, 8, 8, 8, 8, 8, + 8 }; // bc_thismethod band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(6, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_thismethod = bcBands.getBcThisMethod(); + assertEquals(6, bc_thismethod.length); + } + + /** + * Test with codes that should require entries in the bc_supermethod band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcSuperMethodBand() throws IOException, Pack200Exception { + // TODO: Need to fix this testcase so it has enough data to pass. + if (true) + return; + byte[] bytes = new byte[] { (byte) 220, (byte) 221, (byte) 222, + (byte) 227, (byte) 228, (byte) 229, (byte) 255, 8, 8, 8, 8, 8, + 8 }; // bc_supermethod band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(6, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_supermethod = bcBands.getBcSuperMethod(); + assertEquals(6, bc_supermethod.length); + } + + /** + * Test with codes that should require entries in the bc_initrefref band + * + * @throws Pack200Exception + * @throws IOException + */ + public void testBcInitRefRefBand() throws IOException, Pack200Exception { + // TODO: Need to fix this testcase so it has enough data to pass. + if (true) + return; + byte[] bytes = new byte[] { (byte) 230, (byte) 231, (byte) 232, + (byte) 255, 8, 8, 8 }; // bc_initrefref band + InputStream in = new ByteArrayInputStream(bytes); + bcBands.unpack(in); + assertEquals(3, bcBands.getMethodByteCodePacked()[0][0].length); + int[] bc_initrefref = bcBands.getBcInitRef(); + assertEquals(3, bc_initrefref.length); + } + + public void testBcEscRefBands() throws IOException, Pack200Exception { + // TODO + } + + public void testBcEscBands() throws IOException, Pack200Exception { + // TODO + } + +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/CPUTF8Test.java b/src/test/java/org/apache/harmony/unpack200/tests/CPUTF8Test.java new file mode 100644 index 0000000..ee6980a --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/CPUTF8Test.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.bytecode.CPUTF8; + +public class CPUTF8Test extends TestCase { + + public void testEquality() { + CPUTF8 one = new CPUTF8("(III)V", 1); + CPUTF8 two = new CPUTF8("((I[II)V", 2); + CPUTF8 three = new CPUTF8("([III)V", 3); + assertFalse(one.equals(two)); + assertFalse(one.equals(three)); + assertFalse(two.equals(three)); + + assertFalse(two.equals(one)); + assertFalse(three.equals(one)); + assertFalse(three.equals(two)); + } +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/ClassBandsTest.java b/src/test/java/org/apache/harmony/unpack200/tests/ClassBandsTest.java new file mode 100644 index 0000000..893336c --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/ClassBandsTest.java @@ -0,0 +1,179 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import org.apache.harmony.pack200.BHSDCodec; +import org.apache.harmony.pack200.Codec; +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.ClassBands; +import org.apache.harmony.unpack200.CpBands; +import org.apache.harmony.unpack200.Segment; + +/** + * + */ +public class ClassBandsTest extends AbstractBandsTestCase { + + private String[] cpClasses; + private String[] cpDescriptor; + private String[] cpUTF8; + + public class MockCpBands extends CpBands { + + public MockCpBands(Segment segment) { + super(segment); + } + + public String[] getCpClass() { + return cpClasses; + } + + public String[] getCpDescriptor() { + return cpDescriptor; + } + + public String[] getCpUTF8() { + return cpUTF8; + } + + public int[] getCpInt() { + return new int[0]; + } + + public double[] getCpDouble() { + return new double[0]; + } + + public long[] getCpLong() { + return new long[0]; + } + + public float[] getCpFloat() { + return new float[0]; + } + + public String[] getCpSignature() { + return new String[0]; + } + } + + public class MockSegment extends AbstractBandsTestCase.MockSegment { + + protected CpBands getCpBands() { + return new MockCpBands(this); + } + } + + ClassBands classBands = new ClassBands(new MockSegment()); + + public void testSimple() throws IOException, Pack200Exception { + cpClasses = new String[] { "Class1", "Class2", "Class3", "Interface1", + "Interface2" }; + cpDescriptor = new String[0]; + cpUTF8 = new String[0]; + byte[] classThis = Codec.DELTA5.encode(1, 0); + byte[] classSuper = Codec.DELTA5.encode(2, 0); + byte[] classInterfaceCount = Codec.DELTA5.encode(2, 0); + byte[] classInterfaceRef1 = encodeBandInt( + new int[] { 3, 4 }, Codec.DELTA5); + byte[] classFieldCount = Codec.DELTA5.encode(0, 0); + byte[] classMethodCount = Codec.DELTA5.encode(0, 0); + byte[] classFlags = Codec.UNSIGNED5.encode(0, 0); + byte[][] allArrays = new byte[][] { classThis, classSuper, + classInterfaceCount, classInterfaceRef1, classFieldCount, + classMethodCount, classFlags }; + int total = classThis.length + classSuper.length + + classInterfaceCount.length + classInterfaceRef1.length + + classFieldCount.length + classMethodCount.length + + classFlags.length; + byte[] bytes = new byte[total]; + int index = 0; + for (int i = 0; i < allArrays.length; i++) { + for (int j = 0; j < allArrays[i].length; j++) { + bytes[index] = allArrays[i][j]; + index++; + } + } + ByteArrayInputStream in = new ByteArrayInputStream(bytes); + classBands.unpack(in); + assertEquals(1, classBands.getClassThisInts()[0]); + assertEquals(2, classBands.getClassSuperInts()[0]); + assertEquals(1, classBands.getClassInterfacesInts().length); + assertEquals(2, classBands.getClassInterfacesInts()[0].length); + assertEquals(3, classBands.getClassInterfacesInts()[0][0]); + assertEquals(4, classBands.getClassInterfacesInts()[0][1]); + cpClasses = null; + } + + public void testWithMethods() throws Pack200Exception, IOException { + cpClasses = new String[] { "Class1", "Class2", "Class3" }; + cpDescriptor = new String[] { "method1", "method2", "method3" }; + cpUTF8 = new String[0]; + byte[] classThis = Codec.DELTA5.encode(1, 0); + byte[] classSuper = Codec.DELTA5.encode(2, 0); + byte[] classInterfaceCount = Codec.DELTA5.encode(0, 0); + byte[] classFieldCount = Codec.DELTA5.encode(0, 0); + byte[] classMethodCount = Codec.DELTA5.encode(3, 0); + byte[] methodDescr = encodeBandInt(new int[] { 0, 1, 2 }, + Codec.MDELTA5); + byte[] methodFlagsLo = encodeBandInt( + new int[] { 0, 0, 0 }, Codec.UNSIGNED5); + byte[] classFlags = Codec.UNSIGNED5.encode(0, 0); + byte[][] allArrays = new byte[][] { classThis, classSuper, + classInterfaceCount, classFieldCount, classMethodCount, + methodDescr, methodFlagsLo, classFlags, }; + int total = 0; + for (int i = 0; i < allArrays.length; i++) { + total += allArrays[i].length; + } + byte[] bytes = new byte[total]; + int index = 0; + for (int i = 0; i < allArrays.length; i++) { + for (int j = 0; j < allArrays[i].length; j++) { + bytes[index] = allArrays[i][j]; + index++; + } + } + ByteArrayInputStream in = new ByteArrayInputStream(bytes); + classBands.unpack(in); + assertEquals(1, classBands.getClassThisInts()[0]); + assertEquals(2, classBands.getClassSuperInts()[0]); + assertEquals(1, classBands.getMethodDescr().length); + assertEquals(3, classBands.getMethodDescr()[0].length); + assertEquals(cpDescriptor[0], classBands.getMethodDescr()[0][0]); + assertEquals(cpDescriptor[1], classBands.getMethodDescr()[0][1]); + assertEquals(cpDescriptor[2], classBands.getMethodDescr()[0][2]); + + cpClasses = null; + cpDescriptor = null; + } + + public byte[] encodeBandInt(int[] data, BHSDCodec codec) + throws IOException, Pack200Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (int i = 0; i < data.length; i++) { + baos.write(codec.encode(data[i], i == 0 ? 0 : data[i - 1])); + } + return baos.toByteArray(); + } + + +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/ClassVersionTest.java b/src/test/java/org/apache/harmony/unpack200/tests/ClassVersionTest.java new file mode 100644 index 0000000..520071e --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/ClassVersionTest.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.Segment; + +public class ClassVersionTest extends TestCase { + + private static final int JAVA_15 = 49; + + public void testCorrectVersionOfSegment() throws IOException { + InputStream in = Segment.class + .getResourceAsStream("/org/apache/harmony/unpack200/Segment.class"); + DataInputStream din = new DataInputStream(in); + + assertEquals(0xCAFEBABE, din.readInt()); + din.readShort(); // MINOR -- don't care + assertTrue("Class file has been compiled with Java 1.5 compatibility" + + " instead of 1.4 or lower", din.readShort() < JAVA_15); + } + + public void testCorrectVersionOfTest() throws IOException { + InputStream in = Segment.class + .getResourceAsStream("/org/apache/harmony/unpack200/tests/ClassVersionTest.class"); + DataInputStream din = new DataInputStream(in); + + assertEquals(0xCAFEBABE, din.readInt()); + din.readShort(); // MINOR -- don't care + assertTrue("Class file has been compiled with Java 1.5 compatibility" + + " instead of 1.4 or lower", din.readShort() < JAVA_15); + din.close(); + } + + public void testCorrectVersionOfAdapter() throws IOException { + // tests that both the file is on the classpath and that it's been + // compiled correctly, but without actually loading the class + InputStream in = Segment.class + .getResourceAsStream("/org/apache/harmony/unpack200/Pack200Adapter.class"); + if (in != null) { // If running in Eclipse and Java5 stuff not + // built/available + DataInputStream din = new DataInputStream(in); + + assertEquals(0xCAFEBABE, din.readInt()); + din.readShort(); // MINOR -- don't care + assertTrue("Class file needs 1.5 compatibility", + din.readShort() >= JAVA_15); + din.close(); + } + } +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/CodeAttributeTest.java b/src/test/java/org/apache/harmony/unpack200/tests/CodeAttributeTest.java new file mode 100644 index 0000000..0589fd8 --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/CodeAttributeTest.java @@ -0,0 +1,203 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.CpBands; +import org.apache.harmony.unpack200.Segment; +import org.apache.harmony.unpack200.SegmentConstantPool; +import org.apache.harmony.unpack200.bytecode.ByteCode; +import org.apache.harmony.unpack200.bytecode.CPFieldRef; +import org.apache.harmony.unpack200.bytecode.CPMethodRef; +import org.apache.harmony.unpack200.bytecode.CPString; +import org.apache.harmony.unpack200.bytecode.CPUTF8; +import org.apache.harmony.unpack200.bytecode.CodeAttribute; +import org.apache.harmony.unpack200.bytecode.LocalVariableTableAttribute; +import org.apache.harmony.unpack200.bytecode.OperandManager; + +/** + * Tests for CodeAttribute + */ +public class CodeAttributeTest extends TestCase { + + public class MockCodeAttribute extends CodeAttribute { + + public MockCodeAttribute(int maxStack, int maxLocals, + byte[] codePacked, Segment segment, + OperandManager operandManager, List exceptionTable) { + super(maxStack, maxLocals, codePacked, segment, operandManager, + exceptionTable); + } + + public int getLength() { + return super.getLength(); + } + } + + public class MockCpBands extends CpBands { + + public MockCpBands(Segment segment) { + super(segment); + } + + public CPFieldRef cpFieldValue(int index) { + return null; + } + + public CPString cpStringValue(int index) { + return new CPString(new CPUTF8("Hello"), -1); + } + + public CPMethodRef cpMethodValue(int index) { + return null; + } + + } + + public class MockOperandManager extends OperandManager { + + public MockOperandManager() { + super(new int[] {}, // bcCaseCount + new int[] {}, // bcCaseValues + new int[] {}, // bcByte + new int[] {}, // bcShort + new int[] {}, // bcLocal + new int[] {}, // bcLabel + new int[] {}, // bcIntRef + new int[] {}, // bcFloatRef + new int[] {}, // bcLongRef + new int[] {}, // bcDoubleRef + new int[] { 0, 1, 2, 3, 4 }, // bcStringRef + new int[] {}, // bcClassRef + new int[] {}, // bcFieldRef + new int[] {}, // bcMethodRef + new int[] {}, // bcIMethodRef + new int[] { 0, 0, 0, 0, 0, 0 }, // bcThisField + new int[] {}, // bcSuperField + new int[] { 0 }, // bcThisMethod + new int[] {}, // bcSuperMethod + new int[] {} // bcInitRef + , null); + } + } + + public class MockSegment extends Segment { + + public SegmentConstantPool getConstantPool() { + return new MockSegmentConstantPool(cpBands); + } + } + + public class MockSegmentConstantPool extends SegmentConstantPool { + + public MockSegmentConstantPool(CpBands bands) { + super(bands); + } + + protected int matchSpecificPoolEntryIndex(String[] nameArray, + String compareString, int desiredIndex) { + return 1; + } + } + + Segment segment = new MockSegment(); + CpBands cpBands = new MockCpBands(segment); + + public byte[] mixedByteArray = { -47, // aload_0_getstatic_this 0, 1 + -46, // aload_0_putstatic_this 4, 5 + 1, // aconst_null 8 + -45, // aload_0_getfield_this 9, 10 + // Should always end with a multibyte + // instruction + -44, // aload_0_putfield_this (int) 13, 14 + }; + + public byte[] singleByteArray = { 42, // aload_0 0 + 1, // aconst_null 1 + 18, // ldc 2 + -49, // return 4 + }; + + public void testLength() { + OperandManager operandManager = new MockOperandManager(); + operandManager.setSegment(segment); + operandManager.setCurrentClass("java/lang/Foo"); + + MockCodeAttribute attribute = new MockCodeAttribute(3, // maxStack + 2, // maxLocals + mixedByteArray, // codePacked + segment, // segment + operandManager, // operandManager + new ArrayList()); + assertEquals(29, attribute.getLength()); + + attribute.attributes.add(new LocalVariableTableAttribute(0, null, null, + null, null, null)); + assertEquals(37, attribute.getLength()); + } + + public void testMixedByteCodes() { + OperandManager operandManager = new MockOperandManager(); + operandManager.setSegment(segment); + operandManager.setCurrentClass("java/lang/Foo"); + + CodeAttribute attribute = new CodeAttribute(3, // maxStack + 2, // maxLocals + mixedByteArray, // codePacked + segment, // segment + operandManager, // operandManager + new ArrayList()); + assertEquals(2, attribute.maxLocals); + assertEquals(3, attribute.maxStack); + assertEquals("aload_0_putfield_this", ((ByteCode) attribute.byteCodes + .get(4)).toString()); + + int expectedLabels[] = new int[] { 0, 1, 4, 5, 8, 9, 10, 13, 14 }; + for (int index = 0; index < expectedLabels.length; index++) { + assertEquals(expectedLabels[index], + ((Integer) attribute.byteCodeOffsets.get(index)).intValue()); + } + } + + public void testSingleByteCodes() { + OperandManager operandManager = new MockOperandManager(); + operandManager.setSegment(segment); + operandManager.setCurrentClass("java/lang/Foo"); + + CodeAttribute attribute = new CodeAttribute(4, // maxStack + 3, // maxLocals + singleByteArray, // codePacked + segment, // segment + operandManager, // operandManager + new ArrayList()); + assertEquals(3, attribute.maxLocals); + assertEquals(4, attribute.maxStack); + assertEquals("invokespecial_this", ((ByteCode) attribute.byteCodes + .get(3)).toString()); + + int expectedLabels[] = new int[] { 0, 1, 2, 4 }; + for (int index = 0; index < expectedLabels.length; index++) { + assertEquals(expectedLabels[index], + ((Integer) attribute.byteCodeOffsets.get(index)).intValue()); + } + } + +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/ICTupleTest.java b/src/test/java/org/apache/harmony/unpack200/tests/ICTupleTest.java new file mode 100644 index 0000000..fae5c69 --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/ICTupleTest.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.IcTuple; + +public class ICTupleTest extends TestCase { + + public void testPredictedClassTupleParsing() { + IcTuple tuple = new IcTuple( + "orw/SimpleHelloWorld$SimpleHelloWorldInner", 0, null, null, + -1, -1, -1, -1); + assertEquals("SimpleHelloWorldInner", tuple.simpleClassName()); + assertEquals("orw/SimpleHelloWorld", tuple.outerClassString()); + + tuple = new IcTuple("java/util/AbstractList$2$Local", 0, null, null, + -1, -1, -1, -1); + assertEquals("Local", tuple.simpleClassName()); + assertEquals("java/util/AbstractList$2", tuple.outerClassString()); + + tuple = new IcTuple("java/util/AbstractList#2#Local", 0, null, null, + -1, -1, -1, -1); + assertEquals("Local", tuple.simpleClassName()); + assertEquals("java/util/AbstractList$2", tuple.outerClassString()); + + tuple = new IcTuple("java/util/AbstractList$1", 0, null, null, -1, -1, + -1, -1); + assertEquals("1", tuple.simpleClassName()); + assertEquals("java/util/AbstractList", tuple.outerClassString()); + } + + public void testExplicitClassTupleParsing() { + IcTuple tuple = new IcTuple("Foo$$2$Local", IcTuple.NESTED_CLASS_FLAG, + null, "$2$Local", -1, -1, -1, -1); + assertEquals("$2$Local", tuple.simpleClassName()); + assertEquals("Foo$$2", tuple.outerClassString()); + + tuple = new IcTuple("Red$Herring", IcTuple.NESTED_CLASS_FLAG, + "Red$Herring", null, -1, -1, -1, -1); + assertEquals("Herring", tuple.simpleClassName()); + assertEquals("Red$Herring", tuple.outerClassString()); + + tuple = new IcTuple("X$1$Q", IcTuple.NESTED_CLASS_FLAG, "X$1", "Q", -1, + -1, -1, -1); + assertEquals("Q", tuple.simpleClassName()); + assertEquals("X$1", tuple.outerClassString()); + } +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/SegmentConstantPoolArrayCacheTest.java b/src/test/java/org/apache/harmony/unpack200/tests/SegmentConstantPoolArrayCacheTest.java new file mode 100644 index 0000000..8823195 --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/SegmentConstantPoolArrayCacheTest.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.harmony.unpack200.tests; + +import java.util.List; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.SegmentConstantPoolArrayCache; + +public class SegmentConstantPoolArrayCacheTest extends TestCase { + + public void testSingleSimpleArray() { + SegmentConstantPoolArrayCache arrayCache = new SegmentConstantPoolArrayCache(); + String array[] = {"Zero", "One", "Two", "Three", "Four"}; + List list = arrayCache.indexesForArrayKey(array, "Three"); + assertEquals(1, list.size()); + assertEquals(3, ((Integer)list.get(0)).intValue()); + } + + public void testSingleMultipleHitArray() { + SegmentConstantPoolArrayCache arrayCache = new SegmentConstantPoolArrayCache(); + String array[] = {"Zero", "OneThreeFour", "Two", "OneThreeFour", "OneThreeFour"}; + List list = arrayCache.indexesForArrayKey(array, "OneThreeFour"); + assertEquals(3, list.size()); + assertEquals(1, ((Integer)list.get(0)).intValue()); + assertEquals(3, ((Integer)list.get(1)).intValue()); + assertEquals(4, ((Integer)list.get(2)).intValue()); + } + + public void testMultipleArrayMultipleHit() { + SegmentConstantPoolArrayCache arrayCache = new SegmentConstantPoolArrayCache(); + String arrayOne[] = {"Zero", "Shared", "Two", "Shared", "Shared"}; + String arrayTwo[] = {"Shared", "One", "Shared", "Shared", "Shared"}; + + List listOne = arrayCache.indexesForArrayKey(arrayOne, "Shared"); + List listTwo = arrayCache.indexesForArrayKey(arrayTwo, "Shared"); + // Make sure we're using the cached values. First trip + // through builds the cache. + listOne = arrayCache.indexesForArrayKey(arrayOne, "Two"); + listTwo = arrayCache.indexesForArrayKey(arrayTwo, "Shared"); + + assertEquals(1, listOne.size()); + assertEquals(2, ((Integer)listOne.get(0)).intValue()); + + // Now look for a different element in list one + listOne = arrayCache.indexesForArrayKey(arrayOne, "Shared"); + assertEquals(3, listOne.size()); + assertEquals(1, ((Integer)listOne.get(0)).intValue()); + assertEquals(3, ((Integer)listOne.get(1)).intValue()); + assertEquals(4, ((Integer)listOne.get(2)).intValue()); + + assertEquals(4, listTwo.size()); + assertEquals(0, ((Integer)listTwo.get(0)).intValue()); + assertEquals(2, ((Integer)listTwo.get(1)).intValue()); + assertEquals(3, ((Integer)listTwo.get(2)).intValue()); + assertEquals(4, ((Integer)listTwo.get(3)).intValue()); + + List listThree = arrayCache.indexesForArrayKey(arrayOne, "Not found"); + assertEquals(0, listThree.size()); + } + +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/SegmentConstantPoolTest.java b/src/test/java/org/apache/harmony/unpack200/tests/SegmentConstantPoolTest.java new file mode 100644 index 0000000..c443d0a --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/SegmentConstantPoolTest.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.CpBands; +import org.apache.harmony.unpack200.Segment; +import org.apache.harmony.unpack200.SegmentConstantPool; + +/** + * Tests for org.apache.harmony.unpack200.SegmentConstantPool. + */ +public class SegmentConstantPoolTest extends TestCase { + + public class MockSegmentConstantPool extends SegmentConstantPool { + + public MockSegmentConstantPool() { + super(new CpBands(new Segment())); + }; + + public int matchSpecificPoolEntryIndex(String[] classNameArray, + String desiredClassName, int desiredIndex) { + return super.matchSpecificPoolEntryIndex(classNameArray, + desiredClassName, desiredIndex); + }; + + public int matchSpecificPoolEntryIndex(String[] classNameArray, + String[] methodNameArray, String desiredClassName, + String desiredMethodRegex, int desiredIndex) { + return super.matchSpecificPoolEntryIndex(classNameArray, + methodNameArray, desiredClassName, desiredMethodRegex, + desiredIndex); + }; + + public boolean regexMatchesVisible(String regexString, + String compareString) { + return SegmentConstantPool.regexMatches(regexString, compareString); + } + } + + String[] testClassArray = { "Object", "Object", "java/lang/String", + "java/lang/String", "Object", "Other" }; + String[] testMethodArray = { "()", "clone()", "equals()", "", + "isNull()", "Other" }; + + public void testMatchSpecificPoolEntryIndex_SingleArray() throws Exception { + MockSegmentConstantPool mockInstance = new MockSegmentConstantPool(); + // Elements should be found at the proper position. + assertEquals(0, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, "Object", 0)); + assertEquals(1, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, "Object", 1)); + assertEquals(2, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, "java/lang/String", 0)); + assertEquals(3, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, "java/lang/String", 1)); + assertEquals(4, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, "Object", 2)); + assertEquals(5, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, "Other", 0)); + + // Elements that don't exist shouldn't be found + assertEquals(-1, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, "NotThere", 0)); + + // Elements that exist but don't have the requisite number + // of hits shouldn't be found. + assertEquals(-1, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, "java/lang/String", 2)); + } + + public void testMatchSpecificPoolEntryIndex_DoubleArray() throws Exception { + MockSegmentConstantPool mockInstance = new MockSegmentConstantPool(); + // Elements should be found at the proper position. + assertEquals(0, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, testMethodArray, "Object", "^.*", 0)); + assertEquals(2, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, testMethodArray, "java/lang/String", ".*", 0)); + assertEquals(3, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, testMethodArray, "java/lang/String", + "^.*", 0)); + assertEquals(5, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, testMethodArray, "Other", ".*", 0)); + + // Elements that don't exist shouldn't be found + assertEquals(-1, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, testMethodArray, "NotThere", "^.*", 0)); + + // Elements that exist but don't have the requisite number + // of hits shouldn't be found. + assertEquals(-1, mockInstance.matchSpecificPoolEntryIndex( + testClassArray, testMethodArray, "java/lang/String", + "^.*", 1)); + } + + public void testRegexReplacement() { + MockSegmentConstantPool mockPool = new MockSegmentConstantPool(); + assertTrue(mockPool.regexMatchesVisible(".*", "anything")); + assertTrue(mockPool.regexMatchesVisible(".*", "")); + assertTrue(mockPool.regexMatchesVisible("^.*", "")); + assertTrue(mockPool.regexMatchesVisible("^.*", "stuff")); + assertFalse(mockPool.regexMatchesVisible("^.*", "init>stuff")); + assertFalse(mockPool.regexMatchesVisible("^.*", ".*", "")); + } +} \ No newline at end of file diff --git a/src/test/java/org/apache/harmony/unpack200/tests/SegmentOptionsTest.java b/src/test/java/org/apache/harmony/unpack200/tests/SegmentOptionsTest.java new file mode 100644 index 0000000..30c36af --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/SegmentOptionsTest.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import junit.framework.TestCase; + +import org.apache.harmony.pack200.Pack200Exception; +import org.apache.harmony.unpack200.SegmentOptions; + +/** + * + */ +public class SegmentOptionsTest extends TestCase { + + public void testUnused() { + int[] unused = new int[] { 3, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31 }; + for (int i = 0; i < unused.length; i++) { + try { + new SegmentOptions(1 << unused[i]); + fail("Bit " + + unused[i] + + " should be unused, but it's not caught during construction"); + } catch (Pack200Exception e) { + assertTrue(true); + } + } + } +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/SegmentTest.java b/src/test/java/org/apache/harmony/unpack200/tests/SegmentTest.java new file mode 100644 index 0000000..25c7c24 --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/SegmentTest.java @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.Segment; + +/** + * Tests for org.apache.harmony.unpack200.Segment. + */ +public class SegmentTest extends TestCase { + + InputStream in; + JarOutputStream out; + File file; + + protected void tearDown() throws Exception { + super.tearDown(); + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + file.delete(); + } + + public void testJustResources() throws Exception { + in = Segment.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/JustResources.pack"); + file = File.createTempFile("just", "resources.jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Segment segment = new Segment(); + segment.unpack(in, out); + } + + public void testInterfaceOnly() throws Exception { + in = Segment.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/InterfaceOnly.pack"); + file = File.createTempFile("Interface", "Only.jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Segment segment = new Segment(); + segment.unpack(in, out); + } + + public void testHelloWorld() throws Exception { + in = Segment.class + .getResourceAsStream("/org/apache/harmony/pack200/tests/HelloWorld.pack"); + file = File.createTempFile("hello", "world.jar"); + out = new JarOutputStream(new FileOutputStream(file)); + Segment segment = new Segment(); + segment.unpack(in, out); + out.close(); + out = null; + JarFile jarFile = new JarFile(file); + file.deleteOnExit(); + + JarEntry entry = jarFile + .getJarEntry("org/apache/harmony/archive/tests/internal/pack200/HelloWorld.class"); + assertNotNull(entry); + InputStream ours = jarFile.getInputStream(entry); + + JarFile jarFile2 = new JarFile(new File(Segment.class.getResource( + "/org/apache/harmony/pack200/tests/hw.jar").toURI())); + JarEntry entry2 = jarFile2 + .getJarEntry("org/apache/harmony/archive/tests/internal/pack200/HelloWorld.class"); + assertNotNull(entry2); + + InputStream expected = jarFile2.getInputStream(entry2); + + BufferedReader reader1 = new BufferedReader(new InputStreamReader(ours)); + BufferedReader reader2 = new BufferedReader(new InputStreamReader(expected)); + String line1 = reader1.readLine(); + String line2 = reader2.readLine(); + int i = 1; + while (line1 != null || line2 != null) { + assertEquals("Unpacked class files differ", line2, line1); + line1 = reader1.readLine(); + line2 = reader2.readLine(); + i++; + } + reader1.close(); + reader2.close(); + } + +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/SegmentUtilsTest.java b/src/test/java/org/apache/harmony/unpack200/tests/SegmentUtilsTest.java new file mode 100644 index 0000000..caf304e --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/SegmentUtilsTest.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.IMatcher; +import org.apache.harmony.unpack200.SegmentUtils; + +public class SegmentUtilsTest extends TestCase { + + private static class MultipleMatches implements IMatcher { + + private final int divisor; + + public MultipleMatches(int divisor) { + this.divisor = divisor; + } + + public boolean matches(long value) { + return value % divisor == 0; + } + + } + + public static final IMatcher even = new MultipleMatches(2); + public static final IMatcher five = new MultipleMatches(5); + + public void testCountArgs() { + assertEquals(0, SegmentUtils.countArgs("()V")); + assertEquals(1, SegmentUtils.countArgs("(D)V")); + assertEquals(1, SegmentUtils.countArgs("([D)V")); + assertEquals(1, SegmentUtils.countArgs("([[D)V")); + assertEquals(2, SegmentUtils.countArgs("(DD)V")); + assertEquals(3, SegmentUtils.countArgs("(DDD)V")); + assertEquals(2, SegmentUtils.countArgs("(Lblah/blah;D)V")); + assertEquals(3, SegmentUtils.countArgs("(Lblah/blah;DLbLah;)V")); + } + + public void testCountInvokeInterfaceArgs() { + assertEquals(1, SegmentUtils.countInvokeInterfaceArgs("(Z)V")); + assertEquals(2, SegmentUtils.countInvokeInterfaceArgs("(D)V")); + assertEquals(2, SegmentUtils.countInvokeInterfaceArgs("(J)V")); + assertEquals(1, SegmentUtils.countInvokeInterfaceArgs("([D)V")); + assertEquals(1, SegmentUtils.countInvokeInterfaceArgs("([[D)V")); + assertEquals(4, SegmentUtils.countInvokeInterfaceArgs("(DD)V")); + assertEquals(3, SegmentUtils + .countInvokeInterfaceArgs("(Lblah/blah;D)V")); + assertEquals(4, SegmentUtils + .countInvokeInterfaceArgs("(Lblah/blah;DLbLah;)V")); + assertEquals(4, SegmentUtils + .countInvokeInterfaceArgs("([Lblah/blah;DLbLah;)V")); + } + + public void testMatches() { + long[] oneToTen = new long[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + assertEquals(6, SegmentUtils.countMatches(new long[][] { oneToTen, + new long[] { 5, 6, 7 } }, even)); + assertEquals(5, SegmentUtils.countMatches(new long[][] { oneToTen }, + even)); + assertEquals(5, SegmentUtils.countMatches(oneToTen, even)); + assertEquals(3, SegmentUtils.countMatches(new long[][] { oneToTen, + new long[] { 5, 6, 7 } }, five)); + assertEquals(2, SegmentUtils.countMatches(new long[][] { oneToTen }, + five)); + assertEquals(2, SegmentUtils.countMatches(oneToTen, five)); + } +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/bytecode/ByteCodeTest.java b/src/test/java/org/apache/harmony/unpack200/tests/bytecode/ByteCodeTest.java new file mode 100644 index 0000000..3d3e33f --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/bytecode/ByteCodeTest.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.harmony.unpack200.tests.bytecode; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.bytecode.ByteCode; + +public class ByteCodeTest extends TestCase { + + public void testByteCode() { + assertEquals("nop", ByteCode.getByteCode(0).getName()); + assertEquals("return", ByteCode.getByteCode(-79).getName()); + assertEquals("return", ByteCode.getByteCode(177).getName()); + } +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/bytecode/ClassFileEntryTest.java b/src/test/java/org/apache/harmony/unpack200/tests/bytecode/ClassFileEntryTest.java new file mode 100644 index 0000000..bbe808a --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/bytecode/ClassFileEntryTest.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.harmony.unpack200.tests.bytecode; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.bytecode.CPDouble; +import org.apache.harmony.unpack200.bytecode.CPFloat; +import org.apache.harmony.unpack200.bytecode.CPInteger; +import org.apache.harmony.unpack200.bytecode.CPLong; +import org.apache.harmony.unpack200.bytecode.CPMember; +import org.apache.harmony.unpack200.bytecode.CPString; +import org.apache.harmony.unpack200.bytecode.CPUTF8; +import org.apache.harmony.unpack200.bytecode.SourceFileAttribute; + +public class ClassFileEntryTest extends TestCase { + + public void testUTF8() { + CPUTF8 u1 = new CPUTF8(new String("thing"), 1); //$NON-NLS-1$ + CPUTF8 u2 = new CPUTF8(new String("thing"), 1); //$NON-NLS-1$ + CPUTF8 u3 = new CPUTF8(new String("otherthing"), 2); //$NON-NLS-1$ + checkEquality(u1, u2, "thing", u3); + } + + private void checkEquality(Object equal1, Object equal2, String toString, + Object unequal) { + assertEquals(equal1, equal2); + assertEquals(equal1.hashCode(), equal2.hashCode()); + assertTrue(equal1.toString().indexOf(toString) >= 0); + assertFalse(equal1.equals(unequal)); + assertFalse(equal2.equals(unequal)); + assertFalse(unequal.equals(equal1)); + assertFalse(unequal.equals(equal2)); + } + + public void testSourceAttribute() { + SourceFileAttribute sfa1 = new SourceFileAttribute(new CPUTF8( + new String("Thing.java"), 1)); //$NON-NLS-1$ + SourceFileAttribute sfa2 = new SourceFileAttribute(new CPUTF8( + new String("Thing.java"), 1)); //$NON-NLS-1$ + SourceFileAttribute sfa3 = new SourceFileAttribute(new CPUTF8( + new String("OtherThing.java"), 2)); //$NON-NLS-1$ + checkEquality(sfa1, sfa2, "Thing.java", sfa3); //$NON-NLS-1$ + } + + public void testCPInteger() { + CPInteger cp1 = new CPInteger(new Integer(3), 3); + CPInteger cp2 = new CPInteger(new Integer(3), 3); + CPInteger cp3 = new CPInteger(new Integer(5), 5); + checkEquality(cp1, cp2, "3", cp3); //$NON-NLS-1$ + } + + public void testCPLong() { + CPLong cp1 = new CPLong(new Long(3), 3); + CPLong cp2 = new CPLong(new Long(3), 3); + CPLong cp3 = new CPLong(new Long(5), 5); + checkEquality(cp1, cp2, "3", cp3); //$NON-NLS-1$ + } + + public void testCPDouble() { + CPDouble cp1 = new CPDouble(new Double(3), 3); + CPDouble cp2 = new CPDouble(new Double(3), 3); + CPDouble cp3 = new CPDouble(new Double(5), 5); + checkEquality(cp1, cp2, "3", cp3); //$NON-NLS-1$ + } + + public void testCPFloat() { + CPFloat cp1 = new CPFloat(new Float(3), 3); + CPFloat cp2 = new CPFloat(new Float(3), 3); + CPFloat cp3 = new CPFloat(new Float(5), 5); + checkEquality(cp1, cp2, "3", cp3); //$NON-NLS-1$ + } + + public void testCPString() { + CPString cp1 = new CPString(new CPUTF8(new String("3"), 3), 3); + CPString cp2 = new CPString(new CPUTF8(new String("3"), 3), 3); + CPString cp3 = new CPString(new CPUTF8(new String("5"), 5), 5); + checkEquality(cp1, cp2, "3", cp3); //$NON-NLS-1$ + } + + public void testCPField() { + CPMember cp1 = new CPMember(new CPUTF8("Name", 3), new CPUTF8("I", 4), + 0, null); + CPMember cp2 = new CPMember(new CPUTF8("Name", 3), new CPUTF8("I", 4), + 0, null); + CPMember cp3 = new CPMember(new CPUTF8("Name", 3), new CPUTF8("Z", 5), + 0, null); + CPMember cp4 = new CPMember(new CPUTF8("GName", 6), new CPUTF8("I", 4), + 0, null); + checkEquality(cp1, cp2, "Name", cp3); //$NON-NLS-1$ + checkEquality(cp1, cp2, "I", cp4); //$NON-NLS-1$ + } + +} diff --git a/src/test/java/org/apache/harmony/unpack200/tests/bytecode/ConstantPoolTest.java b/src/test/java/org/apache/harmony/unpack200/tests/bytecode/ConstantPoolTest.java new file mode 100644 index 0000000..283d3e9 --- /dev/null +++ b/src/test/java/org/apache/harmony/unpack200/tests/bytecode/ConstantPoolTest.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.apache.harmony.unpack200.tests.bytecode; + +import junit.framework.TestCase; + +import org.apache.harmony.unpack200.Segment; +import org.apache.harmony.unpack200.bytecode.CPClass; +import org.apache.harmony.unpack200.bytecode.CPMember; +import org.apache.harmony.unpack200.bytecode.CPUTF8; +import org.apache.harmony.unpack200.bytecode.ClassConstantPool; + +public class ConstantPoolTest extends TestCase { + + private ClassConstantPool pool; + + public void setUp() { + pool = new ClassConstantPool(); + } + + public void testDuplicateUTF8() { + CPUTF8 u1 = new CPUTF8("thing", 1); + CPUTF8 u2 = new CPUTF8("thing", 1); + pool.add(u1); + pool.add(u2); + assertEquals(1, pool.size()); + } + + public void testDuplicateField() { + CPMember cp1 = new CPMember(new CPUTF8("name", 1), new CPUTF8("I", 2), + 0, null); + pool.add(cp1); + pool.addNestedEntries(); + assertEquals(2, pool.size()); + CPMember cp2 = new CPMember(new CPUTF8("name", 1), new CPUTF8("I", 2), + 0, null); + pool.add(cp2); + pool.addNestedEntries(); + assertEquals(2, pool.size()); + } + + public void testIndex() { + pool.add(new CPUTF8("OtherThing", 1)); + CPUTF8 u1 = new CPUTF8("thing", 2); + pool.add(u1); + pool.resolve(new Segment()); + assertTrue(pool.indexOf(u1) > 0); + } + + public void testEntries() { + pool.add(new CPClass(new CPUTF8("RandomClass", 1), 10)); + pool.add(new CPClass(new CPUTF8("RandomClass2", 2), 20)); + assertEquals(2, pool.entries().size()); + } +} diff --git a/src/test/resources/org/apache/harmony/pack200/tests/HelloWorld.pack b/src/test/resources/org/apache/harmony/pack200/tests/HelloWorld.pack new file mode 100644 index 0000000000000000000000000000000000000000..7445d85a49aa130ab34495c2259c82f8d9ed3537 GIT binary patch literal 530 zcmXX@&ui2`6rT4clcbxrwzX>2MR$90bD5<=FWU-&h${;U!g}awx|=3xvq?!}rT<9( zj<$!M>&ex!prAJ|o;+A6cu<7y#y6=Sk2i1Lyr18EoP3(G4o=umu=Dp{|2&3eh5#U( zX&V`1O&|?ql)(QM+7-OPD3Bc7HiQY_03ZiWsTvE8DF6(yhL-W5(QUWejg5^?tJ7+9 z>1cG_h_<#$FyI{Ur6J+Eu;4lYvSHNxUyr+6%%xPv%~hXOc>JX{;hi zK|3qWrYt9Ttp|9M@9IuboCjg{`|R6r{qyjGvoFQjdF^z3dAiQ*o3xskMgtMyx`CV_ zPA&-ym&t_{v>&coNPH1bP?BM45((B{9anM#45tcxBZ6m56VXE3xr$;Hgm>fWhjEqk z_i>dO98ChzjL!VxEymf>?K^j?OZV>AiQcQEn$W%Lv-O#4bEcqrx+Q&v`@@|ZX_+6n hKTBC0xfi3O;&|cYsDQ&lxxXf~NLhs&0?^bZ{|6b*h{pf` literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/InterfaceOnly.pack b/src/test/resources/org/apache/harmony/pack200/tests/InterfaceOnly.pack new file mode 100644 index 0000000000000000000000000000000000000000..a2e0770902df4c23b9cf78c3c1f14a8d330b3cc2 GIT binary patch literal 137 zcmX^0?*cFTv`RKi}6i#8KDN&rRRg z(a+P(H8@1i*DWnSKP#~;Q9ma!FJ0e1DJwO(go&AngMonwgbwl^6lG?RWVrGFC(Csp gW@PeB%*#wmEiTawOD!tS%+Iq@Fw`^P<>KW603!z`DF6Tf literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/JustResources.pack b/src/test/resources/org/apache/harmony/pack200/tests/JustResources.pack new file mode 100755 index 0000000000000000000000000000000000000000..369146728b690c06ba795e07fed5d83cffc7e29e GIT binary patch literal 51 ycmX^0?*cFTGy?`LhEK;u5`*iV{YijMSW*e1-D-qMQ^i09HN*Dl-5801>qxn*aa+ literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/LargeClass.pack.gz b/src/test/resources/org/apache/harmony/pack200/tests/LargeClass.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..0504773bf7f787165e263fec7cf5a6090c7489b2 GIT binary patch literal 752 zcmVnm@o1$&nQp!`bJStTRYO$#J z3N*BVHmPak;fss@3;q$#c;G((=|MSpaGdd=qX)-}jx!E3FlwzS$b^G4A`W;+KKq-^ zH@lntp7Psdcj3o#6ZP-~0Iw#&!pASKI}2Wt04H$(0RT>jy3{XtTvqXznv( z7+3>ty~K69Ewh80n8JjU2x0|BoG@AtK~OY}C<_gBv!X1|uFAvY>*- zbhHeCVF=FYDM5!IrVXFblWJT?(~w#4hypo;y#cGmX|-D4BkLOFe^5xxEE`fwXoCa) zMd==!^LUKb{ZQ*@61bSJbTrNKZ0(1c9NtPCBioRV^3gtv21}8)OGXbpG##1ynX-&; zCO4Bq6kT927MjdEEJej7rDfKg<+~~>tEzYJvF+Wr|G>dRhimM$M~*t2jJj#p+|qii z?f40Qdq-zi;AD63)ajm3Z{L}-=feHxBLf#MUK+f7Ep(wY0H>7Sa|x zcp$@cXt!=>H#4&h_=os^@F$R%7)dn7L=Hlt9*kEnCK^S2yIm-t5GQH(z3+YRy>H&k z?EQX|ia*;&Xzx0D`{VoP2hj-y!5T_v$Tw!yh@z+ggwQBL<2U9|GOi#^i6-MQbu_L; zMq{zDL@Y8nqD7V4)8)0tOLNm}2C=aaE|zVVI~_`7#$uMtEzMPmjr>fxS~4s7YPnRb zH;hWDwpwkJD@91eyd^rghfN!^mbpM(P6?K@xxC@ms7r3K7G}(mSXvG<^QUHwO3Hj= z#j!22-NhD@R7kVn%XnnT_JArH5E!^^OZ2eq(XGjAioaB4Bo>9u4y!6sRRDhef@R#A zhy^hPP$h;SgcM~rwR<%6^5`&u)F_PWW*P0i`w;zfGzIxU9;aFY$dHJTmhk^0%GhuO zzIVRt9Pb>XArwK;Nwlw_=i1lT-(H~l!N>RcL--xM0?+S-DwtWDpm=7Dashhpr)Q13 zsbngdncwQ#>0Ter>VWEL%81j18D;g=Mrr1rKA!{L=}~}_7hVx!TB=tHs(?)q0qpR9jrFmK*C2 zmn%iH6P%|m;n@sa=Km6 zlY@?-<)dLC5jf^KZ^N_fX5FR4_d>S-shBkbBy4x_Ac@1lfM*yaP(F|V8Sq3szqbf| u^E{9-FLnu$6B*D_dYp#rzH_;Pe%u!j@PcxK0;k(OKgB=wU885!1ONc23tfo- literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/annotationsUnpacked.jar b/src/test/resources/org/apache/harmony/pack200/tests/annotationsUnpacked.jar new file mode 100644 index 0000000000000000000000000000000000000000..0476d2fe24926a0ac30f5747199ae3727b124d56 GIT binary patch literal 2267 zcma)7&2A$_5U%!bY+@2NY#{7mjSs8MuHs2JkQF#tS&l6n$Btz?=CDGm_P940GoCT? z6J_^;R^l0W0q#g}LD~Zkz=@aO3U7e;y2tj|W&-O`x4WyWzOJdNucqCIC$c1ehyC&4 z&)>%W+`(Fo_c5B)UU{$Hs%gz~t6r;id&Oq0$t~lBaJ{|0a9qQ-KFc2z_jB1?wmpX` z04nw4v*Pl#m z$BRY^qGbEt#P?=k_mMqS!4=7lFAeW%p_EoA^O2%V zA0<&T5Q}3*3GQ5?;39~V7<0oyncj*GWADm%N4sFe-59K8-44ZFx5X1uI?BU*%B4yEj|{G_Tb%%_{)x<(O*-zB< pkqlOCaS<%4azn7+lVKgV8_ASBN#Z$ybFb0_lC{f~#wYvx{{SFWN{;{l literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/hw.jar b/src/test/resources/org/apache/harmony/pack200/tests/hw.jar new file mode 100644 index 0000000000000000000000000000000000000000..ab58dd5620839abc4dd69059979cd3631f333f8c GIT binary patch literal 842 zcmWIWW@h1HU}E54*x@H?D&hL}d@K_KgDDFGgA)S-Lw-@Zequplaz?6tMq*KJeqN=1 zVo`ENW?8C!NosLPv3_P=NorAEVvasgQMQqRfxbs-PELM!eo;<}UUE)iaq-f?+kV1< zBC+k$rcDd<+R3FQ6nI+0=ODLIN2uP$C4s^`c3)m@k-6RYl4mBLM*M^KD^4anYL-*0Ks}J@Gz4&ci5tf~_?9s1RM;%u$ zJ9K^1vyJNUoUbn3p0;rH`MD`&+7=wIvkre1QS-D*{U`Qi)3fuuC4W4QKlc%hn)op! z(PpcVus{^=M@|3V&v?$gKC^aX(p;Ydp+1+>Zl!_e^veH@%-DGmu)liZmC~AS0Vd#lKYGoOpEn| zV^fyQPr5s2-e0x=Z$>6A2HeRPn1Yc2<%v1Ko0Sb@AR`bK0O`HJtisL^;OOiPO!@#j C`*d>v literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/jars/ant.jar b/src/test/resources/org/apache/harmony/pack200/tests/jars/ant.jar new file mode 100644 index 0000000000000000000000000000000000000000..cf01339d1ca27532ce74075648f4ffcd8ff2ee70 GIT binary patch literal 958858 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%0Ac6u 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

+gYhZcD(>&y-9_Ya_ghfaZ_E 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É@kF-TH=gY0I{g>D6g2epHa4^b5Jj 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

GcI(y2usB#WCNBLs zq^b>u45ImF!ugo@pJs#6aZr4T#8dHTFrfd6PvGdqR9*`$(IH^i1YtmbNYZXmE5fjj*-~Ri-H7(rH*W)yKx}Oc@Vf>yfN%RO6P6?A$N=-QNl&3`fu!rd;PCkPL^301S zY~T{3A95>-Dq{Bwhlg`+vXIy@>2{^q=O)BX(sjAlw>Kb6u=3ggQk;VX2T9G(=t1

xZw&peOz$vJ zMP~k@k$B>c)FIeUcj)R}BNFgcn+6D*{R-{0n4a0R7i~R`wrPklCkv^VI`{Tg zq+G_|8mYj0s`}*+SEuPq@Z|LdJp=Nf9V1s|sMK>G1^0x!(M)O-r)p;B{OiErQO&}lOV9ZVjR&O`I~Lk1!hv5tRr;s zkR_@wab2S;KXM(1+UOg8U^`@)FGBOnhMf0Y6)JLD7c<)AGn&EB&MW4Jk)O$#jzEt# za@QXhLe(Ei@4-v|e7k?*rqfK2Vgp&HMu&LlJp{Y#cI1!7bR-e%_ta)&dd#_3UZs-* z&Ntz)=x020dadF=6|4`L)P#{xwBkJSVnh5(>yOjiA+@_x{2>eCi0pd_YDmU;PPw#0 zgyd+%`d@n^p<_nl42_+7ye^|`f*xNfiI`4T$GwN;n5vpz-=>g`rvW#che~HAViDW< zqycBHH-5{Yv2MveVCSzNP@Pcx9?Ui!qS@0aP?suSE%GwPrwHu{p>WD~qXFshC%6|K z2`*YYo)6FZ>$cw43zzSfF^^j^h?>7QNh+^J8h74`A3NzfnZDNX)?m z=Po~psNt(XFZB?I+Bec`a(=01@$q6wnbmZuEi2|F@P@@dV4V6ZAT^P|yrhA7Rxj0b z@xn7s*^0B`ILHeY;{r$HYF7N;F>j|?s@(zNlYr~OdE~1A7Mb&(KO}f0dyO$rgZ^B2 z06i9GivRKo1^@zH)Ey&95RA|pq#=3EKwEwZ$%wQnFtx&hElci1kwv|#2w^e4aT}$X z;Fk~)oelKRDUwZOZb8%oSS2Ov##zS$Y1^r1Dlt2*|F^=Np$=8G)dO%qj^D=>>uZWU zukgUXw^R~V#YH8q=8R!{(HvJ#m(yAToSG1bKLx~3a2?-)y1sP$NgEb$s%}O{V3ZZh zc7`wi+_6iNP4g?7y(*bV|3%q6dXzU-2pBeRSEN~Yu+i7 zX+~3iQB~+F&J{L1Ni5yjta2SX5XBe3US^ss3d{KD5*Ed70q^YTAf7q((_3;S;VEV| z0;tU^=fYKv7%;7V_6b>z+AiZZBc)`MoJtceZryzRB^mNNSrs{Z^|)KCD@~r*s*JwR z%o}VnI0(xHU4olaO`dIAmZ1>19hP%_Z^Qqvl5WxOG>BMZ0zTZgQzn zY4pTS7T^KETe80ejoOjMPK-D=$sWAh6SE5@PEFf0^$Tduyx(v>v#P~s^#=&rvqR?L zd6Vr9gBr5}05pFJH(q$#vlw!DULD&bYI3u@;4l3F&%*wEUXYhZ9j8LwF;9L6tgb2? zg#C1nkh$c<%E8 zgu>>8=yPi`XPC*;`UNYG!8ck+DOx`GlWB#`ya};_Mq=se$EB*;ZOU;mdQjQQIPfV` zO84evuV*Rh1TO7!HK!}-S0!v)O73G12?*^KcVP$+bJ9pv#c`o=cymfx`31We?{}eJ z5TdqQRkNZM=QJ88%sV)-+&mKF%#blZ1epS9f@>m`Br=tvF~-m2?fG4mO7?!4g5y_M z4oDV(Qgtz$>OAi4&wnQ||fq??A2Lu(g;-IIhqSPM>u`q3BLzqDz{H?tJLzd`nPz=gu%1Tdyyw!My1K)uC~kAKf< z?R5#OYo|2Kzy0iBX{rK}mY)rao+Gp@y}OgNVYJT_eg?2-{(c(lrNu$qBOYE%n~{Zh zS|hg0pM;nKrdtlRxl?NiwHXrn+;5*V9nyhhkBJ`i9s>S6Q>iwyXb(DA4tl=DhfvZC zUj5gyC%m?E9+;a5mizBl(bW4NlS~kws|j-?9h4o#LA5XABh=&;*Qh2@<0O%7q1fk5 zf8K47ygx|-{{Xwm<_;5Q#<&{U_Yu23#Y9)~yI1i&pR|#%g18!{T@-}R4d4!hU|0OR z{HkCprX6t~r;1Q5rFD+zlexFdCBq$Cx->z`bYfPNl*iR853i0gC)e!r z<-dz-L`};MeJzbL+w3ZHO(J=lX4Ai`6e8oOFa+B^NM2C`)RFq2=MlM&EM(-Gw+dU zv26K@Z+%3-X_eK6cl7n?tv}b+MtonZoC%bOedFH0$5qX%&fhz?x~s4*Ro9cDD7!c{ zapudaw#yYe7uPQCma<-Q(XO$}k8NMu<1tegO}IF@mrx(VJ>q?;v+HF681&hWpOdMl_|*qeySd@|eqrgoed^)&Qm0OH zVyY7f$ftJPV1KfVmh=N6LV>sV;8Ksv*8f7=_L3O&+PxirlT_Gl2&ug`$6>7nFv^)n zHQ<&1dZaZvbRQgrWtII5lviY!FFPmW*65P1I>$s)t5MSJlGj;eIMep}qux{0v4jhV z@kn?o-C5v&WG`AGJgxOuVIIf3NP3c7rj%$@>U?Nrmrk6X6PGfLy0ZsXX^oRDJ~MHo zF^ixozGyi=igKK2Ze&Gstg$Q|Zf^NR+Da_`qgC#QVAuV5&~pCsk+q}G!Dk>SuoqV% zG+OwA(tkz73Hg)ohAF4=JV`CS_o|8Iy#dFVDTz1{!I?=h&X) zd5_F?ZPvMqCZ!i6NU7-UnxgZS%oqEezjJ;hHqYrVGrSE7xZvi|*j|=vIpG^=g#d2w zAJV{1n6#~3$MwX+c* zZPR>EE<>sBr#R8((j=3nMus}^WAf&)NaOG%Z3C6+?8ul^_0S25y7K6lU*M}uwPQq+ zrRH;FndKj^74NvSq*P)c!@^C*Yq3~o%3>shpWP-3rJt|xsrFZ2bF!G-s@zh8?*i)0 zI_Io+w9{fxsQGo#yep0KLg9lCzH`#{J_(6M3Vv;)=bcJ^G5Dius+iV)b;KK5`vccW zX;cFJG$GN5-Zk!~X z!%X|FA2nHLqbvA+^wwtSHQN9F05kc$*YOr5VsLaW>{6?Lvozw1a@zpoAHx4$KZ#cI z0@gwMnFehC4HD!(>nFzl^PH=+p??-omITbVN$;86*T`)Qp;5u4$Z<3B^YUq-#Zd)8 zphEXej!l^v)3D799crw%&{x1XX2Uxy$Z{zcwTFt9m$hx1s(u0vKDJGt?cPmIC!Mb5 z$45s9t4{~d2lOXfo>$)=*KH@+JU8b8Ib1+6totK&tw`1pyC9VZ{Uc(0nDDx+j&p-z zESL+esnbJn^k$As5fR3^ZnP^6YP{1?BgPT1C#5fB9IE@!)YEFWqUZ|B4%y-NYPz}m z!st3`HV0G@t(<8QE|}T-!zy(H@CmgE5kqz;413GU1ok+X6Pn9I^+%g}eOpPJ+*vvm ztxf3>Y`U3!L)!Gys<*TRwbN1N1vxrfx?s9k01?=8xTcT@B+M?|K=*AAf+oKRsG7Bt zVanl6#b5`_pI4?IKB88Ah;)T2xkPPqFl)+g(_d$6Hu!{b=%oFYmpA88w|6LrzH=0Q z!u>p@ty^Soz~SLG=`!MhsAc1%b3 zEwEQ?M2M=_YEVq;jZ)zGQ@5Mw^+ExaFEw6-%h01>D+OL^3RIC+Xl|24frpXMV2pkQ6xx6dQh> zXz3c^Go;7ku_`Tw6#GK#@#1o8wvGO|!sEQGhN40-MldQ=QSrWgWg8vd+?k3y(K2R9 zvEMKG0c7gHQkrCWFn~(&`J5oFBqtJ#zlUqOm9EIXCNKIGY>tRUcz_3Q9weL!GE7;C zL_p&MIo}+<%>3W}L;>Xav48PbnzZPnRVVW;h5mbBOp3_S5WmiH`5Dr+lcVF!(vOkr zRiIqePydCHu_L)vKNwtK@Wsl%c93*Rvo^2g5P_k4d;F%YYvRL^5BiLw2Q7$oerpMQ zpZ6}VtQ{e|fh=QEkvHK+k7msMY7=PNGvPy7K^^?<5F>!6g<>m5Y9#tci8ND| zsli0HF1Ic~6w1_mHH|?Q=i^r^yfDv$oJXM6c?2$x+Dj3mP>#%ou1-rltv-@*tSSCp zX*cKAN)<(N281WK5wNdGkpS{>Hxjo>m!Ur+SU+HV36~6FfuKIh71dXF(tacPXA{ExQr_cp# zdEzY80AzT|Rvo7vT6{Kidaut+RFZx=ngAu(u^=Qg zA}!74lnz15)9RR0nI+NoE|RRR6tDg%TvjKtR~K!(DJ>!?jdSY5oQK!AEp&sIWWkJP zeX3WMK4o;!GzDt8m@gif#OeNp_vnzgZF8u@e9+?`(@ZAYY6af6mO(b>MM=DU{ZuPn zB$k9>d^fJ#1yQqIT`NN-AF}T#D>F$sQb=Fq0d#vS^7`FyC9#n6-QKkicS3m165YqQ z5_`CU1Gmr#pQ%vBA(EbJFl{0xgomYX!SOP~%KN^VBAgaCfR05)RHaB2JoxMnk3Wgz zg>2G>kf8=*;b>V0h|jdMg|;7O*3~i{+S@9@c_KMr+rmMI+%R2-)Jt1sIiIJdfLEODEnGXv3EJ_2Wy9b5P+U}V04B%8Hg z16vDcwRSP*=J`w%DuLnn9=L$|oI^fe;54R0bK+LwW^M9(?6{I4U1iL`HCp5x>ojB4 z2)-NU+1egnx1!HkS9fLzUUzeJh)#ENe8^UJ6CuT7cBYDFS04Uqe|gKE4%w7UGr-dT z()Qm&@fp3B?7)ZvZU2KW&jbmMruE-N#>o-*C>F|g^kdBz2#$#G~iY=2`%f8$h> zZjb?B_$yOm7e@zd-Dt*JD6S}2SL+ureksixYaD)X1>H;Sd^qM>xDQ z^+Ik!0W@vzFfkorIyFugW_Iv5`5SGm=@GW}(B^MClY(V?qHc>po@|>T3f4CoZaM?E zg4aJ{0q;?xe=`=XggHw$TyClZpf|0-kaKx`-X=iHu`C8uo`X84_IoRAUIaaPd$2d` zrcv`pCnW=M2JD53qK!EPuV>i=#taGK5T{w9fqNWmUU72esfX~x4}}~!GVYIb09|WV zudphC!o7(Xm;rCKft4E_dM~|!KdADw1CH<%eVHDKNCFv}S_F9=_PA`C3LLB?z!#Hg!_Vl9nV zM;!~e@*Zc7%eb9;imbz|?kpuMGQ?zJ{^amGL(fRsQ(8|mg~Z%!N9fc4qR2YQ1A{At zjk6+|!}Yd0RphYwaK1u`zfzySDLT1h%^Y%tx2YT9CFA?=ODA0;W9T z_Z94TYLxPfSW84MyQB&QgqWB0RTk&N5F&F-2O-PqCY_V#3xob)}I1Ix7R1ol{E zcT%4u;+s7IQY~ePS99xL43&8dM*2PDgm4J(Ms0+47{^M+U1HI(4Yw%h;?p=WfuMVf z{@a?VJ0s|sM2Kn9LjJ>PXPYkrb7s6r33a374qfu`WT*o^L5$H5Wp<+i9-3%b#zxG~ z;&MaG9~x47Y4W3KP~WPC>8c4cQp_S2VOl7n5~+ig>URUf$*#X9n+0xr?E9$&zy>rZ zXZQ^Lf03~2GlXH06@X`&jUbiZyCFE4DGqq+R&p|HF6QWc zY^dX~xK=2~bd9r&Sl(iV%BqfW>lO%MAO~v-y+;2*j;FC^4@leMcl{0@7z=94$Q8oi zx+4s5Xu1q})gFdy$%r=LMjbu=3MpebDkSgTX7HkvO?hK*d|dn9Q)Q9HjYG5A1!+YB z8XnMW#iGx%eo#K=+Vy&qS*xBaPFyOjLHn!_mE$T?S}5o(twDW!%`BzRHCdiLuY7n{>2*FRmOYV zNwFDnoDcoIcL6b}`%|%PoyCYDve2-D=nC63DQ0?9!+luuNDcc{D!WeowKcMHnPr+S)TxVBl6~=QH&kcDxfMYC=pm2#b zLER0C0AhNYAWsS6Xm+vK!#9;r5c2rozEzQ(X$mP!XrZtr}MV!a2vBn2cb~5dh zy|86AQwJWtU{XmKw8aH?JL)D7Ep!FpP@XE5;z+R5g(zk=Qz8Z^a63?VMR_l939RrK z$;|?nqUs60U&+((j-b@=j7WBjm=-)p+EEIN^z)rovSNr^{w;mZ2XAWsN8GfGqwM)$ zhr50PeaS(qy{Y91X;?E`FTKh$Jg7Now(>7Oz5OwOk!|E}h&rTO(rg!m=|d_${2$F! ztOQddIO3j7gZ(pF^^4@i)s{osvt(Y-cT*i@>z(*#%V|jW=0FlWh7Vd^3Sebx$h$bS zQD7lr#9|n1XnJA zKP;>PT01Fy$e}O;)a5-Guvp=o1jfn+JLrVqkYhxVn3hb$ZU&mfYJEzf7dsR`t}H(; zsnnzidQ%7QA6J_g?#eeYk1;Ju%Q=wt!lqHD6lOle@2m4H}z42 z((sAR{(URS&1-t%40)eb0i3J zDTo6lX-q)G0YlUi2SU{dnnnhGC*WwFWeUlh@;5UTa+H0qvL}iAf;OXpd%aN5hr)c& z6tX_`FYOrU;j@37LSbaHht zW$zT->9=$X$2NblZQHhuj%_;~+qP}1W81bmPC7;hU-q}(J;wRJH)o&QXFPW`*Q%O5?G8WrkUu6F z@qj8wQ++_btH|mLpJ6d5br5K)|9u+BMp!6Rs(mf-(m^=!fQZDM6%IM%f^C#8Xbg|{ zxBEQA`f!9g##{s#L7LUi2yyn$+1jn^s<;@PfGTd)d*6a8&Uw@iQ?2Cw%}+8@R}MWb zS=UduSxOyRy(KP>6;V9%0RI)cO6y?;#Y_F7$dnVeleysjA?3EROTMx@KKSPQyDN96 zy76D1Bt8X4xG@GkSR?&um&U?{6ZJ$*riyy+r+=7XxKL7D1_GHcJ|3FG4Gav&1kG^+ zB^$TZ>>x&|--IObT?IM7L@1O@ED8-1x-0|_dmD}m5sas`a#m#rIcUoS)Ft>kd3?)B zX>;SnsDTI7Un)b!)(O-f-t$;0Ys3Z`7X)V#1T5Y%DgD)=k`;0@Dry0prUnq z$5Q9~1hK~R4+8V$S-r*5J$(r?JkedmFf`{H+N1MYBe7K@sMHjt@i4@?B!NNK1V){U z88-RS_Cl~=tp&0)Jye>9kpHX$3fx;iu)#3(gKfD=EBsl>NhfNat1kbE>8%3I{6RhL z^*rcgWDlNnsKo_UrqW`C6u!iE`DosZri#wG!olcltpig9gSZ9W6w!JIy2P86YVYW% zP~k)s>OzpMr6$=ug>?S6QdfkLU5Lq$Hi)<+n_RumVi=T7nv9j2#ITeZ<~Nn`9;+$s zOUf;hawR-ZYKCT$->P+dsCbmWmQmd$o21IvMpHe=E9;UVj`{&qV>7b01LsSj~dPy&O!Ol8%mH7Rzr~j^KE|4O}imz3=)_oNPFQY z>dEd^vEl|EH5{&G;#Y6HDlx%~ba3a2@Z6?T##gRR^hXiAFZtzdMB`~F%+oT^Q|LtF zvs`0tH^;Itp430w5p8-};NTNhbIELs!d#%0DJ_g*T9A*C1ZI?-;PbQreBnE^ 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

EvnnGVhoI&cRUD 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%0D~>S7WFkC3 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

H|#_<7yifNxs=GlO`5cpSy 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

LaQI)-kKD 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%0DM0@0Fen%k6NgfD1+-+L<#<~lriFX~in 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 M93^*h%i^#90hr|g7ytkO literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/jndi-e1.pack.gz b/src/test/resources/org/apache/harmony/pack200/tests/jndi-e1.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..f88af2bfa18df50c7d18bb95c0b5c47104792dc7 GIT binary patch literal 75058 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 A9{>OV literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/jndi.jar b/src/test/resources/org/apache/harmony/pack200/tests/jndi.jar new file mode 100644 index 0000000000000000000000000000000000000000..b5cc32944757615216f741b53f85e8bc1d0f5fac GIT binary patch literal 236738 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
q;u$kkzZDT1 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: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 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/jndiUnpacked.jar b/src/test/resources/org/apache/harmony/pack200/tests/jndiUnpacked.jar new file mode 100644 index 0000000000000000000000000000000000000000..2fbd3973c94bbee419442b4b773eb74aa715fcab GIT binary patch literal 232433 zcma&N1CV81wk@2Mwr$(CZQHhO+qP}nW~FW0m8`^HU*G=w_5JRB9dE~pvv-^rbDp{O zSaWeKc_|=ZNPxdCm`D`1e?0v23*ygRMnqYFMnYDUPW~S-Kmc$6=sz$mGwOR~KmdR! z5C8z=e}~Bk$V!NcC@Is*i25k)+HKIo`^F`I4_qvgvV^J@ZU(;3x#oznP%3x!sD?TH z2r?3Dm5}&;*AWLVnB#r(?(6;iGjA;4B=V=&_Z+8%^E9nHAGEFWm{U@aIzAB|NZl(w z^bK|37;z^})yI$9zF&2P8h-t~(yN&4mNblxBTyLtZ+f zym-{iVYRSrue!|`*lNLOO@gZIKBsOC=w}qhl_NX9G(1BXy!-*zgahPaX4YnmhhZ0X z)LhtMV?`}BS&jXIW}<23plgwgjGnb=ie+;$m-+%lo~No^769_7qeLa9!*^oO4}jwP zx8CrP?El9-drlYNpwoAut{+#OuSw@rl`(Ynn0@6_+c;mhDUBjI(x8 zMM1~iOXcS+J006s1xD&M(Ud>l`t;W}U z7Okl^d}x)VMpn+rDKuwmKIHF{PAKC;IrrEzLQ@JU0+cwPog(7ne~Hta8VYrAb=QPo zO{x_Xbk_(V=RpZJ`Oa@Br#UoDK$eEfpy3|u@V{cD} zbmYE%=`=r+Zot*nj`2HvFH{`DS@vgf<;nfASx48g4b4q9CtpFH%9E~Y(Se97Wv>=E zSQ%ZY2u=NEQ%(QRPLQS3a#NSl`7@3>=o2$RS z-oJ|Wm#cpQ%?%uF>}>!2U2Oc#Gy4B-U}N$5 ze=5hn%#CgTy&Qj!;Qz^mqs_mQ@pl)r|KU~qD~i8dIGUJQI640-HU8=({vy@_C7N6E z2LJ%xpN@j^kFWnq&wr+#fQz&FpX9JGGH|xAvlVeSGO_>bf!4^{z{x2lPDV;l06BE` zzDatqdYTs%gv2sFVoDI4ihMZ6<>k<3JmPYz-OY9l4*Z?uS_^{a{l{nd+4K=%bpA*- z-Ol5*7ccMb&JX5>0ruV@4 zrRgb8))!E0kj1_q1V#ix1jqqLxkQ2SrmJXW&=5Sy28}5`6ns2(wq*(8L=*B?nC3%= z!dI96;bPD!H-69w_AT#TJtxKpKuiRA0;nKJspzd={n+S$>zA)=fds4fD&-vuurGuc zk2)2?beJ&0_9I}q^szo^w1>`kPm2bnw_*WQKTF8!gFxO9^vQ{0*pCri7^bnbo)a80 zo2@~JFOiV-YK&tHLmBJCfGL3i3aY`K)SKlwtsu>nY?>?HzksKjf`v9LGzHJKSV+<- zL$W`;w{NPwfBc_r`!7bIX-8@`{xBl+hY{BQ%!sU=vyzLwy`7`8iSggqNr~%{1^mO# z_kJaKV7dFbv^21^@PMq4p*#{yfyTD4Iw_;+I!RX(s1=mnU>ZFGK|}rOtwypMBQuo$$h{tT1&8m3n)2>FsgGe z96gPB`!g`fU$LUG=obV-?`8bxomh>gk3=tBuMLMLo>KOSB)&$}Rw23|tL^1?`AO=Dyy;Z)k1E9HLO-sea3Hl=+ zgv*8ny5PAI3&GhRvfjK$uBg2M{ySL{xMsX2f12^-2jEKd9^%mw^24ff4~0s>!d~D4f>3x=bg)k8oTQjSKsfK zG9LiCp}T=Yp(;3Cyj;cna>zkTQ;}dNl10Q)6k3`v8r&!EUTVsedIb!a#h5%Q#&pHK z7;2KV#GqB==2)y!1DS>NBe5jLqI@|)jjYQ;4%w;1U&|=3#k@j%gq*a(ORK9P8ESK- zX;bf}wavW~&FdG8Il>Cn3Aj1KU@AT0b}jhT=a?1;HD@U)=Zd-Rkp=xm=^hOQ`A#Z* z6=ac}8sf!g8t^6{I56AYDy-9ifroKbi7G|uep?<*h7m1dm6ayQNJ@#M6~HByL3D%T^0)@*9fop}vYXd`39R9>qWytj3`HnKb$C{I#({Jh^r-28m}ZUfPLbc4Iy zN2APoz`f>gN1Px(&P6kv)>RUkMqw$f+LfP6;OJ6LYRC1N%K48ZYOo7}Zk~t(#49U$ zxe_ID5bugz?Gt=#3QzAA78aKT-8Twl)=D$Wtxp3?OIQxw3o*ui5d^W768O8qCNhK`Jg;>A{v6t?f8;fNv@1P+vJJ@I7LzU_iYb zgl{+0jaG#cgGk0H1q__F_OdzkP2}yZ;P=Y2UMgp;zA=_;VZToMNd&p*4=*=Bvj`$L zU&FSwaS1SwpmE&V0ds4#b@Tqus9Q1PgMu@-@pix)p6=c8qp&PSk#7vg-eKL6>*z8o z@Tcej&(ZuOg&WU;_36NH`_s}-i)apNMD3D3vC_}d-1=oz+BJ#h%%CLUgrt4o-O@H- z+{n++1R7z(K11VFekccDuJ+ClBgE9QXnppssjVX1RpU4_zu}&kXIwdR_rkW@ z(N{8B5@dTm_g6W)AgMN=6qQ1saQLjnSr*A@(75)Yp)j;@)Dp+mdI z`0MvqGibf1E;olB(K8-Ds1ev587afxIqjb)8{}>KO(;mU6E@J}`D?hTmIfJfcetn~ z)l(5ETfcF+KNg>zMqKY=x%z^vTEP1b+($5Lu=l(H-Ne!TzwB=i5l{WL(r zkB+pLGv_>$T{uJd*$OWI{H)AF(w|2E;AzRyK-HfoP1Ug#nWzAgvq z2NBvqv)xa35g&&=rVBATH-`iL{9p_L2@W0YH3MjHj;hRnQD`m`%J!D=YEG_`_TqAiH)(-s9z{g+WNlMIaahsZV?hs$V%$mbmY6!sJNc+Z8!+58fM2`XnG@dr1e$KIph6+aSy?E#Duq=W zqyvf$z$~Uin7R6j@Di;oc0&YP_?ixJuR@4>Vt5(5!x|-bP`Zi0O|rxm7tK6c#R-or z;?$|+E4dSgVd`)`O@ojRt|k!iyfk9e{y0IY6z30LQo8U%63hEYD;N!&Sk?Y{NOsL1 zT2UqfyrKQHc{QCPR8@9xcm`kSysg;5eTMJp(Q}IZMS!@t;9#+F_^Z=%deuUsxD>qw zRT+oA#!*wxLT+#bT4a`&?&uZ~(^CU4WSKm&k0`&^W|Wj?MDIhrrecRV-{F=X6PSQ& zC{NkD%}eJq?5mjWxcOZ3ufaHT7n`AW>79btK@0pjtoFu0hADA;Irr;l9NI^#QosH- zbYnFG3Sjw@Y5{*zjpFaACS+i1Yv(NQXlG>dKSpaY%2IMm^2lGb(?J-aY|wB&M1ZBl zFzyG0;6r{CnF0y}YiNdIk!M&mT;ta|U+?sA9m*ns&xdp}4U}*peS&>}9Cp~4k(Uq~ zCoVp|_dcGTV}Ja9KgMP@rRWk4L(7%tWqeIc=T8W(gj$AP!lji~`F`?77qUinl3!q8HWh9< z>lUb@(FD;SLes=HnOD613R;jH-^D%3i$9i#d@`A>r=OI1f5>i=2q?XZ&`E65z`S#2 z@9Ug!BJ2?1TyJYHUQv9H*qH?p+q&5-=1syF>?3#?SAb+ePz%98Jp9Do=^zxYwR|=xvmtorg@Md+ zF3I?w+0J0O)Qmi%srn$&c-dGvdKwv`V$1Eo8#`K^TSTOCraa-AGjaGcO{;|8T0v(O zxyn4;&QpO7lfzeU#_5-Q)b=kqcu}xS1&GitW0iOmM4?1nM5IkQ%)A2(t{oxQBAmFS zxK#c=iN@Rw&Nc50RniWvXiOVk(&xl3co*Dv7X3S|a8$>~?WTLn>{$ z8?6=+5456usTD-6k1=KI_8sf&ia+)c_+D-B+cDE9rr>a&gLXmubJ~a!=n&Sv(({gl z^ucJ*od=R`YKa^pSG=27+po7trgP2W5*~1g%<~`NLz3DNhgl9z-$k`|<@O^NARud1 zq1&@G?i^vDY9--Te>i+{hg6O79-coe4K6D2T4yx3KKydBO)1WP4Wc`{ z7a~8Bp24ef{H_K%C9mDwwkL^xER?1T;gZ;tx_fW(r3H`l8C+%xkvIF$MF*p43`S_^ zT#?JU8nw{{Db2eT@2s}H(GILS@KT<5`eLs=h;txLrSAm*7{F=}ud8uL>1*4W;2MNd zX^{dh#1Krzi84;Hj^UOQg@6L}lM@Z1lfop|VgAs>wz4U0U>*J?H^};Og)aD{#6oyR z9u$bdYv)Oc_ut77tyv}gh64Z~CH!BeMM8Eq_I6Gd&L*-3HYWcy@~BaV@>X8X_|D^E z$}nb(2a^^QcNZZRB25B-q>QVEM~sGnn3PIJA)SB+C1X10hObA#n+vPCeyb#bG2#daV2Ah>(aZL zlb8Fo&j7%*yd>BTrJxyJD@aW>j1tnW_yZF5`1 zV3SN_EaBGH>DWwSU>e=ivwzJp7n1Z7Pcfu{pdsn1Ij2%Kiht>v?9jVC;Q9zUe;{o%+OYxnh9K+0>p__c}A1X-0Y@p47nBvh|PqEb)uYeb7u{1#G;#4pptbU zjI{a!Mmv>^D9z+pVXqVLIR#u2l((O6#&r)^f z^=9U5>CpEfT*Gt9Z z7_u(uf?P=nHr&S&rGgR37)2o3#S4f+6V7g8#2JZH=QqV~sjoI+fhl*^doekqL zsBEZR^B1C7SW;W<(=o1Wv~Gt=w$AMhOEI!+Uz!D-M#Jh^WB6z292@OAI|-Kq9O6Pm zgjJlPcZN4Au18NsH_02W!|56qtbDD*)3*~_xQh;{d5Bo!v#ww32W*eOmar8>*;%it z??u_!=f5FB(=yp6z9m}Ikc>VTAJ=!sGBe=x_U-tvXq>&jxL=YA5Zys#4vVC3%LggN;>0Q@CY0cK8NUwX4xx z8IpWXBOIu0u5Y+U^P-xpj9(n*%L$Dpwe@Q6P6ei7EZ(e>X3qu^m~jXEus*-T4hxlX zzO@O(Wo4(ze0Vd;e$Ucu48spNF$%A6@ebGzImP*@tHW?*{FZe2a^m6GCeD1!_n3YE zJoR?I>A#p5D57PZ-kPZ9(01O~6)t=~&&3mFBaS-ejdlWz9pxj0K zDSps_zpDM{yW1n>@J`z5f#5^9>-J9r`3M7RJ81Vu0?b9etM<=>ct!ichh{I?PX(xp za@Xna_b4Bd2K=Gej|J#UvL^%QdLRPF8|OziI`azl<6Aje>n_;ek9zdfUc2AQ+9EnG z_`#s0O+j10Kv{}=w3R$n6D6{=#GsK=oK=7XCqccPX?qt(wi?_;EJReSJ4{9`yasKR zw9$~=@si)P$lRltZZwsOAUJJoF(TJqix_hhdD4%FkC`tFkW&DTGJgr!A}ju&6Va&p z31F3X^L);3B8p#WdAK?#$tu74i+-n$FH&n27?x@l z?rvphp}s;Qxaf)177y-5i~_cNLR$qr%^v4V^qu?X#T^P`#$ZQUBzk%mb!(V=7xXS; zhHozNvG1Irr#i>D6THzS-hftsm`cbXgf*UGNL9xj#TD2!#|B}60ze#X+ODCfP#7mokDj+HkX7q88_lIGZ+Rt zE4-R`E?q{W>k^(qkz2uNgFbu_;IU+NyO0vglhEtu7t<{m>~h))?EVmsc?Dg~BAL^r z)apf2Ml49|i9j;gg%v6Eew?FIpwnmI`$B0Z!H0p&V=j}OlNC7LIh|8D@^{rExvi!X zx?k?4^RxrU2{Lr$dw$*CAPBG8059`WGV8UFO8z8AFq321T?|RDiBL4da?6z5*PFK27hw{xRM%Wgw{e6DRqN;4(m-xX80dCdf>I4nc z$L(cKl`;tz_%4b8UFBu)00tI8n`93Qc(!-#E`_2f^#rN|{FNzNlDaFQ3~S$RED>4A zSdtUb8k->!tQg)jCp^htR3adO755$5oTaQm_vu?MB0*!%dA__;>!%wbkQ+91k}fpb zrKkZy-j8D`N*o!PG4SqbApq{Fw_n&gcc;=n%H(GpFm?6Y`-ZpE<^$F0f$I(&yF*jl zb6QSSR2%dfm%0arR((!jj(C(~4$GxK0b`8;d!|V=xO2gsM_4~}+y~FYL ziMV6q?xDY?v&!y&^n4PPkS7Usys8yLE}6$3SH|yOD7Z{kVJ?%iD5X@q4YyV>R7%CD zY;SFkpY;l;RAw!+yL445x>ej;)>W#)RYF|g@09e(s*){vTwu8LzJpLm2t((qb8E)| z<;(Mg9VafKoAOQ@bS}B`Jt(xw^oR?oCB!Xf3In z9de+#R%X0!175g6s6K{nN}__+bzRS!mB!#PLTbd$G|$_Fz6pFeM|nXxf$0ux23I!&;n-@g$j4UKWSbnAef!P^~T9n8WfiWTXq8%6jgRPisyZ93j9Y@)~Hm za0eRb=mLHIWk4!)N2^Tp$`KyEwf-B zg|jraqxs!B_O=Bw4-M@+k&3xt2W!a_gWYjb?-M4vmQ{EWm;YYDy2z=|?StI48lgHU zTNFo?BrG&d(*?(eT+(aA8v7GftZ&4jbi^TPqT!y-e%ku@Gz)*1_^s5&8;hnl26fjG zo8g*o*y|zDCZH^M-E88@Z48KSG0*hdT&>LzcWlJ6Y$k1knqxCP`6fTvZy39|mvdmXq}>%65%9p`RR#&=rAO{;#Yg zudpQS=8Im9BR-7-KIn43L0JSDNtw+-9Op-K>lG1Bz9px9x6?h};yb^w*5EK+X5}^C zz#*{q$CYQ$s}<{Y`}@U}C7Ytw8wo(<>e^L#xflwst{Gt1LU4mos8<;IS?gPB0ZxpK3Q? zinKb<@3mYYQv@{lni{%T~9PHx!!{cW3J zW|5IM&sb)jacYr)W|5I*k)l>F-V<4J!Qx!CIxn^5?>S_e5p43;$E4H*RU=iyQo~dg zcZ#}+S}AI~)CAeCVP?p+VVag0=+CYz>^^p|p4z5G`L=!*+`illlIsA={vK@E1BXly z4u8b#x_;1-R6xSKIJ2D$Ru%Fk~!wttrYVdo!={u0pff%`(pK#GT zl4(Vp1Hr1!1@sCNd>2bdaVbF!heOZFii}G^L8M9Lwe_@ZQKw?98B!U;KB_^^jz`*D z%rHM-eK)!fM>_2ay{Dl~gZ3$(?Z+{Wy=lv1!$$ z3!vS=DUZ1a4IYk1A7>!cW9EwuXiR6)tqtqwm6LqsuHn>XQVr4!<4oa+x-inA8PmvT zt`n(UoeHz@%xNRPdf(oi7t`ElwdIa%G@(V!i4K@UcG*SRCX!3(-9iQdyM?5dq#d(g zWte=wdQD5uwAvFpS%YGp>VPs>LHZa>by1fQQRf_>=K#EBzmK{V0k3+lW|2K-D{6w3 zv|V%tB2fFsPyQmhk+TO}b`OxmlG`;kitN8o8!x^+`#*!oKb3 z>OYSN`$S%&3nScSLQTVjWXku;lvSG}?435m<_XCcSPiOOaVne1Kd{Zr8MHL=EF##D zR_otXf2r{$6{J@UeoQh(x)Y3SM9#{qm;7AhSpN8@M&tjNBrLGG|Jj)Y07zv1BTM)n ztEhi19=O;V|DUyk98L&t<>Py%+a8|Ab@;~mfp}nekksv9dyJp?9sMKN{D9yp21(n* zP+8mUV4!ky1$x^Th<{~3Oz$GYlo}XTusx+!K8DslYS>&cDudStY0>M zUyQrc-j63)cD-+=Ct4r-YI1x)0E>4PR7Y9{9Vo0C22Cint%EG8XAOgGHTFR$w#|bw zs_pBLTGjQ-kZtPws#II1A)7V!VJJ7vgKqEu0~lO)3` zs4FV0MEDr-*E&mc?bWU_E+$GeN-#SoEHX1GGgDdSz6^r0I@g0IEHg1ysUB!KQoBd- z&ORnNv`O3b-LVxWJE0=XRH>Pzvz5P`bAF;QZx%~|_jCi$36HWZ(^hD!u5YzRN3S|C z@`{nIDA$$?k4w$ZRHZJ}mRA!QjYq$;sJNuSoHo22DXpKrERI5`h6)zv#8(PyY2iz5 zK-9s2a02bKOF6rM3=&&fLNtR7fe($eGb2QRWgg7yx96xzneh%#Z4Y zBWm9d>jcJF`p9PBXKg~iBk&U@7%3;9Tux^NyPbU>DuL1qf92wGK_wd6d90{+#l2?l zJ;}O+=E&%A6X?o1@WKJUkr>k)$~DO|K&%sR{#De4^sT0UqK-Ocb3bZXtS~^+hstBv zB77JNu^`?zQ}w__S?uG;1Uk_!@Y>+LG&44s8p73eej!!Aoh4ZxqAN5aX7L_)=!?G% zKEI(MrY|2#Tovq`y~rUqV%gOdf+~o?P7$V72)*HF+khHsbg~DQRhJf!PGuEjqV^Mf z&wefNEzMq$5f+bqEdv6Zbmy?~IGQb8RkWxNR?lFeaCbuuWn#V)Lv=zLVvQmZVgdO` z73`ZK!-n71-9&q{h2w#ssues&9^!qdV1TP$IpapIJ|0%^XmRi>e5!EZzB|4pJbEso zcxXdF3iq+Xd3B{Q{n2R`v*I-I!GOGmOYrm@;BJQDDkjk)e(i`-{O$A|vKL52xNu9* zIW5$0&Y&yc&e-m6P(3o7({rGc?tPeEd3os)E}b-mJ}1}%k7ai)v}dp~>6}UKv@BV0N9?diKdH`eR0(GW-$?4#cA)j0kw@ z7~#z+Z=K$iSbhwX=bz&4Mi_LOq=S4{P$?lo4UO;o)F)P_uT5eHILJZQzsm?=gy&ww0_k3sbw3}ML{Gq7bzWM{`i52uzL4#7l!IuAsG`V^o9 zm`4NJbhL?{g|Axlsu>PQdGs}yQ(aS`zBpvIL?}@4dQcb|FfVij;~0_Zau0wZMu~w` zsPw59me8UTp-6TI!BJ;{Z9lHxi|ZUE@+;GTt+)%g zbfA=XX}-ma$=OEyd65YqF5A_8Ru7-qg_+Z>BE*?P@Gs%h+NQfZroT+-C<01`ks zYvNl6goAWa+c$s|qK0eW+Xe)Ku&VDNLOE;c7lF{W^qZizZvm>Q?@2;k36fW1HMUO| zLCUi^dlXoR>3EvT8dc^JmEqnS{TyGsVz>iy0;9<~s?+}s_So|wkWl6Muo|qAU^OnGs{kw9Cw%03lgsGG?tR9(q6*DD^!Yhwkpezma3C^Of|%tDcrbph&Phn@5tSL{nz zD~ogBNRsEB?)6+$?#zY8D1r*2oxkM;u4t~`(a_YBCc0y#X;;J9%?F2rbv#_)a z41%7J-vOp4*tr3Vb9k|o>`HQ}h`y*s+9g)hPuv9zAV;xM`ErL(uv5=QTK&0!d_>XBeF*aAAt`8Ge?qP;AiuUD0npQd zQ&;tY{4@cMk0DsPA++evDcC7=>@dI0eGSlAhVsz5D|mf*=(4N&v>$EW^l0<2PV$8i z$=C8>kvOW1ue6z0bD^dSVH&RP2sWErr{Kxjb|&|A>ltgj@p z2J|rl+*luwWlZTad)Qdrfl4-aR@npj6QF$t4=UWNpmhw-m_~I>&zvi3dv5B3`N;wt zL6o4&(3Tj~#`WO?hFICg9Z4V864@j9p#vV!s!Xq`FgwGhSluBe(4~y*Q3KwfDA1_% z>{$XNL7t#6(5Y+Yb|%m#^mmNqMswr(6hS7?s`Tm;d)}Z`=-T~zf}mE`cVIhvUEQx< z?b!n&>vvw+6Z*ES-G6YH6-g?7zsH%L<&{<<&{Skyh^2j;*lRxxO%`{Xmab1$K!yTB zh0Ub!H?FK8K-!g}niY3%if(euV>0;SCG3D~2&*D+y_b^2G#r$O5o}& zcMkLW<((-4eF7DdVVvP1@{I6*gV&yTi@YvpHx92A$G~i?mB&1`Gzenht&EB_J0!3w zHX*%A7JE_eODhkRjhcT?f> zJp~t))CG+?1vbVDS`BwvcW{&7yD52V3-7!J5A`xA{w)FRl{+XF|FCoWes_~1%pF~S zxb(YPeUu1z+nL@UN??E^J}OEdITy;vfgwBMQ~+aTz_~ii67%xR^%ulpFvA_sD^%Yq zcvTSGIXyZT|7LuBo_*J7MUY$)*2w%Y)hNP7E33t(W0}pA&?Y5DGmRYIjjy!1LDram zh_!Cj`V~=@*0?F(I=27BnrZ!F&E|P%7`r=g>BbvzA5Fv~7$>mgr7>9zK2P<=pW_b4 zL~Dcnr_a~}vTb7qmqS{r%Xt7*LKh$yp#e&ZT+j>zIq8sV$XPtYC}+T3fK| z)(%Gep~=%xAL1MJa5=gheg zY5mGqp-%UV>alA4P`V)7?HIK~xa~l7K{@U`S4H>uF=6K3$acYp?nvFzhj8{#C=)fx zeXa5!9U#0zTKjg)UqE(4)ZI8X%qM#|?4Y;94a~7)Htwi9F~`h52d>qlxax7;4mG>c ze3;)I=v?=CuSS8|5pKt-%&!XWMKRm<1QIVsc$ja-z!U|dUr2(|>0xy|NfLZs6xf|q zi+_srC`zKGlS>8t>L!3^VO+F0AN#$UO4XxSK)PBxkrC~9-HH9Bl4OPAco;eDRUl8nMkO)7 zl6>~UqVUbHprp8zhqzr6QHxf{a-maB&UpL7E5QU#J<^pwV^Mmws2Q%WM{BrKuyU*9 z)4i@k@H4qprqg|KEx!Wl^W{R2!o^-vX_a6JL`6Ht4bts4Bw=h1t_qtpmpwA<{eIx^ zLq>t`CeMndKG)yjUF^%TB)QZR`D$p!$Nh0qckNIavbwTYQM48Dmegj(#c+mc&6U-w zSkn-^z4tS~a*gaf6_VmED9CGxo+ zgA~vx)KR;xbRkiBBCt^QUJq}lQl7Qls>HX+fp%H9Uko1$FC+o^SoR>cu!|vea@w7e zn${bV`;}RG;C6u78}#Ssp?uKnprChb=HqDvh~E#vSHj?XlC@~MAsTnUo8jA`?N^|+ zSiWMcZz6Y0KWVlvzder+2$v_mlATwxCCV>s-eJ9dv{$Ll{XRjk-aw-JRd!gvAf)>? zb|k$Kk5^33dzWqiKe4vo#H|Nd=mWb(fV;z1cQoA~yQ5xrI$I&P^D(|?c*Aga5Fbpq zBXIX3AK}bjA;o;7FZXq?9KND7GrPnX-?SWeP8P^tLYe;G$)$T}3(OyB&ahuvl_PW| zBhJUOX~Y#Oi6v3@UW#qTskN!p3p$A^8#E?Ta1tB~1{UeRvYEAwa?I&rG zygrmjrBQVVbUZ}aOGc}@`rNM`%_z7)A!i;RcO*9Mp7^Qa>V-{iN4%YMO02hLfq2<4 zY76dc(i{jgNhE_tW{I_=I!l&ca8V&Vh<(47S}OF(s{?k}ol*=XGeKvG{Hap{R5BrDEij`KN{28OpwlU5f;kp6}PlEknw`SE!GHW|Mjo}cmQ&cWno<`+t~iggxp@gVk5!}&X=M_& z6rGGFBw~RvGMltKK{eclT3%+ZZ5~{#*@pRI(;V4>W|7FUvE3Rn2I>6au0`l;Lf|sF z3~5A9a~ZjV#|7W?M5<~e(sIm3MQw@mW`9`ghn{7uM)fvwSeN|Gm`-&~J=|@6nSf+b z3`ucRKXnbm7GPK}9N6pIgzy$xzWAaSgTj`T9OV|oNQfqG9~`!_)fuI-s#!Hv<- z{nC@uT}s*pf!YPW80bXAB}~n4VxM`5jlyUUiXV5Ix8BX>Q*Lt(^$E0Y1SxeoV|&*s zTVLT;a=$n4sk`UnUgCGd7uVy!;L2+7N@qmLVO-{);?P;I7gpUYE{VLQ^jNBEI7M7a z9hQ%B`vx`~G`R$<>;T%5>8p7}^t>W_pQ*WJpu#1u@tw9dB$3y8&J`Rg1ax9+X~Awn z<1C;mhG!zhDk2%;+_OXK3c%EH`T9ls<%Smz9}Y=o2R6C-Cq}%0Kav;TQZ#?8;xRAv zbo{nAn^1ZsAJjbd*E|>NpA81Ra2dXz`(+Rus(arLf%c4_T8dk~DcSOJ?sYTt4&*|c z0u^6dY}f#Sy|65g|HR+mOp~Jur&4xlP~Z&2EX6ipd2V_qq18`k6Jm?WCe?-sImOZm zRXbmFj=2vVp}T!(K*3{Z@_AnA$V(DCuW+1Rm(%aE0YQBSF4iNt`O)z#%Jh23{5;kZ z^pT%h)}_{|B*vP#2(qjuvLWi#4Mr;enL}_L__km>#6UauQtwau2xc*+9xFT3iLUOo1B$iW?3Qlroo(%%XnjS56{oo32U%HM2E*1S+SVlc;u2G@j;ZfJ z=UuDOE&gbB86+IxGmZq&BeIGR3KO=dZVDS666ri{Xs3%=PFb zM2b^;F8bx5xtNq1VaJpF{7DtW#ITPeAOH4ybFt5lnV_);m$>7q4F4~!!plDXMZTZ;c}2oHgM3Glw{w!W3zB}! z)y%Sb7TK+d!+p_KRNErRXzv)g9gxfCh))@vLAoTH1YP{+Lsp&x%K7qICG$L(HdkUx z&)0NIao*5FC35BPev&@pW}&=>p|-=&?4>As81}K{1kpVB8xk0$7e2#NcWgAIFP1u2 z-i_2J`{Cz9!D6%54jqD0h9Z^-Hh1zu31RTOdzJ7?H+?YIbpSdZ%+V>(2Gu*je>TsLYeroXPE%%m{!rPHZMY<{KOZDZZUp=CgPXrkmXG2Su?Y{$TddFI$uRyZ~ zDFt-G)726nFr(yLG7=~Y3G(4Ps)tkvb0yVK4Uy$iJ51_UR&W-tlc(yJIHO+R&hlnP zdpPolr<*N%$1JIZA4jNq5KWk8NSaY;GA+`vIhlO$px`&n7-$crMg z*K}t`<4jus<2d%2_>85Nvo9uo4JHP~bOF*QbJ|w*(F!`CSNAAHnTIR&KHIrzkobiq z(ouo-u!T!jQk=Np>zzO5JZZ7va&f4;v9`zIsdGlL?-NTVYo5h4^{ZJxLt|!WNtLV6U?98gxPmO6drKV`CBa+}kLY=}k5b|KEPNxTh zWxhqN2emr2I&jT=lVs;VcAT}Z;ZbG((xE-IPcpNuZ3!DOcFo?NM;L~;*<=8<6m>eG z7(P@)$mJ?uT``Mv(a#*6cM!56cS;uz{cSX8OGEXrT^uErX1xeo@8G%B`M|Ja(=jr% zRYQd{j#bvZE0ZpvzklRJBdmDqeqxz|#GbpOggk`Yo=TdyjO56wKQ*q6Ye^rAj*fdW>4s~qGC z;Ay`tHA@kHo8RR@#(r#rtnaq?xg|?s1ty*9CK%EUg*w?q(f-{3_MmH?@SJ6fKLe4P28(7B? zFI6c@jRbF`NxyN^4nmV{5?&XOv$$s1szv?_i0n4o1Vr^TY>D5;Sou zg)Ko)#p^oylgjus+E`6c)O0~bX_SBVD+p}~&d~&vyKk3;-hF0Lw*XAaVQ~kGL=*iDx6U-nN};#D%N3Cew2N5LH_Cf&hNj0 z{=1aZeQLi|`2Vh}wKcUcb8-CN&xdkJ0sW<`O)4859yUK{LO@6a$1PNq%q-6j#uu*J z&9-WE>`3ww?@dZk=^upCCsTjd7+z-ysT(vrZTWtinST6zh~$q`4WHQ3DKm~uDJLQW zn1jG-JDh{Ak&8}QXV>C=tNC=uFFg4YD;C?m{KMcntI}vI%?=WxL>^SKy%k!pRwox1 zL2;fx2${v$2ehsXW!e!WsZ*i97--P+H=b90t>W)(owi4D|7MDlcrl4A z4&2>`I%0z-yS3I6c*qYd(ZML|{n2XL))X?X`+BkE z5HHjB|EOvq{;8_f{7Y3EK-Kk^s+M6APPB3S-&M89rhinmnE;vpP}Q=Ge#i~tzFcAb zrK%Hi!y)Q0|FPVxxZ{W*H=?)*3tx}7dVWCtMCMTT4fPxF`qGull#vwu&B|$Um%|Ry~HkTcQc@~w1;PfhsEuoz? zXP@+iwaF+tX@%jTgsTkKzD$(-6`7UMDCR0ZYV)WXYpum1l?UXTPMu}csv0$;3bl{L zXO@g%Ixv8|6kaJG(z`Xh8iGV6HMXND7HqR}4{+C~ow}A_fX7>`(N3Kv9J%u#?bjbV zdAzFKXDuA*M3oG5KWgs z$Lz!tDLPB6x^jsuTyh}upn;Clv)`rT#P{Op4^^%Kta zlB(`CBo$t71jxwuq?CBpuq{cVI*`7rgOY0f*@iM`a9g`~!0=cnuq7kL`PDhG$a8|T zZZrAr0_#ryp2>)c;+|IKV;RC8mgG*zZm>C+;9d*h##m#&ype$7P+z#2LCRy=mAW0p zNCU@k2RQp6KP%=*aZys714~}}*1q&YF=6&w-@?Ck6z+Jfu*bK7W9)g}lG4+9zg7t4 z63dDEmi`KYe%-HP?S`N+`kCznyGZ9YJT+q#XU))jZ`8|~+L=fS!8W3vd@vDwif{{c z9|_?m{H_8#FT!3ecvj?9FxZQ*I$Rz-Y}r8_E9`eW6qVg36JWNa8PIR4YSVeA5N0eL zszeH&Mt1Gz$o<(?ZdFU}fJ5!R%61700>J#+Rn<4~ij7}ya z)W#aUOlS4Kw!&9JU6Z#&)dxQJTTIpKU~AZT*1*2?MmMP-jnKr(jr;c}#32fu_Cs|h z4~(L1<;13v9<=amKATcKe476Zjloi0%pINN`FOsu<{AD!y52E5&-{%RZfx7O(b#6= zHnwfswrw}IZQHh!rb*-X>CFGE^G;{Zhpd&AZ&~}kei!%Nu1|cE-6UH>r8vX^C;}fh zNBI(U!k*n?mgp&lo`LA|3MIFQJJazvtf44-DjZJkl;Lp%+NH-X4BGW5!JBrHh|CQc ztR1mx4VK)FGQL)^w>opMv^`*y0iR?=Fm|B!B5=LKIfi$uk#zQM*h7aoI-*@O`!hmC z;e8@p{rk5`vJY-p22wa*LH4NNKSEv8`;qr(aJPhb`ggApk2yPl#yMZvK|Dqf4efs^ z$EJbN4R**dF5hsDXol!0O?dmKf$$E#ChA)EM4;AZ=pG3UK2Kwr4!-e-ACg~?T4Lm8 z>ra6GAbZV3x_(qOGo-U9)WOT|Iv$Z@ryFFUH zq=}P7GGlG9RTt4@%+Gx#Ujn0!y4m!M^6uNaFA9->uo7g6qB5CSIs`TWoC?@|Av&H* zNSB_cF`Zv@!sLb-V+r2{t4RQq3cI4!)$2Pee})53O_|0w!I>oSu_V<&)EH1m7zyIB zt{yee1Y?F5NC(Z;S|r5k$XK76c(*312LUW5Wz0`vYDnaaR(YPwnDYB8rYK31NX9q@VG@HofYQZDrXB0wAXpFR=&iHfAPnWLGWo?!ljspK!mOBXQLi?^WY@6SH$JpOP)ammeB_r9dZO5Yh~l#Q zoJs_-dcAS!46E9v(1m@Quv-?h9@TC>Z4+|5(XT0~@rfXM+*}3{EbdMjz;dyO@ri!} zxk*I4OWtAq+nPNQ&I@%Zx#+2Bp9jIm9@4SkkLWF+T#4qw!Z#37{Wt}@5WS!ZiB zzmS@ab`-YI+sK#NL+>|$&r9>WthZv`?NNmbabC`k7>WIi#Zn|9Pv^20s0<{7x2?#W zQFK?;78-_xi#ggQFA`3<&%P&$sQyk7muP^?p(aNiOw(qGPrMLjrXf+=cR@Sbs5%r( z2F5Z624(ShNMXt%pKzg=N>#+1KtRNA{+46=#0Lo_ zXTj-F)b#fBKr~r;r!RLf8wU=;c~7igR}Y$COm#iy5np_V#6NR714|yaq}x~ZQ0bYB z1$?%S_zuZcEBjL- zN1QH@XVYm^e^Y*g{<(1r$a%Kv7PhY5@@(qzVJE_`<=o+h)IiAK3-~WFWhEvx_AmPB zY%J{D(Qfqtt+?b>jhx)g?)))j!YVfNZUZLPM=eghIN}F)Kf=}#JyYDPXqVTr5-dKq zX=8r>@Ni8v(^HlrRVNi?M_+vKfmCFx2#rvn)o0@)%*Xu}p&G4694=3&587`SEO`?_ zDJUXBWr(z2D>wjlV%SNKga%84S)N;CnGi|^du@anfmu;nnSaMBJHQ+)jflY%v1=c^ zyF#l^)lW9#CSaoGZv=`#OqHL$3tcEe+lP)6VHXuj25WSJZim#*aes6C^?hS(i~yAh zh(N#Ps|ZO`SnB9Z=y{8H4I%+L(VjaJik$({SAFh&I#>dPT(D;54YZz@mSyw4OIR01 z&+J_o*lpOENIB*U-IY;WhJLT8kU1;A$2gq#kw8WIcrbe%Kh$8h8XSTe2?o zNVbik8?)ectSh}=u>HrFR|YLPyAiND`oEa_>4PCKomo7Cb_Ij0nJ$cef%kg{YX|cM zgTTJQ#xUU;x^`ez+&~4dV_g*vZwb)}*>w57^_8S-mrl4S^QL6_BHhcUWGL0btLd1% zXC!_$)1z9WKZW+u=o^#Klk?QgEtNf0E;5udaj<%jPDXBwpA&omavM1=FXF%UtTHGl zQY@}*F1;2`J^Qv}Ui^MeYF79)w~3JSe)r`CHtPcsycEoOh|zKwX8}c)j#W7SA+nby zcXMY=sj%Vu*5Xg4|v@MT4@wI2Mw5VI+ghOmdCRfgKjl-NR!{`8pU z?~QFGrABWLYX+2Xcp~R(e4Zx!@Ym$+jh!6snBVWw+)+cuJv&{)xgl)FEVG$1a;n(Y zO`@7;t1*V1W1BmF^`7-gOy)L%gp36AA3P;EHsKa!;t7YYap9IkX7y7DJ8G) zE|;{)J{I*mJ0fX7z@WxH<(4O31Rc9^Twr5(X=vAQ@T2h+SRV3I-wA6QF$NcxK3$u0 zh5FFa!@dg8qn=19TQx!T(@aEy2j^kH>(CZrae+jtA9NlQU7Nw>N%Ua*OdOJQ(~_0i zy3vJ)?iSGNNO@_eaxn=)zLAyMJJ4$-!Zw$($ERsJjPw%xAdbbzTe;%ZschpFl$Y7}|7|L%z1j z>R^)F`l;68_(Q#e#+1x66^{KaYb~bxfav@Hl}#AcF`#2jxoI>+!Mk4$b= z?|lc=)@<|V;LP)|Y&+`>O}TDI`)!F0_Crmjd(0mbeGyYPmL)eEdq~->&gfgRygJEg zi6-dpN30GsX|0p<6YlF1&$KM}{tZ=#!_n_04#%5u2H+Dk`^Eu2894kVdqxx=yqw0p z2OpR}P268T7$`nEZN@)huwS#^yY~*dKdhcUkj}ojUi<5C(>P(MoPls&`$J!A-M~;h z1`NE(PqpVxbg|;ueYCUCd)Pm;PITep-Fo+qwlkRcn7D0g`Z(WRO|NdNZLu$3XLh`C zzDV=CYrntukG{B0z0c_srgSrKy2Tt^TuW>i-rjLeQ^=Eb8iha6&4*ARAibISZ4Fh_ z5y(%^fLx+xX-yYrX(crkNxkHklls)hjKsC{YDef!+%Fne?*y@G=S-g0+mI7XPV%9g zvajuF8Q^s$z228+twrotJnase+;snleOvLw0@_83andwitr!3vmUV5_5|;h?Wem=v z^H-Hw6+!nSXJx09-1NNJ6IJu~B#osxD`mmjsamn~NlPB0ms^_NxS#cA2uHsAy_VTp zIA#2O?|7=FcFA|wJ@C|20nctkm$6LqZ|JWF=Mp&#lOko~AE&OCH6Kna8*i=sTH7^5 zn`odcyCxqn|LhuQ$-;T00bK(vple|IcYW&MWNd6^UZnNQxQ# zyLT{F0To2m+#9sj3qvN!X4RBOfhAIKyqa7w&Bz;;na0!}fVdUe>#e_4@q_^M4ZUPc zw=<1Db#zoZyZCuQRtCX^I{=g<#Sq2On#rCoSlG?4*>dUOF-2|G&PmZ?B&Sk&eGYkV zl(s>9*)4nYiCy|Duf^j`N(3+x&H?p1UlY8p%r-4u9i1pmuD*P|$wz z7>V9xIq*;n^Jc{l-|o+^RwcQ%kDu(H)ZUp31;0pkWL(Av}vl3 z(F>yXU;~c-NfjRRwN8pn7{8Rrj|)hElBN$Aoi4E|185Bu$EtiQRsV@1Pn7p1S^iyl z5|Uhs$RwnCJ^SvDeooA2GgAV93?Tp+x_=`BQ0%jJvIR(p0dA@RS}=d05(N+v1JL9D z780X$4GXJ{4+tA5O$rA8+>3~vh}jMX;K$d5WJc^dRaSnN04QW__f28ce4eUem6D-# zwtksrXQ|GaX87b>D;D}Klb*<_umSoUl#9f2Gt7gj+>A;7xp-+I@BYmcbL_n7duHUb zJtnmr%90OdNf#9%D)1@Iu5%HA?Pb23j6`5FwS;z8S9S~Z`6eK;2Qv14*RK~5|SmgS-#5>xYWV2q3rAdGol;nWy3)i>daUkl@d!d*7DhuaPd(h>?OdX2Ozv&X%JvtX6bV`Q)*&p4Z>&VCZICJ>1-Q!cc zDuqZhwU*GHgc;frl%p7>PFQW~LW6A*{!+R-E$(Mim~YuK&v#tP+2od<^9|o$?(m!f z0Ijuz4pa%vn{Nfiq=67^hqB=7ktiQ8Pj@Fdk~Hy`k!IMcBS>Q>p&Yf4z{#a&?WYFqxu^HqLc1HGN6EI6${&s81R+YDO9Q z2+D}UNkF=ZXnODw=ws}YpPZtj*c3Li0Rf_y;{i{b_p2-&NhVQX2%cdzd+(0`vEGTN z{~aLzsU0C>W@YC18wVr9f9tmVbKJ3kX#kum5s8g~%~l#_+y|cJ1%hYAGLf1#WQ%~X zgQZCs27|C8*x{$~d)l$wC%Rnm@mzj(_;!lbgPsg|E44^g2%lK(7$8s**hphX66~aN zpX8(9qO5aTp!aPo`vS}7yUGsA*RC@4C9kLAQ29{9(!k>}#=W(tQ6i!|29-q5bq}u& zj~2Q@fC8c^dF2gxKz0Id#{7M=XZ;c)N2kCwU zX1f;OTtTK%K7wtq>4~l>b(+B6qG6{+h7*jpbH`nvx}tyBG0nq+>wUwgk<&+0;z1;& zC5+;DK{jEMN&kL9GGS-5E+$aNCUmYOTGXe#q8od*f*Jg@Am1Y!6bC*^F>ENuLSyqdbOgerpVO8TY z{1mHxO)X<=Vu@y7!t(Lu7x&uQG?Hes5ewPvXg}sX=A3q$lDs?Kj`0R#44DLdMh+!I z{Fa-kFq1KAO*wP)`7t{$&FS3WyAkVsn@Y1YtF#TK`sS=LEBKejAdV)t?UkjAvnmCL z{?rvw@-`R|?V}HLJokDt)pgG@>XYiUCL>CTOHAt^#$|j~+0D7lHY+MjxJ-70it3sc z|G1gUZ}**Lp)QSW6@;A?+siN_8&s98bi}BSS6iRep}&MiK!7<5oAg#|vZQ-&?lwsi zcr%~v+mRa0M8*@aai<}q;Wa=^QXcb-w}(D)DUyo|#t458#w}1;o`fqntm$)qqRwzO ztmCv_#Vxap7HLY|4-=)o>f{=y(Db0YDGiA^6q~>J$Y)}?8`b%M9gGV%AdQ~o7z$N$ zqkbu09`tOV7teL*ASOVpCa2jHA2^Sb8jd}|n=~|P9A?hauHC!bC8}t;>7nTxX4cT! zt5;+@jU1r!y<_IvEE*aA4TPg)k5wD3`dFnSa#H5VHvn6Nn^|UJlGCL&m1~w3&5r&pX&Y=!+27EfFH9$qE zc>F}eAFRqW-R>PYO7tZrRU`Hd&;1Dkm4Kvu)Om}uXPy17EZb{igm++$kD4lIx|yP@ zPm)VYE_SNK{cT;*HDi1DZhowO16(&jrI~W$CGiGC=7uK-fzy}!;09@RyZ4-jLGTgN zoG+qgp13~Ypfvte614+gE~Jtn@L5*E-MP*5n1tGue4z>v{*I_hT#qja-Y&L*J0T^1 zG)FQaq;T}m^zL}>Krb_a6!0e&z3o3@`TDf86c5r^-4v8Vd5cI4aGfh>YiXlg2Wu?6x zJzjcxc6NfSh(^U$vhxTXNq|vXBb{W*x1%8FZ@>-+fU(Pd1AEM}(}6cA0_hu?D5&^( zlj2J(L=~Th+(pqJ>haBFI8fQMBLDul;*5uvFUR<=6=OU2@;z96o88EWa9{CDH-t3x z&(+@G6meifA*K+pL>X265YVIjPfk@v2Rryj=L z7675*fc@0}xA?5KDYU7bbpw`(hyP)BpjS3$P2gFKxfG)sIG9D3waM4+Kk5?7DEn<) zz|&g`km~-ISm5uc7ocYP_lnU=W%et|H`GmxUZ{R~(@@hmb#?V1ku)I<7?obsntWjq z0oJcDDF@iWUyLsd=ZyIC`Da4BgVVh3HuEgI0DGk#Z`sS0&pkN7qgSJ%W>wE zrYbWnUL;H#zi&m4q>$s~rB5VOVjB7Ox95*1(2)Ic%~zN8>tqwCQc++W=*Ttm?sd(zVno#C4&j2aZbV81G#NZCjS zp)I-F7=@Y7W=oSJf&E+(AV$AzOgUl>tIXYHA*YXJ+XB1*!S7d;fd&vv+3o-6oUmBnNoeqXGaE=5Aj zS?#*!A+iz~93d|dL=xCe_R|W}MZ7m-u zS-CTs5QWjKwVU_$eZHKuucM#4%L&3V#>T^O-YBA~? zl10hc=eDwTpvDLwHtEQ55hsiHZXoL{?_x=xAB@A>IVsg_?5OCIZ9R``!tQ4+YAzUN zptM~f6VG-e8QOp>*Av{diFiL+HwzL>Was z-)m>jDkF07ZTA_{i!q%{O%(-p_~o}{%Zs@G3plhh=7!9uVM9}RN{<;YNs6M~!dAO) zibC}0lLkb~a+N2FuqtPMra5&*J{my8@RNbY#-ZF=e))Z?-5 z+*RB4w*jpJH{#R`j(+PMVQG=#$DgX<)P*p5Ig&O+% zeJl+FZxm=IupO8+N}iw(7QdnLgrGr&xxA$HM3dgn@)K*QS>b-1%6`dWvC#pvZ%y)s zkSSyE!j?MJSPPgdP{M)dQ{=+8$=g2!Rc@=4v&@Cd+xrDI?txFKf)@$+10aJ-j}6d|V?*u*D;Z))_m>$Dx*BS(zR&m#{w=iL|Qj zJ=!lwk$_pqvU*^dizni|HrtV5%i2m_eJgr)t#gi8nFiIm*O8z7n>F>2-K?ahsQ4%M z#}B(%EHOQTMdr`Xn>gaDdZ6PCAsJB-#Z#wnWr<`mlphRKb2F^gfo8`LS1D*lm1Jk2 z5|ISKA{NNRiDmSbgiZlPYLt6Hl*&>_Y7Xhe%v2TGfjD3t=ZI8T`4qoN<@raE$`|xQ z?FoR0HQ*rQUq%G~mz^Ayux>ps0BE0!BsV@4m9S>Q(1mc}nvYr0kShBdDl3o*$GJB< zHR;iK;H{oh-W#>-(6#IUA$pMwT#(ZZd@0(xi0ppiW#PvEc>b|Z;S1Mcm};-l#ruf0 z!hPpj(l1}|!wHp1xt~(OKM$YWE~aG9ppTJGnc{`^Cx)U+5c%hHgf!kjc?`DSUF8GMp!8!B=2@VG6=QCjM>fX-%grijnE22*5Y-~Pi-k=bC)IcI3ok#z`q$Q` z*39$g!=8h5i!0Hj?+SB59w?1f9(tz}&iSU?iCg;$)?W`T*O}LRNYvS@;|NBo_PFGt zC?)P#QEiM!&0!yHF_c=OG+IEgd6Q4Vg2jA}$u@c{gYI2L4uZ(&d6#by2|d7KzISrf zsqm0&a-C8erqH>m6Qc1@#eMZ-tx+fZT)6@bkFUB;YJCCgWO(6Jsm5(ZTMOsmUXXqL z0rt=MP58{kEf4rweve>i|152Oe=UNR_C|V!ZbHAg?SGUwQ8ANWfSFK(!u!}> za;;Ns0~o=KAvTV&3GYczpDtsrkO@bgzr*(*0R;E^%lAOao)^gpLJh=Ww!C=kKo)s% zoCi7?v<7R~=nC)mIgg>}S`A<>6@0wxq;Os}P6u-;GqT@apW;M#!a#+)^aNBwP>K#M z@^P6}qdry%&3d2VDA&zIdSph5W5uQd!R+N-+Wm=?T#}9*4%auJN~hThktcO$(4WJb z@$_U`@tCJiVHV`*mp>Y6t#BC&)va^6_cXbHaZ(GiJ_$oficn#cM(8eK!XWe`Z(anU z{k2txA`=a#8vDIfuaQx4r|pA15~lP5OkxzQ8p6hwAS31jz0x@$p$2Qsg&0*}(`=ul zIFz2j|B1|%@{cnLKn(jq{ztR<8yVr>W(V?mX8%)gk5Znr!4XCMh}vJ7TC$3iOdx+F zgbL!YpvVxSybln-SsUt=mD(gF%_M&qSaqzoxU4Gh4;%=CLH4%@+EFKkC$v>m2$QlE z5CR?;*69bjHSW+VF(&z0W3$!a2AJJuu)mCVZ-0E+f!&fMN)nQTrcmM-oJqpb`D!0U zl&z7FLBhFy8=|FWx4nV14_o`AA2uwa*y@=D)-s##?#qq4)`|+Wwv8p@y)x~U8;qw0 zV<8)M@}lDW=iTWhx%dVvvsD3_HAQzPZ6X5%tnn_3wa>xU^X*i$;IiMLVT8BQw|9e2 zF^zW9H<-8g&(YJwlUDbfCn?pFOYP3%H7qP)*1PRXh|juCS76hc=J%eHOMk(>St(Uq z91aZy+hPr^K}a_(moDQiV=NA~*|y3wF`UQVcNnaAX7s_WMwmZ>vs201k5{E9C@JMR z2dg%ze4s>Yuy8bXQbo#MS#v+M2j4TvtYcJ7()Bm-?6=+UXrtiUoduH`@+`jA+4B0= zD0>E&KH!(E!k9e}oAQYav6a~Q%qN0*mJA9$0!Mh=Pfs0Pl7h!`BoF8!3rph4?TH|> zLai!NSYTjAC*_wF7N8UbQ04D;ZMZ7;6|{b696It57{y32qVHm6F+YlApIM=1m%7im zV~fXqDZpSTjEmdDqGEL{xkc5MBB24uNx_-SpY)F_a;FUGWnTB9(o5JWgnuhaot5vY z42J3`)~h3v~0k9dfQjL}*uyhy+|Ts3P!vs-Kc6)Rl;#k@NiLKL$Ly*GNE9$@@J z@U!B6OLr2KW>%=;e(?r+lx%I1B${4b$-N74Tlfj*uvJL00PP^5aKa{mZR4&Vvlyso zluO2}PEqEN7vtb9wPU~G>=|F`DJRa&x6i!koX`4lcQVAiE6lBPW+2nMF3f_Ay_Y>5wDrLl}SZ(R^+|O%htj^Ct2H8fAB!_#U zkMc>te|qz}fDgXl!ZPi<(HP_7ZfMB0Z~D1fe%g&E=CW|2L2@%{P;CdSq$7eXQD&7dv2p}AwPDY5H~k8 zR?gdA|BI@=0(mF`+CflS9t3k*oF5HGcLOEoA{`4wlAxa-o+&BhCt0x7Pk|c(*-WW} zJw4@(S$-BIvAqL5Af&CntRMlb@@23f46%bC3ZQ|wx+K4Psh|EhWQx)Y$@o2OMFQl) z-%dW}e>p-~|Lykl`^5#^mWlmG9t@Hjml6WV)32MP6|1F7Cgl5JlPW|(QzXlWqMT2~ zxR;VFJM8oIO_$1EevS-zE$R4;Hwz-4klxve(Np|Gj z(#py~)_;$>+j}Iq-utsIre|%zp}ga$ZP-#hkzfv z|3X9lFCV49KTacAZg_tI)XWeV%5+l`gK9Qp3-j-x>9+nsmaw4cb-BBi==eRtSlevz zCl*JO6fD(``%tBE$eaIrvH0Xsi&{OaPmGbJl+ zx_T1A*CG;QJNOc{0qzc{eyhMSQX6#t1RUWz*ay+Ge{@M))cdomdydT4PnL} z9_cr}O89ms5R;I3&2Kyune5nI<-~zkLJUz2qK#2o#B_D4o97~pP~se)c4INl+$-}C zAWB~EQt|gAX&?rqVCWOR_YG7e@@qr%ukrqp&HA&kan_RdKn9F|IN?8iBL0sL;@>O6 zq^~;i$|{&2c&g4AEtM^=NHvy=b4G&btfB%6!t#c_LZGv>*Yqhyr&pchoi0eS^9_}i zo>uPVDMKmgvuVJSY3Al)ChivI=9Q;q5IOGUX71+CQ=KV?SN4)P#@!B6kH?R1yvKK! z{5d{Axp2#`H!lij;%Nl_1Zdus4+bzGnB~G0!77W8k`7Q*28GIGiF3lRmMp?{Ep~}{ zy z>FXI-7EicYzj82Ld2(bp784VhXo(2jcWRS-P4;v}SV<)j&hioWg{$x>`MkqNk(oPe z#VXErg**isTm?p8%DH`I5v@7Jd>(2uE~w~-Yj(Bq=kE;X&DtwAyw%&0ZM#gxiU-3s zr4d;e=*@4Zk(zfe+a=!ZYj3%mArxM&V@t3>4rlL>|&SHmkG!NAeHML2~#>G350X&?@OqS zDj%c-%qBoP_-QYblp}3NgjyJZoHK2Yba0fFLJI5QhZe)}PrD>Oixm2Ppf2u_A`sUw zlvY@#iNt-x_{`Ew!xQp{QWQrj8h2$;c9B6$v_snNrP@SdIHP$xNt{~k0bLo{84JR> z3;~l2H7&*!x(>ekIF5Yd#=wP?crqzxUm-B58Q&~bQJvA|6Xig!n;Z4nt$rAjDrG5$ zBJ(+HQY~uIS@u&_F}C|SQ7=QFdZY)ex=hSW)65fg*_8?roSn~bJjz#!|)md&%<&uAx5ar@Jaf@vhcJb*~mq%K7lx0}XzLhs{KlepO0@{FM0 zP{*XRWLWP@A)Pql_4abF@Z;Zq-tM!2aeW%k06h>SdHcB@&92btTR*@n9>gz))-Es? z5xRq{ZkzW0(kdd`p%0E;mw9}5Uh^YDp7;DVbG6Eeqn1`Fyo_<)qAHDV*F2Ms)q8r8 zBM=G0;QP!k;cxq2cx-SGRzVbS%-SFb+Ts1qp1AtIafsB{vceh_FAXnb$>B~`PokA1 z_hGVuoVv1F79hT$>uq~OI%7nyt!%P2vCoMlXoUX!eE1v%GM>?Ym!EV+I9xtC_%!11 zF!YgGe;xY5JGqL$YQi6XPm!MW0{CSf@$7q3ahh}esc+?{jH~Qz1?<$ zjZgR6_YSH%q}L9|=ofs({a*pFABD{Chm<;Q^iB2`#TdTgH6dHrFbyor;f*jY%81B6 zDrbVhmD4#aw3su74~0^FEsXEoYNK8*38{beJ3CLv(AkslvwwwPs1WD0upLm2izoxO zuy3X7()s>Sa1n*tet>QV+L)?=^Z~lI)IAfn?05wKJcMEEU6YpG+v=u?xj)$+@qDC< zl=VvwAHxjeeod$!)txqvDaJulbt1@OTRc?9Q7LagaV8Ub@`tMt)y#KPd{tEMrSQc{ zI44V*K1&?+6=zEm?wRp5rXDWFF)pUjHp2SN=)BBPG?O9gR067o{Tj7o7g>hu*FP?U z;NWSF5dc|u8SwKjkHNn)v67L2lfBu$=>%WKrTPU>d6$dBif7FmtJ;vt?}3K)6i>w* z(b~cc`J)1&3&RS-7N+f0PWljT3I@36X$K%U7$38_A9;@641R*^2D0TXor{CMC>E7t zqHx9RsnNbFPbj-z%gMBB58Rc>t4W=_*TEZU9+kU32^DbmQsXad2u}Kmnu4jHQ249p z#nqqr+akXXM}=K($+_|0)d0;E?e_VV04x%;ja=eqV3nyU4lSvFXfVkZz6+s8kRrFv zIs9CCBDq&SM%rMc`JuX1DxxmFascYZv835YFLw+M^s^V4yV|&Oc<~V4QEwNMPHZb3 zG=rTHJZemLLe=52*Ea0P1tRCO$z$@y5>-!zTi){Xz3 zDcSs!67a8?Qs?ihp8qoz9!g!o>=DUNriL@mCt^Lh#MszLAMZTc8k~71(0F~ zxf4D_%dIHs8fmGU|7Dn`EO7mXmoDTvf^iMOBT$nP#M>F*eenqJzCfJEppNX`>f-O> z?c5;!>zITcuH^{2xXG#KMoXymsoRQ{F3|^s`U{|-hFV26j%Cq{#$$bTkQ`wo2Uv$h z+d^oX{6)~{{+pn|bm+3$vBO}?YgYAcW-!k|Sh)61crr!;5WgmxG) zE{Ezh1n@NO$heiBLH`L0h!iL2@6#Tv|7>q;2nwFH76bqVHcGZ^i7EW29 zA>^R=u^YZOd~tjDGj{-HDts#|dhD`Z*uwgIqwYwP7lZPK5}OOjnFH@B;N}hc_syGD z9^4Z=*0EvE^J>jqNs!j}saX793Ok`Fr_hxo!tS4hvC#JtBNhf3t7X%MYlITKlz>K` zL4zT8Cb8SDHDyJ;+-UR*Hq(+0;jA79;ejv~<*u_4 z;@!{Zy+p+MX6ne2l4}Gx8z-sX+$DKaEXiTC%H>(0aeNeK^^YgUQq?Ef@6IftzA~dl zv0__^Mi17{?D4TiY4R{~E<6?bE1NnoH7TR_JpFnbvHSSTk|UQFHXnR0p3`j~T+5Ns5M#$Lb;*CNnPs^z)t! z7jVYNoUU)4KkHti^zRtiOzW=^VuvUO+=oJi%ZVu#r{=*f#0ub5C>xa!Pw34Gn6+c& z$~G<)pG83>`yj)gPR9`?mXu=&euFxgxcU5}IQ5*w+eE5G9;^5g>N!Zbr~XyP7|es4(Q zBpATFKiRAS0>LK9zt=J}!fPp{dVT*v^ zS#lsg6y*-Df3*e-<)LA?<0Vk)m_R6!M%hPaxssKb5T%Z4g27D|8ahIZ5zKSiic>?0mOzdCW)@rj}-g>)Ms3 z4$35JbIt3*{kVnT{rY?lCO~kcl2}TqVkaru=?e)n&_{zsl5B6eT(g;4kMCf1cIvn^ za;R@?%}S1Fd98YLP%d!VVwQ15>VN@;ZB*XgY^9k=;RvK6L<6f=-qmTfVn#g_(P4cE z+J_U&eeQxTZ~Dv6Tx{CNIE!^LUDiunF7=E4>PUK<(bc&H`Yts>lcNX8t*zC(M5{@z z5xd124zSa4URsA)QIuugg>~Ojb0|4JK-R#J3bF1-vgj84_+dwIg&3O&*Ta4gr~784 zy$gcQ1jc5D zyHkDsA~21o{^K6(7fy7JF6Gt}63BJuFRU?WP$~#4{((rniMjCSS<@cbp82X;>YVru zxx6Eqp^=HQDH~Jn9*N^`4RnM2y15bC29bEVbl#C=*Ob?H-uWS=$-WKIOrE~+GYYXe z#Bt=5_$pwJxx0K28atmNFiZIS3dL!UnrV?U`p`5fh@w8=SoQs4V_gcxbFpuM7X!ud zDC6$8&~TF7cUY=xjv!E>VV-EAN2Mc^yMkNTmrMB*k$Dc-Iu*ck2(mPcgGb5JjNYj? zkZ^vxuKQ;r^N90TE+lZ)9!oKdZ5% zuUfV^-_YKx$Ta4R6WZ$NhWW!}CA7rrDhth&;<@|=oI(v&shsw90tJ@uhPG(jtbR#KKUqPeno?2igfIqV2^kaiG%(&wfFSTBL15zVVsRW_ElPb|B8wb4-s0uo zeri3=KIeaZ!RQ99L8wq*6-5do#vasC*q|U}^#i9PpDE@w*Jjn4A5H5Vx~Q~3k1)QC z6)5$YE-h4w&qguDuEVWx478La`~po{p3J#U36QQPvB5th^8!YOWXTjDVGw0zM@N?l z`PHV(XMG?A=AxF{_`squf<;!b135tI;g1MKY?2X7v+OUt?f;%%Y;`1CGB9$qZ`5Bb zYdS?cOEFu}BpYqYqA6-tB6lceU(uz0Mw;y%*^)rEY<~nw+`!-2A+XVY6t(Bt`&r!c zQDJWa0mGP+F~YwgQ_UgluFa4Z8>=EVja6&B<~y3f5P8yNycN!r<`HGm+99NvX0yQQ zWmR}E=WLjeSzSksysh-n#fajRru^(unOn=G%2ipKG{8REPi3^AGux@sa^io|ES1@{nenGw!C7_}`o@`UbEzz4EB?5m8{y;R%M%#r ztv96R^kYJDY1VPX{4CFmjk>eyL}o3lHn)OF&`Df@(szs`5y4t)a$1(J>+97W&qLeQ z1H>)t{_l_vBC(N#XuSfUr;y+zBO*2I{$5Btgox8i7%zEIGShHO>-By{-^-U#lT*Vi z<;^5(cyTl}k&XPdV8Mj(h$0TGsBw&gB0YkM;ufZMk%&0yo&RJ9t2(1#UqmRC zrWSDfp?|Sn`FuU63c>#4hM(i&dI3+|#UzwV-A+mzCjm5pgRjtlU7rhIKVNu$cIu#W zCEtL1M4vywI&<-sk9_hMx4s8DllB z>49*f2x%FrLoPybPhG|%)=6V^--zfs_X;WX5= z#57uFH~&%Q1T^xTImV$}16M_olpLcwPPlzncNno<<~%dJhwPT`{a_`k%$akjF<;yf z>d`xu4__lsvmdncIru9d5(WEHyU?d0(PSz>=f=BLPVwWX{)W88(&wsGP{rc4BY2ASEV;1RSINm3?O9QQ2wu+9lpr7y= zZcvCBQ5sA?L5t-3 zts(U$Qn5doPw+U%x$BeV;v-wy8k*EkH>pFg(`)bPu}6%@w?UP*4vVCB*Wv7b((SMx zV-8|V*rud0(^`*NpCyl^=fbY2C@K8SaSdN(I&UrfhIsvkrk8N4!LhGTWoUfIrS?Gc6`C*tBdTz!a!M`0jOhkklVr-pp@NnX{!wH1OLTG{BT z?TKbMm9h0H$Wv7mTgk0kIi&&dv*6MfU#YqKJ<8IytEV$_ym<5(UjJ<>BOl#@x8-w1 zR2LHBJwMF*J}TIh_+yC|(+AI6^t#nVh=(W*4oMaYr?(4PSh-=G?SV&|ogdxt9G8Y4 zHFt?S6%5XV)Xv02?loHX`N9|FWr8_(*hTxC0^HGQ*>Z;;W^=oD2*ut}7b^E9l)<+^ z*uXrHhQrM>%SH^PHVPjh--PeiIiLsM5>G*927w&IA>#6#1aK=kHv~U$!Oc`Q9FLOpBsM8yc-=u|;UR>dB=|8xt_PJx=RIGRT+rGYOoPeKoz!h0}T%u)V!Y_m7um}W@BYr~1yfM&36OWnuv^6kQsDdNHnklMt5BDMBhil-H znOz?FV24yK+B^p(gbX|HI*!skhjuuB-0@Sv2k<|0bdPolPzE43|K2ka{y%fHp1$S( z^7Q}RgX4>VXWuWx=PooXvelXUWOe6t_;YjX;vI1zmPer1mW!7n&WtNe!7qFGE zggua~sd0WFp`3m^=!BEt0~-QtC?FVruCuQgM8^TmlL+8!`d@p-zlslgJ5hq`NvlGH)tzKV$4$kBdYBTR|ahW!5+`^F$kyJX$!F59-N%eHOXw(aV&ZFku= zyKLJwx@`2_-*@KTbEjtxBHrISc0{hsmAUc(1_Laave)irBby2T$M*$fvx8duF^RR(!gvN#Ih=|f36vD2)Fb~3E`E-)*t7@j!fVw`lVjrBpQlWl8J@Hn?$U2o@uexTVGOTaiC^1EN|E1#aPi`-(#^**Ctes&g0c>#{S=fZ`lWvwLiX+Fy1I7xr|1Ge zvW=hYfJt4TH;CnN=GKmsaQW5+0}}Tkm~D@DTUFClwBH}b7G`VZR;QWn8F_;)q{9z` zgB}key_ye7+oOy-oX6OMioX;9k#SVIFOQytBEcp+E!nP@*@Crh2jtwsY;3?RRz+O4uB|1nMTnTuBZ6%lek zME-^Rs$}75^566OWB>s{2-X|T1+Ys9+8KsQzlRe$loo}0poBb z)A^kW2_3Iz-u=cx3g@&eyYt;pKI%?_{hH;hLMog>uS201q6gL6=@P6r!>O zV3e&c+AQ*~)(eUCbZ=yQ=BQvnUHIiOo(T;}D990YQAyW4n1kFMZS15Z57`k)o71v` z9=;Z40HtXWinfsR=RSUyfeRzS&5vV-r4%baNEfs7WmxV&-cQ2O`-aH#`nPVNK#rh)UvWSYn5dK1Vnm*#d~w!7Zrb7x&*4iX;_ za$BtM{3tI!|9Atu$5I|)bc$@w9I^s)>0jT7_9Hb5rzmy>fL1q z^m4V&QfEa(;(GSRVM3`DikQYlt@h1%bWl=ju|?l~=zz6!F4zoj=t53!?yB7|ecl`e zE`#IuyRRxxHNNm$CK?pK`$0;Q*SG1_#8}ZNq@u{0{UV2%-OoplKtl=-ed5p*as>KXbM0%c^s@|J z3>|^HU%b)001O2Do<8(zohUOjEEW-xfFDVhp3WX&h0Kb-zt}KprkG<6D~k>Tm9$HOUXUUPs3?;B@&BLqrkelvP14 z3~|A3+~;_-Zr32LgKm8)JzdzY9GDIOaeSZhq`|A#Z^xH&!ZpBPCG~iW8M{H|5{qv| zI41UM5Ei4jeYHJXDCj=5ZxEy0<35x)%MeA^0Dz`NZPp`*1Y7BtoEb(RTZA#jm-$sw z8{4M6j%jGjuJ6kg&QQ>qFbioKWwf_uD^7Ey!oh+$51E(i=Kn?#3K7jgKM$%T>=jV zUSycG3w1Jhgd9no9?r#a{4=jj+f6QaLPi3T57vbCoVuoT0DXXZXucm8-i@bn2EzBrX?8^`BxRfKaNYMerwv` zWXx;!f_>dI9ptWBQHtS+Old7bX-3@eSVlCL5U~?|xN~*je&9xV(u+B-oPHnXiu=-Q z5c}5CTG01v%?23Y=^!y#d-;`C=LlKg*L zk==5LfYQ=|Awl4@R;&wUq`(Y)2-y1M$y#aq2}UbdGg#g*cta6GgBpN83C1)Wimssn z!!hfz_woDR8y7fv(=fGiR-rR>$}()2iv)u^0Ar}G=vllxZ;|1b_eB^N4bNch)1?=I z&#w8jU#)D@qY2+aevzmDGh@%!5J3X(Q5~)4FN>a4Od&zt@dCF8H$0D;9lTP+@uCTN zD>2t8H>K>lF%bE{0Br3#c>qqz+`DfJUtn%Qq5Wc%NYB1*RuoU$hq_i8RmU~ z@Vw9X-uGti=?&CP`h+|E=^RXE-RX8m6D@kVu3wz>CtyRd6R>H)mPYj9L(nh|#Pw~n z!RxWM_iieCk^Pl9^Qy}o2Ic29`B~g4k>#DY@ChKW_2a-)WLQE*T1Cvl^8~*MLjZw( z!^YN@qHlFiC}}mNXID)e!xFm0VmrDUEQXH53@Ha6D@Kx`T+?)3no+T_VeV)ja|!Xh zsYP8(Lg6T2D#qH5xP$#-e8PL3CGUdAHuu_p5+^b= z$SusW3Ta!<0}RiU+~$uI#^J^T`Xv=bTjH)|#6Y*-oXKnAb3u=yxemoYlXZXWrB!ghni3%fmlp zuy8E(#>TIxHoIAlP;rmX~H#z7CZAAJ5a~n#QRp(zmA^G=O z8|b)dUZVGy<-ojq&G*(~7^BHJch&j#lG0SwIvuE(vMaYyK9_L9v6NY23!zmn@<{8c zA?nlKYm)@@_1Itmmc`rsrRc;VTVdLa-8j(D*l4$CP-v`Wk(wVKvmL$m3`M^`^bFl+ zcI7ef#N`rC$P}EpjxXi4)@(Kg!^htP79;ND_lz6|$BlDKgI#GfT2!UvsHW<@3#>Gf zO$$0A4q!aQ+B3lO0M61lbj&=nDUt^mu62PZV-&MW6K3Xfr9eTL7sF{Hs4(RBY{9@0 zPEI#?gJ=eY>wUW@v4+&LcP$dIud@45`+WaAMO!A4N^Zac0lfnN>Hi`?`=22ZG;p#o z`lH23R`bzUT6X!ZBh_rIF*E=c7!6DI9Wf!gc0C~o2)5VQ!SI5Gtd&eEHT0ua#AGzy z*l6zF2-aAqKB&^BonPF-oXaf9l?0j<(tHeN%J?SIQ>5A)V3+wVWheV(O{0Ys!N-C8HdDnS;9se z`V`xdsz>rkXCb0=3k+t_NigENW!9#Qy#*a-rO>#{XOo$n*=;%Eq3hc8odGNPXm2NT zy8>;!$T-#Dz3x_v!uvGoG?*ef4rc4ZiOYO1rw#Fv$wtAp%yBzEJ;rzjLr7V=Q#LnD z;+qNB;@Rycrky4{e6FU>T#jz0*fOB<6v;r}fl<0a#bJRn6zbX)mMs=`> zm!Z4xJ99K)@Y;J*b$pbSL!NFFcDVluS&p&ff{jGcfTD=)=umOq_xbb*?L-`j`wkq9 zUuXv1@`YZ;?(FGfX|{Ew9CeTG8#wfPo0!B#?IcG>B=s-5h9=Yc0)*#h@#y3?N2)muqD7F0 z5OgA3&w87P6IwP{tUKtTRbf5mKI)QK>)Fl@8u}tMgsWNS>UdMN?}87k**4>zUCCdK zDzuh38^*I%52r4mRE-49e9~dG>P;#VDyI*oHnquY>cG%kCFXeLYVB#_>3XKkIm10B;A#o=MA;yyJot~&NWwU}6&OfJ(d|VpR$2q#BB_weq z;Ups!OlX_BPK4R9DOn7;6fCrm(`5H&#%zkF^K%*%GM?t7DR;0jQTVt$6l_9L>8=WwE&8OYnioNbua3+_wUGEowv!7kL#D+r-F@GC_YLb z_ZoP$m)gEW1FEud7oQ;JfnTS_jd^P2A#20}*xF_`D!R834ZmGE{Gr;f?6=~P^_ zl=0tI)lcqTN1S5^WsT9uO;c>Mjuxo{B8AZTwX3g5^Pv4{kyP?jn1J}`V$b>ca^VBh zpBM8UPpxNp`Iv!!`k;MU-*Q2HILPwIZ5+ueB_3WO@Ri)Tjf7-Wex@T)Fpno#S5B>` zU9N1nly%9k_}wYjJXZ;-X2>Rv9~x^>H>JnoG;`CiT~e1YfP^M9kI_X2?;FxDuvYjAV@m9dPtmu~aRUPDbsh$~hiH%IuY$ApL zRuNd(V-hH|rw?nQfX$Z^mma|Z2`EK(EQ>P{+={Lz*djLWienBC5WZ<6K-=FX*rF>` z6aN_p5d&rbrSW|ld^Ug%#34P75N?(pyNLH+HF6;RCdHiDQJml!QTLzblqE*)nF+FgFisXKfN>? zH8&QsItErY(O<{P9sV0GcWARKam){i4_-`mPrLOONwMQ=g@Sa(k4&CYexy74D6EZg z8y0m<9Id8in)F~y<@jdLxn@sXm#|Jg91BAjXlSEndY_LlshaKCbGQ4~)6tLSEl8~^ znxsd^EbN#CjuS3^;Ra1FKjgqiVosBV>vc3^W~3NL%-a z@e^R?ZT!_vtsJt`2?Etqci=@}fvxRXhQqh+sZ|`(?Ca0j?VSCE{aL)FIkp|SbP{-d zSooi)xq~Xt+|@(Gw8CpRcI&kexl3Ek3<|t5+p6qlbXM@3R`8CKl4bMnb&2YwWe6-0 zlRohc6gHd{A6$VvGG=kbxj!>{{P2YJlw6mv(Tcrg%g+K^Ssf)k*jVEi{NU6s?y~U3 zoC-gaD0Po*=7b!gpQy(yBc^{i;vBMUW$Zz|zam8N41d%1dwzE#^_;$eVEJ6@>*Xwy z)q#q=$-*~N%@QV+Ym3kM2`+czokNT_y|3wwtKRb9!S%_9BFX>WDM5J=-cE zZ=s)T8Z5tQOQ2lC1&U4W}M5FznMNcLD^&!2aeieud+!&O8i zr7Z~|vV<@o^}s7u?Sh*cciB>MC3w3)n;COV=L~}?%MhW?ymg?4b;@!>aFW}P*^-?8 zrot8e+j9tUBsn>`@u$IRcOd0nn>Z?AVW+tQX?3BEOQ-c<^1aZhMst*hz#1OxwbqY``FRCuA zk>Bp3=Ndhdzuk3VnyxEEN>yE=^6*$J!>K|<*UNLS7wyS->0G{djPs6(j$02dIVcBb z=E%FeXR?%`ov8Lti$H}=$)P^tXx=pNC6y&NV(uZb8n#8W#?;LA*31q~Pp_mlsA=$! zpV-5l14kpES14`ud>~l`9;RN!887H`B@ccLqMXG%OqVwyzkO?rAo`(M%ilE~>=k$z z+^(#b2IW^tgWE)7Q>#>>Om2}ghO}Bu>*TL-2BK_vXp}QY<{f+;Hb-UsL?yf5t&6=T zp`uj!Dw&#!8mzmP{Y1xZHw3x94*1`PB@S``fgjO=+w`wZYHbTC(+KZpzjNDZeu`{j zMXj%*G*RWJ5$00CG;bCauY3!Jz0jX$lf$K3>2w*I^yXX7gqCAaH~;WK=M<@;)I!Q_ z%mt}(J+ryCPUr(cbYeHT9Hp=5=`KCDN; zYHjz8`ImCL(pN<2SW7nitI4e{U?unZxbU>VnpSNReqLo&Ty%b zHe5gcj9$cbIaakQ6IdOOdE1e0$WD{VBiERM{1?b3b%Tmd0pDJauKVF-Xj?WHaGp)E z&L^X?_Qd0#_zDk@=)bIR=$5YuU%zdp9q#}KbSUY!+_g| zSSK4=?ZwLV3q8uP4PKQIuUf@!v1tgU407E%cF?$JN}--VKbJzXoiFL_F9I{^P+2$A zeaH8THDkM}%%IjF)61D@>ufm%hhSYW*b0ItERDJL^+_9bL!nwkua)#cJYQg6st~Ky z!0mrHlUgb6j>3CD^_I`>K{zfrbBHP(Ik( z$Y&n#-l8U>i&$+2uG6bE9B9*Ng~f4qOK08H9nSqqmH=E=h-d%T2X~I7eU8%Cnms~e z0Q>gacBEI)CU346T~|XVZ8HBX1y;k{S2Gp(NKqAHA@TxYdv|}IwA;U1%)UEz@XW+? zOll$tzx}pt5Ux5!;Ig)3fHHefs@;iCxYXb;#Ou017DbR+Z1VCdMc-62Gn?e?(I=qs4@-&gf7GbXvVUn9cg1%wB_ zqZLV#!-`Nqfhw?~v-Y+Je*X?tYW=_k(C|o?CX+ch#=q-&o8o!eaGHLZ@^Hg@+4<%5 zg<2jD9ZTmqD4@VpH!&PrW}|Ya(jo!fY|_*Ng}O?WLK6)Je19BO8Q5<@t%PEs<_c=4 zTy0=~b|*!6BTU6j7-Cnvvt8Gw%#C(JcU&edc zc&746y`V{}`5Vf*s(HRnUM&v_q?7gr9^@0&Y-?rajDhtca^CZ4$X2h2sF!x$MnaQl zpaU_Dvi1q1plAzX%&;*=jM&=}X4W@`zHnRO^5MXEdLG6p*%Lxb_Lh))+1Jf)oFW6L zc?do`KP+4%XBs(Eu(B-gXQ|+pX1D3l+t{~CLyqPT>GRPL3X*aYoXtQ0?;ed-TvH#R$nb<8Gm z_9ZnkyF3=#%L#Hb-P;D22^}wy?P(;c92twlyS=In7)H@gvWOPcE4i3js))x9Y7*VB z#0$3)Tdl9IQc9z!ERlM863w>8SE;5bNF9?&CB^I-p;&g1Eox_dQOuo-Wkt2glyXaL4u8T!5}Ke25+VCY%$ zd_>UON{qQQOQO0tTd7DBfwdX0yUWKiF5dP7Z_QlT=-x3fDV+(8JG5cSJ(XP^DHeoi zJ=(mSUHe8ngQh%{>t3?AYI7|7Qt|o7lytqpi@&$cS`_rS4I0}_naAZVBr(UK_b^~R z*n!qtvHvS9Gz(72t~+cbGxd^vKnOBRR-r+7ND)?wh51aacE1?2w{kxeEEP-TT&<>1 zLtkT0m`jVYfv5h#*uJv|K?}8GP+5T@J4aj#5IfVixDpVGTnr3d5RNlfOk>wcBHrMJ zuLU<5lEYEuCx%zn=)(Z0MIK9=1G$E&A)Ev9BW zLR#~8g&wQF9l%$OOeYb=Xwt1t~D(Ny6y(o}enL!_@G2~`Y7FT~-_y95`#$;Z$W+E|E5EY;&IhYBrp&qdca zV-B*s<0nd5-4}#nD6O2CysilG*M%mjLTefT;^ajW0J&%g{%whsj#gPKNl z&ETI1%1bLBMa9D|^aDlB!#=5p;W-~18&nfC;)WEyc;6C!2?Aw*9B*Qn1#hB9jhh`y z?_r18-%y*}z6;!Dj z+vqFDqU2y3DHI&wf^Xi}=NM%%Z@!yVXM$y~T549vo~|xwZ#>Nx zpVR(wul7)P+^X+L1WzboTYkWF?s}w!>jZXp;zP30-3HQ?+dEvESW;@kAdx)dcgT>V z2k)Z(yey__`ZnK8rMr$=a~KhIP>aNul6$ydc{ZYriR=FE+1e%1IRjtvBt)|^nJ@-~K_tsu`lx&^kWh1fUb&UtR`#A-UHr)gh4Q=DsvwDmK z?D_Qu!wg#p(Dw*k+jv_x8i^Y1DU8p6pXAu}oZpQ+_)Ha^$AQJE9Wr?39LR34K2nay ztI#X$`Lp#maU7lO9=Jke50yCjUe&0Nk*_T&002F zl17qysZ{hZl9LtS=C8pgNrtbl;F;*-9>E?Fy3hxIf%PDvT7PI>emEH8xc6l2${w8) zM-3WIxhNF&K5`4;jl74VvQvnJbXsxF<@&z${qP|dj$mTM>&kjFcBu;8%m z)t7-xtHkFHJNa*e`BeMk*xtMCnZksJJCT9U-v{SnUt9v+)iUI#k&aQ03AWg<6XZg! zMz1RcROEZye-Aav9=eg7#B#c=E9e>ert6tudj@*=CED5DXg;$Nf5M^d=ujWsfpm&> zJPev#;&iA4{a)|DNP@9auz)Y`=;K=oZ9>}+w6dlnv z9MiHiC|jv5HKCQD6~Eb+(^$#+hTy<{P~_UW?ULkhG!Sn3>!s&#llcDTmLf)XlCi&~4`rSCWz|M0?P z?D&nxt!y+Osey{~^AFzr8-#-hJz%R93m}p){ntz8zt<@Lg&aJj$mnn_7!X zh!R*I2uiRkFcvZrGTYM+|B|op)Lz$BRBZMV%L&y?`+P41;X@~Zd_DLk+%4y5%_{Xg z8(vc%Q*GOBo}O!betsWd*I;D*z?HQ2N_yBXv(*R&!tQj5sbp;UXgr<&^Q`OG(P z1=PzCF{Q}MN}h1Ndm?OML+3_*UwGdcde?UgPUKI0bk7|dl|n|B)_4EbPU%Q_OUaBH zt4vK#trgCqR53Oh&-qX%U@)IiLDB9&za5=7}ET5@G1FKm)KXD4_=m$8zR@1nb~#O;2Tuf$+H zdW&aLqZbK}@6=_D+kDL?wNGT+&AP<|TrkI|mKknK8yicev()N>ypRk+xdFK zu1yBva*W2gAnHNNga^VK3JJ;@%x>w@G^g?zeA2TtV?Q}5)4FxYxj?Q$>xd-MxHz1LEgb*JxNuNy z)e%Vmr3)7UL?ld9#!!0?inh1aq<4-$9~F`TEzo>4kOc;pksW4f#wZ>=Rc>a^ZpQAq z7oh(@?ZrvDejgO_^|nX)iDUCPr@N)2?B(tW0FqV@!U*8!PWMKhKCC|_r*r%ULJ>`n zBx7THsC0R4%=*BMEa$BME5AJT#C))au{S|O*^;vtR#0R-Z2*#CAz#8C*FW}=)C643 z1Y~~FRWR}Vfn-b7CApL(n^NWA$x%7+!O^)wy%$O)qyC4ea%u&o2=Z^>374Mf6{kgj07r6F9EaeK*3(>^#*(3-RD^eG)md)bf9xtieg*s~rF4_zdV;-`~&~a#AI-Hw6 z1v(G}>R=|C4kXms@jCG#LVGGGnHMNCQ%!wSl30C?tW#Z1G?AD|`anW`KrBF(P+89S5>T|>}YxdT!$knx2k?pn%h6)XC$&K@=HMY%iNGmQkV~#irF&ifalo>o!y{^e{xG3bWtL%6IACKXD!;5p9h(ni`g2ix2wDZ>bRyeV-ody?oiOm~)wl|sFmzL!5manO8zEXZ!qDAH z*z|Kj?`8(x^)w^^nkj4e#+-O2+GlFxg5{rcXFFWiD7* zY_b~lk(Bn`q{z%ZfMHRr7OqB#$_%K`s1w9DvKEPr-ls{LDGmyoBTW>3e3^&r#9@F$hP29Dpj2+_8--qN1u zuh}YET%>anWs|hGrQ9rXv2qB;$dq9T_NdW!0&Xk1F7TU(q1#-IWD8?won! zWw!HRExb?$k;eL~BMbSNV&r_faE1MX)!;~L|D>mlz~;=eBip*VZp1fCLS7MPvIz*t z24N`{!e!yvTkUu;1>C;skO1!G5Rh=!rtacatJDl_a`*bx{zR0QCOqc$8C^Qh1*)sG z{7I{F5kd#BE*_p{_d7ftqPUB$-ft&GM7MQq=Ez~!3Ad#u8_Nyf7WF?FI;)5rkoP^K zGfz4Trj3ppThDM}TUe?^aEC>$9cr%FJDcRh%XBi@j10>!_qyD?=ORla7j#;pnUZem zibSstiF(mG$GNXhMb>=!Ag_3s$ffsBpxDYV->Y?mw`l^+P6%$R^-D^y+}!z`hjfGA zI+H)5ELVJ%TF4V2*pE8I=W)dmS+;4T52u^hu*tXU&^n=6`5}oPr!9C-q`wSmm{$Wmpk*Q1ohI z_SMGdcfl}P#}Nt>^owHIkd$OX7&0dHn+DJrZ%EFF)+Xy?_qqmT2FQc!fKUnq@DrcF z_I*8p6XfYlw&(H}h=c7@nPEaj>$3ro2te_djUziD9zjS0;ez-@a6*nj(3-eI8_)sy zi?B6SKTe;#*9YVYnVbKbpjQY49+^A9Z-K3-Lm4t)%8%G?Ku@~pGAL^EZG=+mRI%I5+9_DEk+TFMM6lNEvybvDc1nIuhFpS83Eu6QYg zKALVF@DC8U-OXfo@?952cL=->3~*9=5QZ={&3hv(3)SW*eO~6h2l~%f2eN=LAL9=Br10 zE@0Y$IWe4P7DsE`IY!d^jPHZLT=K6Ohx3xbmD2%bzTAi63C?c%gfsVYQRLEBr&J5TnV55k$VM^qTgkH0^h7OyNe;23DlIa7YJ>l(ObJ1co`F8+m7&bs}S4 zIT~aQ?|mBzBTt;f=tsrZ9lyW`-PNf;r0H{PW)G9t2oJ_GE^Md-$C+a!pI{VKQRHu0 zEw&sjS`$&eI#ASb@f-;@B%wtF%{gQpRP<6CRb}q4tqC%6r!GM@4iz|h&3Ydap3_Kq zyqn9V&B!K@-Yu*_kk}5M%RMZ*a){@RwKDWZZZrL`(S5xWX_%7AJ<6idUeY@#`gy@| zKA)vCS#;pBb#>gk7B*Rul=Z>Z(9vU?04Dx5(w96C>E z`RdCzUes&oVN>h<*AG-ZI0I5*_K513-7aMn8gi1e(3WVgCFr zXBS5=mG^Az9nGiji*uLR{~C6xuWZArLX|re=o@ohl3&)?YA!sS5o^>HT(@Q1@VFNW z=DP2J`dBa4zO=l_e%Pzut6zpDPi>P~$>8RgPZI@56>=+}e(3NQUD_v8kCS&%KNZ6;fKR8=9b>Unz~ z`U4&9)$aaHZI(NW*14*7re*J$9oy&r591nlI7Kfl0EAEu(ChO5*MpXX?ccs`{|~Vy zVGM9X1i*St9RJ{fWy}9fn&1JZrU)Q_qO7aij~9=Mh8HxHM~27~Xu)?C!}yB_=C5yM zckZViuYUdIGxVoHXNUZ=dDP&>a@O#M$D4aLFuQO(p(bS}%uTzpA{&N!romN=+;d|w z0DCP^gt|4;?R7e`W$c~#Ae*4&F|C_)1S1_S!Wc5WHSzaDRl|ZHt&*R^p!qcg~ktvfX zMEU|FBy}Oy2&^Y6GRtT%r^OZClgX@YOvT;z;3a`QL4@=1lFq{b6n3@8He#=AwMd84 z>zA|Ce&cCeuawq=m>yom12}q=c>W~EoOTG+K=P1KgGe$l15k`)Oh-CG<4nT@MtK1k zl?(Y~&F{4V5AsQ>+EC1;aJ4s*E+Lb-P{RWpkf>153yOrLd*Y!-9fT#l&$+J2yzpC+kbNBsH8;Bav0$60W5f>$M zkj-!yJg9C&`pQJ+%q=%HJC%I!Z(*WZ^li0VRY#cU=ex^Wop~Xa{|aZQJ1Z1@C6Yc& z<&cCZ5+0Ha>W)IL)?vX8ifU7kaNX(R^X|m+^f101K|0b@Ekc7zY1RMH%}avQ_(?jM zco@CiS*|yLF_Mw~l}w@DGzGm}Oh+QET#S=J5F4Dh@;6Pr%}Y>v%3OW+BPU}wO1Au( zRQ`85G;g-!0>fP*$$kEuGI>K-5i~Fes*!#py(4QFWLK^y2x#q97sR+t@4gKHX4F_q zAO3~|hQk2*<)n|iwgZCaYOW8v% z8&chFtw<-vYr01f+FySXf9;#i`EBg7nAG9uoYzDbnupe#iit*l0K6;pYpoBy)OESb zIPBaDlO#rVJa~4rL7Xs0Fd%Ox5`{Vy*_WT5h1baZ@smbMX>iO=b#Y1`l$x=Pc_}`2 zf{bSVMl^tM{YLpm+Z?N#&=~wDTB(?Ih_)Q%EIhf;?)GgSRX#L#DD9y$-Ql>Q=T2}p zadi=ueHcvmR~VB*1Y*5HYf!6M(<26Jr6LO=0)@XKcmjMHV)clEj$chzu z`F3kab0wSyGOJ-H>kpDf^P>#}$;fI_!ia?r--|9x6HjdrW|obqI|9W(cEb1|Y-7W7rUS0iSB7HU8>8R6}`zO$fP&}a`r5ncHu%d*Lk^V7ECY$%ba16lq zqB=W8ro>2X1M8G3B+zb~r!3gY+vk{hA4;rK1elnaINi!TRHj?M z30+1ookCg@iu3^qAwmjM9G7ME3%Y0fz*H=(wm^ibkd5%H#j`|6jPXM%B-P1Mu;BJ_ zr%-=u%S2p&2yM6-n*yQY!-TUavBZR$FT)fH+Y{Hif$dOw{zJ1cC*-+91rRY#KwfeD zk9qYU5finr1~|w5d2=c7$N>nmKI0{SCl>T65VD+LCA0buQJ6f0u0C51K)hO+yrB2^ zZtMUT*E8_D!cbdqU+h4iq1o2NRA&p_+ut&VF-SsW9_XMQ2jm*6}@We@RE-T0@E@fJ&zyS?76L)Gg+Sxc7G=`(Ud_qUF{FevY zwGtQxo+N=z$D3BKH*XcWzm)U{w;@@mQxo~+sOC5f*)QIO(jK9bx2;vUq9N2V>c3SI zpog${%8uhhgh-D+eVyd7adMM(d7%sch|4BikIy-Y5%b9d+*+u4(A$J9S=>rp=Ea_$ z>Kp;=AY^h;XKlwZ>1G zGqaMzj$P$ewaFs+!%`(2{Zp8#2|gJCUW5|zYdEj!p4qjK{B-4JA%@yy{}zYSRh!#X z7t`Z;3!UzlG||x>Uf^Q?4=^}PcIuhLNmSwvq8UD;4p(;x{uxp<(4iEpvDCcFHVZEC zaZ47O{+X8XNqHS{XdDmni;8wPxvp_>H+rm?N@w|3lY+dBa{d}uXqXFO(1{GFW7ig; zjjikQ$8w!;OIjB361#Mm7Bc!y+AE3i$4ZmK^|`vM@%sM8n~_WL7E@GQvBg5BYUqg%gsNKwP(-E z$QMJ`tt4}_l_Xq-XNVj0417V6#t6$~kJ!hONq ztdS#=U$j6PT1T27^lnXiCwtmUh4=2`E(bek4pyyj{@{~;)OAs9(o^H5MUyYcc(mfW zO`I3&*ZNfa)Of}m4FpL_SFxS~baMd(s}yV}>irIV41s`mv>ydS)SZzTqN$U%7bcT^ zfUAFpUfb0!XXf_MaiX8WHEGPI#3S!;vW@m@1KR_Wq7QSy2eXhuCEWv#nhSldXGr?{ z0n-F;^q8LnSFlebG__}RC<;TsIf`b;0ugp zJ6$3tGi)bPodXAw^bdlu`Ru40u3o$RI25h4-;ZoC=m~Xbk|+s0Sg4J!G~NQ8!Q&k^ zQBIaUV3%aa58nfR?ss+%d%X8}e1v&$M=8fNCpD^IsSl8kh)wFmTGD*}p-IMcwzT}0 z;}b2Qq_X_iB~{i=$;HV0|BVEHl+*vTL`MZ!KPl&vc^WdvhKa$33&_w1L35(ZO|A(3 zhrpsYwHyhaH;~@wfcmDreK&vEG&* z-b7vTi)_EV&%(d~YOuYpk3LkuyA*ux^{<}dZcGA#VFu+v0HqW{uw2J& z8Ux9ay5HFB$#$d5WBMnaC^1A#|6+dq4d? zP_?kL{&)1tWQG5j)zCfup4Ddi;OHGlT@B6UkzxPtB*UXLTql1S)?OEsic^bIH$AyU zxq(69*VV4PtvOBcu-!f0a0APWrPnH#tpy#F-6}7T%%B=P$pS<>4#V?qZL4A=j*Y~& z#KxW=mRh!bP{qk_1H~%NVGiV1#@vFzd=2EqM?x9p`x9 zxWbBU+jhmaZQHhOqhi~r*ha;6Qn8)%x%a)--S@ux>;As8&;M)hIo6zOt}(}m1*eqi z?B-QZ{B=eW>;?rXkXLn2qgw062IVFiC};cWNZ}Zfyd|LwknR-=)xxY8Ijx;i(eTj) zm~d}F6YU5$+lj6pt&SyT&(@L!TFyEaxg2qM1#fG%>cTvJIM|oM!p~{@BD3EJv?0EZ zTuJ!Ji9ktaMXnFl=6k2d){Z6`DguSCA_s^2C$SfEfQW|Oo?6={rw7(Xu@H^9(tu`Y zSz6V*&<_sD1|uCZM+un6XpkRMhF7Y08M3eC{&f!QwCDA`0FdhB0p48yk2$cvR*?Tm zbefJx#^^p>heC7ARo05u6*KvbC;35%PzoMm84?DCFp%kWI_zss6p<&i4ITDL-TuCP z7&x*)j9T!@LeV{_q$lwGSSlwDRD#Vv&RVF*HnEl|k{bsx%AtoCkH5M0{ zIs6Vwc2Swi^Dh|yx6u>N$~sfGLH{I%7p$L^(#ed2ak9e(r|+0&##g zN{7m?J=0#QlCP#5Ez>*@YG6;xPr_5upTRZLAC_~%_S;LZwaagAZ`n?_&x;7Kq4OPW05B;KR`7NbOmJ>`d&D_aFRiIXR6qa+o3@ zYsjivog|oJRgsxB7R;?-QOFQ$gqeZ7CsxGZFNNu-(CI(R9D`3d7%HAMIIN%*x0{cg zD`qbqae&O1FixS-`D`}3c_1OOTz7hsvNWS<{Zg>rY~S>=+mPM)6MU$`CDB&m=rw-} zR;H8vf?|cyw!@?)ySUE08Ro$=WdT%%C>R5~1i6*4B|YM*6WN?Kr_=xH2_x$Y5Q9(uD7Xg)B0pHN`k;kN|a(YnCf-GaTg z!78-iRG&ytIVy4ZZY*Cv*pRuApmd-EKB2+7D{>^RpkjqSTnCyAJEOPLd4!|*N9l{+ z+&;C3?WMd4fG^7)j~rp2)o+%efM^*6swW7v5`RN)`?BzQgr5>$GLNuGSEmcM4!Id8 zSQ2#B7{r}|wxR0GE)lw-^)+Gcb4ph;g#uLUZ3XesrkYUqHAt5LI!($bhYhBG#X8k{ zrJFeb>x=-bQ~b~Q@?Tj0ml*NCklvJ}Df^2bdH55g19>c>)&YSIKXSKTi!y>u3Hd5y zmn0uOnipogHYq8kQMj_>G^ zZ$A6|?tN183kZ6Rh%rk7j8$0P?^5&34|=ep<2G@~u2%9h4DjsNE=!ps?;VB#V}3`g z#a)gNSdN|8N)K(pYvN$mpOTZeTeGjr5lM%vOPF5i=`Nwm2 zog*(W01}9t1v4KPl~#zz^KP~NEtmvmK`~DOd$#2qQ?aBn_G1nMMQdhu2VrNYuyT`o z!XqAL(IIvS@9-psSG?&_5X0~W*l?Grn7{sNmz}i@M)Ls%TF}vT)>-7N;tp(_u52r5 zOL5R?{HNs}*$GT%lPUb|kyJ*xH(4!S_b186{a%Z83$xXXT#0@`hzBezCMHG#5+7bq zeADO;a1t&upIOs*>2hr(<1FwK%=wKXeCd<>l?w_=tg+9aONms1M6eDCe+iD?G?M6V zLSnp10v~HqZpUmzWsWBfg~l#!AG#=ti#G4Zy2cql-#^C^-$5;Esr+e{v-x38KoO6{ z`2}lWUiazc0^!aU>Tm)%S8HWOJ?UY_cKl*+7}xy+IZxnD#Ps>J8yQSRX5O(Jt)`Ef z`39@F2eHVcG_@w^q@W)ubDM)YWo1$>s7o>>?bEE(yop|n@$OXFPWCq{*{wAK*l|EX zDMwtPclFrI@~iITxEdG9(FFOT4UwhuA_)1X?`k)@)PRVllRlCrW?@!!1!v7QjDbls zX2D98kz5pT+E#;PiWcRilOzV|1;EKfvJN!{%_zYTn5QX6^zftcn-B_F1Ac|Tx6LVo zAhwwDRJYWys6ajX9ftZ2u*{be0;`H_e_?~)#gz}H%uqyJLZ;gmvOEL%om%%UQoqY0 z0*&sGY99TwZzn&}MA%!3>=o46O+xpG!@C7-Y}QVW#vv&JyNFPYiCDGWA}fCU zVkYwq*uj+h7BMte_fJww zHpa@(*7DG%$uAS%{)$(%X#KQ5%-UT6^)1QY@oMY>=xoyo|MCA9W=C|~pF{H@rau&f zyOiGer8_ZNm)(?X;#hi>ET|o>3{=wM5SKGt2;Qx6-+(^I_mF`pq9Ne8IxZWSE-xmg zFPGT9toMNlG;g{I_P`1Bn)5`sTy9u%O#|ocI|b9c^y&ELzpnoN`L%8i!h!v4tgJ+& z8O=fg8DDA0fwn4KiD>*8eV(64$q-rHBHp~oyNJTTtIa=^mk@KN1nu zJ(DVg*VdVpx@WFOkfPb?F5x4VMVXVXjLCqYEZh$11OG_P5o*2NyE^?32wMS;AfnPQ zXxCpXIvKrqqf5RBFNz4Hs$CL0VZeY8K#)mUNWpA=L)&K;e#pxp1lvRkT6*rgJ^R}? zfUC-^g9Cg6Wx&4qUru`e*Eje(qo7HFN4B3H-kTOk@Y%v20kT&KmHIG7uJ~&Rz|4S@ z14XqLXjn- z`=A;iJijOxnrmz>Ado%%`w=OVa2OWY^Hc}!_N7h0VyK40?X!~FRGrP&g-v)+w02AT z@(9#xJPz3PvnC9s#>JS4RfvJZmBU&5k7U@DvD}B#H#kP{UI^!CeaJ04s3$EO>-;Pn z+e=!2tC1GhzDsuBS?7gr2H$tTnqpi={`5ZKgtHi8rG&t4Id5cx!V~9$_4Hh&`zJC2!O%z*S>r&;7?~OvZ&4ZE3)Sm zGmTvV5!D1>to)at<-elp-)zA@@cr*{TUk;OSrz%?f*TztLsaQ&>G!V)A*Af#?vX&D z`auN!QiI!8RVIhvtC;Oo=^<&>F6zZM<<#{u$;OmI**A5y300D*AE3Ve6-r&69fKyv zW~km5?=rcUS(jNHu(2QRSMWU@rC$e_6ovh(Z<`H09f1S*E5D*A2PX^ooJ-i)*VU5G zVD-E?RCgk~Xi-+Gl)vH}td~0!T4ts+5JXO;R`=w!Z?v1ZH%XhMaLrxcRPT+R=I~F4 z+}-4j@b32chtUqx`(D zG_;P7Texp9wv<#*kbW7IbQw>Kv4V;cf4%i}NO{IDi>Kmf1 z=n}XHJewW5A~?7{CVQR~TQTfF9Lp8w6ehZYiCX#|yC-_$6My=*~ zXvhi5+cHMSjgf6`SIW!9=cao(m+=Pd8Vi=@@K=duqVYA&)A}}(Dz-um(w3pB#@5UM z{{}whUZ!%0iyO2Hmj+V0RoHL_RK7_tX~hk3V*J{C7u3C^tbIhj;gYZpfhXx*rLVDw zcu+eGhr3#CvZb@fw?cL?$FX}@EaW*94hC+y&0=>%m)hLJ6DJ*N%(Bf4ws2%?t$I_9 z@l2se*3@b9*888ojCl)i^r5!7#@=(R-~4wd(aATk zEC1(5c~%e1{mms`Th~S95Pw2D-PuL*$=p=8GiLv{uXA=sYIpb?TjD;*;unKl2>V)O z&*H>wbP1g^;y#$-7fVSpH*b@0Hw|JA>Y`PD=lfa(@~Tk-((xteKXiuw0$evk<3C+I z{>;$-MzG>Iz^ERXC-Ly4RlF=gz`c>ef5=5*1Jy+sOdglAUIU&4+C_%bLaWWiSXSaA z>R}ZL0Rr{q9M8in$LXeFK40&5I6a(Gn3ay0qc9rqha>{u?I5z| zV9B(^weI+<{bojd2r>-Y}F)2MdIFVw!29? zk@qh6IgxI9>NZfn3FQA=cOQvE)h3(pS~IlWwCU0q&x;F85M+Qz*6+oPU_x|H+|@8N zA&aq*X6La#U0i++SDrPHoo@<9_5}~9Slue!G$=KHY32Bx!P`qrwK`BBx#kyHTuxhY-miBc~i2Nrag6k5ggK1uotINK{@iIl^+&g z)qEmRy)mO0Tz;G)0%2{dgj0ChYyJtCD45Ascvo{|C+99Z(j8=rd#shPz@#p%)p{i3 zAxd_}_s5IPc1rRS(n;Y^)2b-%YxHV(YK@;^%lObTJ@P zUi^_Y|Hq68koEj)qWnJs&o=+4=xkpLkj^)W>9SO}&9gN(50cEar_88 z$X;e`R$0m`V@>hrN>@bizCj>jLSNz50o-7u-SZ)dym0pY^R>~=ba$%HxA$`{KQ1#S zBkA#l`!oVm4KkdNJ`jwNeLsJmBD@`p;3>~|sls9J^iJc_tcZR2?O+fFyEZ;#7{ZA=3$o}?#O?Du@)SwrTkJXbaHIEH?vHUm_%=w^E z-vu?HgxBgY0}ODwBy(DK62mdOy!w4#?8eQXpZ7PG2++a+Jzf3Mds;zk5`^$g)8(^w zK5+T!%*D#lc8=(BSFLn^yj&;hr5CQs-Z1c)-R*cj#{h3{Rk$N6X+s zu#ojol=sWF3Tz1iEraA3e>+lE@KVrbMS#aVj}WL)DcW3>}c4kMN~5jI5L5orD}VgAEi3h(cG!=K^wmq?P1nUnz> zOoB`^8!6ra9XG)({5C!NLr|bXF=Z-*0U#M01Lf+dXf3onUQ7sFzfb|Ia*2c8d#@av z=|9efepFiU`OKaK1LhANlE;U!gNpH6QjqT}UM_M2IkO7Eo|TuAm@ z%n&5(5;KxBN88MqxB_F_?xz{_``ONMtY?z24;ZP@sU68SdsO#7qJP^#NAa_ZKqF1r z-o8iqn(L2new09j83+U@`kAJ>GjYB3Wz%oEPyKzaomH&qDGPu=6u{KZe;w-n?^hlr#l1j2}K$)@TWSRn+dsrW)f*O$8EOll-E%`AccPd=>bK;WS6DGhFoN!xmkqw z+I#C%9SXJ$Q3d2JRf$soH+7MK(J`pi$Z`i7=c)AZhx0V$*B}e%ASUShT^al=7b=2` zvA)&LxptSELeBzj#3!2wNA;pndagxHQhC&>E9j)x3(Hl=v9*C#W%*8~F$|-Gk`z$# zI~{Fq?cPfswaEC9J<8pj4(TdFbmj&Z(rf_5_P3+w7 zjRT)KWcj7hJ}_v&9c3^sbWE@gv^S~&On6_}ZhitX?|2+_)+g?44zdPx9L*cwidJ4x zdE1?WOSr&&iHU}G5I{!x1-Rd?W3SbAAIt29#YsL_@jU%^yk#*STlBG_>Fjh|s~h;` z0$*d(mTO#3SRfodgnbmp@lX(mBprg5>r8lIAgz?JJ=i?!i~ab}mpRrDyZ#}PiDTnM zQrig5Zp4)1$Ya}!Us*nh;Jz$&@3j&)Igm{#b6T9Tf&5|xf-^k>P&)XF7Rk~COV7o0 zcVL!0;a-vE@baq^y0@n^|%Qe z-#fB%-Xq%X*r>f&KSVK^a7D_xdJXHb>sdSyRAFVB2tr~MN=jGRay|muMi4HrcOMWK zA?UD<+#U5GNcHdx&Zz37yzTt_z@iOokAm@H0Fl@%f zvp5XzjSqA$idjUsOrA*K?OycedbPujNWs$(2V~VFY zfSWLy6JF4^HSSjT>6z}e}Dq1k%Zh9c*ns%|n|>70;koUqn8=qp(% z)_;lV5H)54Bl)o`l>Q2>|5ShFC771vk`?tlqr3<>j4Em)bETYqO*hj4Fc?jTDeYa8 zJ!K}78SEn<^^tx<3FaCl7Ev0FE}oji`nxc<(u#4yfS6JX4^MNk$ZM>#JU82N1Q1)a zX4UH0s9oAv*(bU^K#;~}vMk*^-nq~3=ct;RJErbrI4v&-I(aal%M@a>H(8}dS^vb% z=0mhQ=1#@hD|}2LS6{gX3yBQy-I#IhvmbA-vra>)R)uN#9mb>G{yXKWjS5DSFYkep zO#<r&tds)D0DA4tesk7p%w(9Rm`YWD>LMBIZtW0tzLBl54abAWbOzh}0#YH`=&weZ>^D-%L7ZnMdAnDhGRZlGHEG^z&>J zYF~M%D$cmjy@jSOSt_Vu zx)0~Hw4rG)xtmO#;`Czpee!$RfI~X&9!R63hMFe~soy0Mq16gXB#6RflaAL5(os3} z1=A;)lU%jX`v`Nia?SNT5m^Pz|b%aR0hqd{5Zvw}2=NFVkp9 z7-s^8Hku38Kzp3TCc=v|z$L&jd<|8vWa{@@mk`GwiAh9?EbP5x7;|()6M1FEgh%dP z`=)RcilxuBkrV~jC*Tewq027p;K&Ig<|Af`4BaQLHI75*nt|7g)q~%LVB_P|fK)ReR#j?Wic>95z% z4{+Osx4D4Apjft)+M%cqect z7)0>kX3v~+o>JJg-;CwIc1))&m0+a#w)J+-*XDh7Ub>6Y4WrdW)Ji&esxY5j_X~}E z;0y4p*QiZT=m0{`s_~))#4t822Uaca71vH{;4Io-k9gcTW6CXnw|4}1{<$XkKX1>` z&eq29--7enu{=-!k=)=dGv<%{V4a>ZX4*xU`~du~;8vB3MqjB;MGTOy%}{ZB1jCWA zdJWK@Hod+b-urL^Ma`1B_3N>bI3Z3Q(MlM`w5;l+$syEdA$UM|FN_sZ?oXImUU=A& zT=>*2(8`~_`xj)(Bwy^P zkQnvYlNhyM%IH7-Mfyf@^D|Koy-G03=942mU~DM+@Wg_5{Ox`>|L9-@@HzVbI2gf2 z&0;DYT=AsHq!Hu7dhQ5ZTw?O}(yGe0x;0?IkQlE9p4*K6koz+%8O@Ay>Y9 z<8Zy?IP!Vq+T!tK`+R#`1M;&!V-2(&>XAM(WZ+OQa< zpp@D|0l)B-D}#zopNOb0uY=TBlz}GH4hvd5qY|xfBFC6&t+8W|a;2PR6bJLdy;tu1+J!7UXhD6rA^85+$+N2RAUeN^H$@*`Fh zb4At`SZ`SaOOoU`DeXmK?S{gR2;)((;FwWWY6KBzg{j=;rNq#nmNnz#r}v^e7GfWv2S%MBraS|kvRf&a=GkY4jb>g z;`ZPS#|dR?x#s~g>ES>*Jj8-=TBn%Oql8Bh%*rw56o2CI9}A-z&6mwM#YioUwIMe`zC}3K(qR@ z{A>nRBHV#+)Znjp5rISOOM-b7BY~pyN&LtYCJNJ@x&11{AjmyZ(>;N-L{riizSwLx z;FH?rrjwX3PEa%5`lW|XaOZOon(Uu|bBY4ju8mBMX@np8_e&;U#80Dd?ASpm~TA@w18jq4^bR6p}r$8?x9Qt1M z6)zmE2jWhvaN0SL$+j$wZH8Nofeia)mSCpgdk$7(KtX)0-8wI;k9`7lJrJfp2D3gY zD-YxWbCf~Gkm=oRqNqd9A!LyMyJT%NGp)$m>xg|>eD~}N=InxZWs#47-9A`O*LP-? z7c>viZ$86KnIH1H%a>R@ZsBBxc_Fo*VEf5+adZQ9p(D$@H&JoZ1WwW9U(8pxfo4Y( zl&OBvRvh;mYV{#m1hFU_P|S`K#Q=ev~<0gdMtzBw$?jB!%>49A};zQ`xGM{K&HoX5UJ4Eq}FiZ=cnT3CqtB!L3( zTLRm*^mdN~i!{xF%*_4#Iz}7|UAjY8e?4D_G)!Fs_m1!;#j7sc^dOieg4CY+C7*u9 zrGyvys)$?@RODI)SE&R2YK)`iUsw@R)Uq5LjT88u4>X*4PKDXc%f!5aMtcW3iC*<3 z&rB^Wo=T z(__#ktDZHWuz&_M&Hgz<{MXJ2=$ZW?AD^vU=oOa#1Z&aRTNG`&+lx<33@hztcdfVR zLQLYUxh8yF<9-G4R1h_va-}@q@09VlIhC2dk-Jr6`=vD)GcYh^7V81_z07e76Z751 zlOKJG7z&!EUocm44Fv{nm|U|O-Yi7?r5b5K4{xg&z0xoFD-5?PXsb{K(#Mo?udX$N zif$`~_NO9?Va9h3BbLy}IumZ$k-+aXK_(hr0;j@dJWR8ZuWjlDG;719g%5hKc@)w; z+YZuuYU}e(FVs)@J+akaiP1fZ6$593l?mDjfi zaVk1Mslrqt^x2m2M&fD?R9}TZ1NliB;TQomh{4lAvkXGgPo66T!yn?19!HpEgWqA- z>2K9P3$7qx#t1n%#VH^k&Dr+!H}9O})Z-5cK!Zgdkn#xsF`xhOwf?x|{ZDJfTgmzl z6%?NfR+U8*RS0tY?X?+ee5?REdwzitDX}rBtQCmv4Qn<{aaYULn5%-fAK`j;f!7V6 zJpxXxf&~IFFSMH9l0V*9T$5)%Jp#0$3x95K@5pu@o zMJHE!$}mB3RZ8qWO$t>qxs^=K$g+t9bDK)$XgM4CA=_;;ABo7Al%hgAC#5&jB<`-z zrj@SGZFlM~8jXzWKz7trRP%kFzM7!u`%>JZ9=(+Mk+G^+hI1RM1f7Pecu4?_rIQ`X zXax?Z48RRSBal19R zp{&HtIp_K#7|zB(S*dbSI3~4bghuxg@+Q`%Qy8IT8_flCt7(NZXz_0s(VHKa@|8;) zT}y~`)}lY83`oBd2~IFCsC;3nco4=D4#;7@kZYEjMKx#yW*j^)M2@5yCP(Hod?xzN zU=_D88W`dHHh>fX6H%6Rp-I3i@(i>9?w&j!nJf1cpd9jON;P&+tc?2n-z| zxMPo;!Bb2+688&z->qlZF!og%*FXdOHMKCe;UH3F6l+5*2dd1jI(pT7tU#3weryQ= zW9)FAkcgv_>cijWM&*iT6Y$^wqlX0lV1@Q);q{+L{8w37qzdh&Y3lsxn_@It|5j?q z^^GHzRfbT~A?a{ouF$9FIXpz08WDE`YktqftBq{;K3vUf z>9}`5O($=1AJ#PSSt$G@Z*kp@kxvFId=07&z_r$h&o$si$@FY*%N~b8?V~syBj`w%swhw!8 zJ>Mb_;K=-yQ2$GgAbB-gyci=v`bQJBT=`T!DLqj6X%H{=f=N}!PvJggh4Ch%&Z=Cn*OZFMQ51mm5o2+JHDJgJkT zz70}#b{7hWuuj_1=uqNjMhS^WO;)$Db{Q&fcd9 zXh+add~nULRx(xDuabX5>N$&>IR0)EPn(D*Zk{0((#V#`10OCuG&F=1f34<1n8=IG zkrqQn)V_S8MwuXUKo}UVMeBn9{WqbwnfYVv%pfC-Jb4BYiZyMSUZH)_sPo zgL#}M$vR>-SS>-8wtWN}&-4hZO>VUHw!TvN zrI)OgSsg?DMsLICP$ME$Jw=Y&y@aG8FVc)QqIhFj`3kaJ3ZSOzm>Yt9k87^ScbCi3 zj*Vy?HkA$pd&6j~)Q-BvXlI*BSHnOotc}*bXsQjjU@XJj%jR#cs0*7b*z0|h565R0 z<#Q?qSagjdR9vx@?z8IN#$ehV?$po?8KGRNBEEcnHw&8@Hq-iI0VicphXVDIz-Xm) z>*bOlXp{|NjSwCd$?Zh+a*10Q=xLLvJUITCZ~h!lj-!_q55ofL$$YFIRu|L_B)pR^ zAl^KVATIJ0oZ0VPQk23ipmn<|eLdKop2jt%GL^0>XDeSeP><7L*B^R%_+cM9`B`Kq z7Pl|vS$>y6eopbjHh0#UEn=~r)l?>rX*3;YQ$c2$NcoC2f$ ze$XI^PXed>qN88TnOy;lM%7jiU@PWXKvjR$%F>E0t1VArF$VFEL_M!kvF!cP?8San zKOpFz>ew0#f<{9f?8&hk^tPx@(&pziY1Rz-p$p};9BIhA9@g?y3l+_~PF;w>i-!uO zPHY60;iX2g&)K;VstSdHT95wtd__r+y6uC9_~fY0vn`k!$Iv+++8PJuCYO|RrH_ky zlLz~4eA@N37WDF(AnNg@7WwjahmpWH>~Z`8!b>gW+w%;~z5@4dze5%>SS-|YSeTbm zWj3NW9+HEGk54|3C_T;oybkeoVcfKbJ-lg*2oFyQS!Slu$7d0epR~ovo58t~-~Q@;!0y}?WD6GlaD2E0qfQ2;^b8pzo9I~5Bu1FyQT7(m_AUpui7V=(+}!G`W~~J7_&DQe z^#+e2QUqKn%jr@iYFk87Kl5|p1Z?m$@|4i{woYsDhC#F6erkR4PHhEIFG-Tiru~q4 zem=Ffvrol)>!o;OzH_I}{_bG}-WJa~jr>tEc^!0vdR;;2!x4;^3ps_)hnUf4i#rS* zdrcCmQH;_q?zuBy;RgR5Vi7(7fzS>|^>m?V{hT>U57`&yIC*E?SnKsTu9w56?X}hA zCg{W{VuxcOfgJ;eC+5i1Zb|G)(alGK1rEGl_<)J0d>+@Ckz9|6ryUr!H33(9FlVih zN8QA%o?ATts5qDjf~00RSE1j)A$uQtmk%qDH~br3fsDJO>vB$E`-=DtUyur)x2L{_ zcK#JXXeni|zP5ItyX+oBC?ZkXn|HC~fLOoy7H zTwgx|nC1LsYvDR9wjaVr_G|^8NG5V#e8z`#7B8FFchlR)Vr~*F$jKE}Z93f?X7lS- z<~GgDY>Kya>d()G>AAdJWGpt28g-!-=qrYSf|16B!dz92ecjC2)m63C8avXClt#)_ zUI+H3y;$7lszL`V6}L1~E4x=>4<< z))ZTY9Nohb&$trZ!7{09LhQq%468;Gq0Xx?rThK3_2OH%87L;^;wyFS{ zrXz}NaFrJvenEk{?UNi*M$2~9U3(-TC z*aC@$dP6>Wyb-7L8?5Aq7s%?!i4Qx9l{Ilroqv%pZa9~Z-~4_*%0&X>&Y#X+v}v5p z7VLcFx}P5zH|8$teVv;;tw*Zq_v-XF9AF@Qi{_?^y-sphgjJ&*)HqAZx}H-H{?bp` zKex@yAiahjnYIeF zg6HRaxpH2ZFWoL5XzpSxp-(9xe{Jjo}HNAhtdI!@Z5S zdt8Z5*(0k+ggWIn2)BnWe|5;)D$CJ|fYfb!$Db4MXvb zg1o(92x+0N0UWa24gpT#Kvq2qOgafkyt)MOt03pOFf69zF>hen;j-HF(xdE>kaT3A zNfk~W@&2WglK8@CGs1WJ@3&v)ofC|Gg811-9WM|_&*eE^5xO4byY9)iUfH*}qrY<( zCn7RyH6_%Kx4xBC=$7QiV5%G|u{#07Y@aiN11tWM7|=(Ys15RimDE$u%ygJ?;XML##Aii<_(O>6@bdjO}p+ z2B)b@{5Dk&th=i^)X?cU#TZbtIr$!I)4N@}s*{N#4Eu+mP+@+^QbOtey^x1h1)-)|LTk9go_8B&X;s#ySTg zjC9${&FIAf()C%Z0p^=>j}Fv;sW z9V7C1%TMx7x#GD^#Zb$RRxmm}KsJ8Kx@en~2@K2R8`nY`x#UE0qAq+!w-M9(Dr!GC zRS2vK%$p7Co;_$q&u8pSc}icRGWC6sGZQWJntsf1-D>xs~K-sEe1UWF5tawmlZ0tnvq*F7L&Zz zGw(4NPdCh^!bE0|PV!ZqB8D0*wsE$b4yxwIG)v-JA{cf}r~*%=ZGWb;Ecmdlz1?Z} zbgj0_`$%~@NIj<7Any@U?7m%k$6DbplRZN=OY=o1R27fQ-EOO#r`2%I3?3P<;En$R zwvvOk2U}Wug6#LZ(litz9D99zn5B#k~K(`D;^ZXbgR79MF`S0yL%mi>vm(50?O|ZDR)qeXG9>9%m;^ z%OHP;AL3ue$gzQ)uOcJVp|E}@TR$S2a@p*yKgKYsL)jaRww-zK@bp{<^@;{Vo zL;D?FuaYszY;Um-nzA|O>VQn8#+5c);LmBtDGiz;i~TwEA!v6L)N?i#*g9S$ zM8W94BBf3vt-BIcr>YqXN@*i&x^Stxn>xFf$2YP^N|nrl zYimpXp@?oemKEm;MXU?#B63?v_8ZcP!|BdX<`$59AuMI}UKnT~c6KTKga=GlB=$&3 z$}R&R$*A>jxN^~Obx#apHg?uCzz9VZYI$tl#0GD`RS?Y3{GnY-i}?$JT0GKjJz1gt z^uC3ZUpKh|)x)4PgCmV-AZWQz2~$gXW429xOa&)CCnS#F*@9iZ{H^7%aFL=M42TM2 zKm+Wbqe5EWM&H!!>qFjRgRTBkuibgyuoLFa(vE(s~-FQGFv^TCXo#eP|3hD!U@6w46s-C%#>uMkc&no0~vtX(z$G@S|u} z;6%Ex0xm0!DwFrgB=d|k6^$wyjFN{DZ4>Zo2{CuB=*tZESvWXyD#l`qO?SrGR406l z`!>%!zT}*pB-y9=7FQj+xQ|BOTh3nRlp(?00Z12DmiDw60+!W2$>y?VqscUlWZFlJ zS4?kMC&JLVSZmKEM<&?e>8!}YLJW%>`9xfil0N2@nY^v2^#TdlRx zLKPs}lL&4=Jm|xH2KeWL7rv0fiypR^?4ZFeQJ+`#{(w2woS+Zdl8Bt4VyxvQCZ-5{pnw9e?>WMP0E%O z0O3~uqz3XQ%H;rG6L6{R=xpWmpIgfR^fil=wrtmwkUz3o?K4AA>KPV${i1CgF->(u z{Hr!3GAje48nZ{3&415VIf`p#o$7HR?PNndiMoM7Hie0o+KRo&hh479hpH7d5vs&Y z^Y9*VZM|Q_c7J@lfBWLhogp&y1!jWwD@yq_KK39R?EbmLxSzSI3nn;}i)D$tyMf-= z)Mju;*G-}_2za6c=fRnbrz|&;4ZhO!#^y$%PQ5|TjX<(ka%~@Ue~q`fUOQRh5PN)` zKSukc_>=R?V-cE*FDp_Qp=pw9q%~a? z2j8M@*4y>=2}9dzx()L`w;ohC%97(aF0FpbG6}GAogUYG}AdSK%_zHd}`EP`09?BSM)6S`x&jmtrTA$&^N^FO&J$lrHiet0HK; z)ber>ru?ZitfEzWfW<3+vYyqosZCV~4A0V0G&7kHwO6vo>Sh@;ZB0%Gen{(CI{mJ{ z+FwDE0)qtvVff{Es>z$AMI=xgg9o+4|5pe39q1C%&Al69r`<$KTV9FDk7Y>Fcrv^v z{{iV`s~TVT5AkeQwa86M2QR-qgZnSJp8|BDtkw+CDhz|2(jG?*)SaOk5eoP*KU%1&jRD42qqa$xOTsP&^tGrs30x-3FOg8vDY|7!9kD_uIyi@EYy9zWJKu_&A%?T4kE#15LLi=Q=m4~Q9EHZoB@J7czR5f0j;)&y-6&mc;Tg&!?Wa(UY$8n&9&+Pe#1|gih|FkeB-MlU3S|N+@co_Dj zY{K)=o&|tLU!j(G_Zc^@2y3jknS0it zvoXy9Lv#dYO0wr3sKk>3ESs}dKMfAJic`{cbd0-Kks*-o=@W1Trxbju6iu50nYg+0 z`0kGWFVV-y)hyRSWc|q_`NE6+vJf)i2H#quzG1InwDJ}p?OnJMLxB%^_S+nh3<)m* zTZs1=6s#P&;|e9h2!6~XdknnU)Dv8H3aws_tN@l9#Ssdygb8dXqvL47P1iI(4-?%V zo$2pbhbAu^tgD&nN3HX`121@LuQWidvU|++%u|A+^um-`B$_m9QjEV$?Gv^YAZv-K zq;Iv_;wb9{e~on;o`W5-nL?jol!un`^>6T9pRXM|=eK-6c9ko9M!X>&nc`0=B> zSt!SKH$=~t!8@JC(J|4{M^#<~d=}bhW*vFjI5LpvOhv+{vv0fWbLY>mzyVFWwCX9S zHcT2QX5ntDR@0u9$vr@8OL@&j1^w2vsmbTbZR_&#J6a%fqfcE>7BXscvgsvhO9iOf zsK=XensdK$+G?3U2UHg1Jga+F%?6jh3TR!=zpFUrm_O0sTQ*WJ}++vu`wcU5)Swr$(CZQHiH zY}>Z2n_J_Y{q22z+%Yo$=bAa^ni26vJnxCM+htShPEup(hRjQqgHv*H!u`dA&_$So z8FJ#s55AmpOwUyo!)-OA{p(w&#ASm<#AS6LQ}1NnV4wr@lL|84927W$Eu@_`Sn#c| zC=nj_hmRvTF7K77MdYZ0>CC^4Ko(BN_u2Xq4lK(G%UP4(le^3HP<_V3Riw~-W+N4# zQ++m~{eCjQoiuWO=xS)nJ&(a6WpGESL~PgFCR&BY{$CmZE{zTs;!th9TMAm&|X-%1W%0om+^fWSQ zMC1C>Nkr8<*t*KuR;aR~WShPIBAN?=UE2x*Y#h7*QYF@Z70u-gtp2G|szA6XEIEE& znFv`kVY1)@`>O!6(3ueZ(L;sug#lXei(QTd(Q=8y)w?zk$^!XOHMgvKzAV+ZOA-{o z=46K4Tqb}@6cUGCH!q%PWE#&AwMNxA*U~swREbq=y7zh1m0BFj#1Qs&vbW9&uwK7n z|KdJczjOI~(*DHsAwC7A9dxCi3uo6lztw9-qt;sAAGpwRaJ6klyL#Bw0wF^NMgtJ- z)#tb&FSl`Db|5Y_Y4vqAiBLr=6=mk-(~&jYm+bZI^k@+35}+ocV9nAtHk2v^T*yJH zQ^km!R7xQ)O^W0oCPaz*Vu=ESB*@33*{jlL z=?^5Ch}}U|a?Tnh456xzIMuJMS_;jf24?E%;GeXaB>33Ow)kS%HcZj%T7XH0Ij*i} z3b(b6kEt4g?fIlygpsnP$D~>|M2f7|8J*Sq>RIu9bpcygXG#%qHBgDeFwIdGVniu6 zx#hcyQAG+}VzOFsY1ufH65PEfi8)x^WEpIm(@QmUBA39USOaK%;NtatI7$S1LWIH- zO=K4-xht}ai>mT?%<&^`jH#pSReC8c>{(_Z#rinx6ou>*uQV5t#xQm1b2G<_E<{30 zc8ikO3d5Tku$19WD>jR-_n#kr>+`XGA`Sg^KH|j$Gie#usSLv#=;F>0qpJ~dd|vtf zAJ2S6oo-QduuFf&X|fdN&^dntbEZwuP!8p)3OJ-a(CwFCydVeZUW9NGK9%0FDxh243C*ZllMr68yHDW7Yccp|Aa~fXRZ|cyojX1->(-?1qx!<)n3{kqTCV|Poj`i5RGA%(|6hsgT(I3 z;af_i6-XU#C=ra%tr7>0Wkz5p)+HgEY?S`+TMn4lQEZ&JJ+dhvD%#z7&Q$V4`DLa~ zk;OcgIlC}P_yYzjISPh4YaE0kR_>VHfD!6JBq*0u{n7r56D+);_=)qdzUzL(7$yNj zMPH}V_Y7LYS|`)@0rV8cg05!fm%lF-^twsTOb^MAbeI4bCJYmnnt>jrA8XJStTp{T zQa_Raj7Jk&SC@H;)-+Re+)gPu4Mbe6lpuObjo}Q`N$m`>G|WkLE3(uqZ8_!Eq`ukf zVYAd8MDL5arzdy2BY$S?3~{7#|K{$;sr5{nx){5? zcC^;StK@#}kko_}&)`cKyWfbuy#t`2x_ zh9mv`5zM;tC4TIsxWsf!PqQ;=^k^X^(L+tO4)I zFyLN*F2%DE5BE_2KP?)Y7Iss40)?OCxzqgYj;G( z&7_NlDRv!oi- zVPZ=H*?;e#Yq-GU@qN!H4J4O2^?wnh!NDJ^*6wuZSMmJ{k_D}Tf#s@x?dZA8)P z_Ok3;xl88K7laTFT2sLhvRLp0L4AZ+EDO8PPF5{{dfwku5p6*%Q2hC~{ez%mCBHb_ zI<*1K5w3N&nkvSr^4%omgDa*36vvA*Cdg_cD91O899^uPgKF{?-zp}$e%2c~mbqFw z;`Eu2%J;P(oaIRzC%a(HjxNg;j#J3H>x(cc)a zk*BJrei@FvLd-nuw~V;{_J8y^47wySp=n(~$Z@?}moqGp)=YF{c2}?0iP;>Vu+9x{ zo*h^-S*~=bjdZNkOxH5P+fC^L24k0BO{iXb3MOSNvcS?6lg)ZNli!olH9Gi)Yfk(O zHA$&#c#xb>E)8O;0XHarYh&J>#`9-h>{*05tu4FAX?FexQ)7J5rc_2=#inLQB%5qI z;n2Bd)XG|kebO+@z-^$!HyToSkc9gPn;zC#-!hF>-fsWaoziA9Y{V?ZWZQRSR3**6 z8{N^**wIAbefi2<3g_-L?srgUB=Dc2$#Mb26WYPx;%PP5d@(!C8M#i}LogB-6XPA} z*IEts=llBhDbg!o&(0Bh{VmxKw*t@5L-j7d1XOedc7HAV^CE&joa3TKlYp)hd78=5!Zh4@aFfJ& zr661*Bp^n7+v>;g_@V$GCE)obiQRlHx;j!Dc$G4+bn1_Nb@cY28#OdtzSAa4I)?#P z#VCiW&X$&C^QqS6(nqI3uVE3X*B7-G8$Ef)o;9|HEA2lw;=mebF z;GV@P+N#OxGn7h~OVWPI{G=o0*mSzkRt|I-UY6w4;`nhUzd*f^dizvY73f)ZihYsM z!&5j}>Sd21)x$nZD|1Vnu+3$3YpOQxibJCV1KO~(w2aE8RXt>(xzbS)?OuAedurG= zh+^|$kd#rp?PQigeRh=kIQR79c3E-7ci#+uXv&8o<`+kxXhbqQA}=;>U~x_}g99qA zb2XBXWYcvS735Y4=5Jkicxg~L2vBLK#bS~S{!$So1oCLydyKLsnFUM&oqjcSGJ;fe z?&USP={0{%Uw$0>#!Vk(Qb*gKv5L#@-i+Yp;XpyuPaqx`t+a$sp&e{8L_x@FEE!3J zhQc^C+$+XqiyPuPm%4Obyt`GjwcT#29F$7F*$fumgJ+-YUE?>DE`glg zqbS`ui{Q(*e0m4#5UPe2H6+hJxRuvbC_Ju6h^s zubK7eDyg2?4v(I3Zxlfrh2xBEL923eBzG`!AZQD6$-hIR!h4&FWXj(;iX&4qY!wiW zeaDqVt%$29El_ZqFz#r^DVI8hk293g2fOFoGJ2D^o88^w*SBK6P>H(@XWwa#_|h}k z7X?2RBCF%zG9(TnXSK=sNg+@F_=KCKUix0@VN=(-|5VzzJ?+hTx+*Vk`mwssu`3k*+#n?lU8HU+EUjwCr164V@%U++nOBCg zL%DpB!u4rB>535T@gpLoas>;>>yj^?8r~8hc49XWVCDKADB__B9vu^Ue{PVyrX>@d z!qK-TLrx9vnQB5~QXZ}YGXkuHlyc?6E)tI%5zs!mr?0d)!nxkulD((}1Y&8aopY9m z4Yf5<;1=m}-3Dvq zDov?Yr{zgcL_4DA)YG29->85VOB&Kek9ll|{k1KOY<>Lfo~>p1m4(LHa4svU z)uE1?%?HVYlN8SP;1M5!F$I5#K_Dr(?nQnPF|DOYS`q=?Ver_1%zWg}7x^v#q>lW;er4!-@KU10)>R^QeDlwUX_}^SzApArZ~6)4o;;qR*fbz z9j%p)R)s+FYJ>pAc!x?LTp2Yx+=D*`Tj%*#-1**f>6k{tPR7I}Z^=%^Sh0GRMKjV@ zQ<9I#7}2NZcy4&A(!S{>jqj?MFy!;p1m=u_V<4?>Sq9)s?+rnT0`Y%zWzALxG=kzA?BIdPK1t|V27dxXsji}O5}5gq;3+QfHNgFpAI z@%)!^@@9=m&oiKCB?c&3{ReFC??o$lYrDUr_5dCV|5A4n<<;c@SdP!6B2a!{s<6Dg zyb??D05@S|OL5tTz6jZj*kWQ$6FLKP8t4ylp4a_)9)%&WA!F}^y_Ftt!iPmEsYi{c zw@LPw$B#R-Z-QK>gQ7v3^q1n@jpTba00+8>PJ`*X*2FqD>ir}P*bQ4x)-*$rsbn*! zL|vQ0rrze316%J6HMI?RDJB5rohDBX8RXIoJ2a3z$ciCBJr*1zYWfBuIwR<;nm4lZ z&xSygApmf;brw`Ojo_8}4y`ZhsH`^iL1)Ec2p{UU;9PL4)QmF|p>ZNV!wqjp&fPo0 zQe#{X5mv^MC$W|^#VXp^!C|e&l2{?a3t2E^^BDbEOVDp~6f%@2I1vls9Rz_m;x86s^0x~jBf@kU(xHXwOympFXf_?YC%@)| z^19-o?%j7ieCCFu(d!q7tbY$K%17okh0Bx*Gp}`9QlO7?E|JQ8J|2jJVRA3VSKGitXEe-@_N`XKW zI2v76NaAY{A0vYthUk@$kf?$Pgs;?Q(Nxo7aSR|0On@1`BY8ZQ&JD>~axefuRcw3S z+xgx;-o9>^Bu0J(5`ECDPZ{o0okw@vPnRDTSJ~R%Lw;QaNS(HIZO_xm6b121xKZt4RI%HMOqZgo2MoYV1r3_l9S9~z-q*O zUd`;5?gN1>xfz*KWU7i+Z4y7B1~+;530P~bCr1(S#ouelI-^jQrY9AQ8Q4-#>(S<-1{#>%s3^fwHBiWhn|2ut<42a7nAGbq zIftChCAuQ-%QC=5en9F~*hl=H4IWo23`}C2r!tQmD&r?9DUFM5R#q{4yHj*nY#?4s zk!BB{1}RDzEv^7Y{7`ZN?*1`8g1<1jrSRLZY6vj%I$IZ}E62RF0&z+wIsl9`vnnqM zdm$XBB)9rS(eIs+XNNM(e^QrG+lcrJ6S~=N$)9mWbvQhR;zIHC3r`&dG#?R%ei% z>cj7q42WMXVl*AyrZ`25Pko9naf4HSHE6b}Fc=t$E+C89WYmFW5Fv#A?vyG*`p_Bz zYvGqZBs^{25rFQAbeXWKC*&wO$cZ@$$y?q!$M9>7(uN;n*U}@+w9mrNu+PvdhbGT7 zH%_`E#$_mvpv~65gPvI@XBi{o6246BY!bVm8-X2-967~T3>KaLwxYW}gfnWfl{J#( zfSWB7eQ=$h2^Rx?-vDE0$i*h`Q(4H%@tpb9&lvn*Fk^qy%a@iVD`)BP-iBFu8@Y8G zYM58o|6r$NOg~=59#A;NiQ&pD0ZaMAa(F#GNhq^|lHX!!9@8VKPQG~7tDcYL-N~@tZ*Mtq zL)U-2;T&cELF|&`=a-B3noi;%&n-2v)$|QylT$4FB@*(BSngqZZBVta3LA_a>o@I( zAoj03{@uUhV2xOd1WRiVZrtmyCOS4g9^Qteze(4U%iKFfQD=cCJmnG10t6{h%_xDy z`+NhNlt;x;#Zt%DS7K#QF+92`H>67FT9Mt#`5p4`Eor^63Bf)8ZXh5i@a#Mj!JMX+DDB3h>>ocX$WkQm_2U6S@pp%9A-04Zcc0cHhFuMzv&pBL5?xiAnE= zmbUYYedbCRR#kg!Em-e3<h=p(FU|iMy&ZVgF_6F5?QfQEU!p=%^PJB(mF3EuYR6Z@Y*vKP0`Eeiw?jXt%2T3SZ9odF?|$Q)V)2v`lO}RBnw#UgyQ15g%j@-6YrR% z)mmBPUxLOR5>~D;K+wn!2pa!;tJmN5#9tK7{|O!~0U9T~R}!uUISM@d_go;qh6WpC zS!DP^@YMpJT3~@!(^jih!lh2PX5nqL6JbecqBwNkxBLkEB?^)laOaiQjTK{~EZ5fT z?k-QTm;v#iCnQvW5_%@wsNnr|n6aiIot&{>~53C~146#S+3ibO zEy>C#Ne5REmgUO}Cr4S~G&|lOA1}-l@4*U8DN?^HuaGg5%Lke(h1aCY?Whqi7t-Uq zG}-h6#YlQHc&8fD6${;x^!^Bs+>hKVrb(ubLMPd62~1*pMF`DDQTr+9n_@Ne!$1$+ z7eN4s(Kly<%t#--UjuqChkS1F1WfmMHKypoC1E;AMzMGteoCBt-7(!gD`(RQg^IlC zW7XHj`NfyoFN&R{`KiSm|pHFl3O;uQ(9Z7NnnXwX?`R z=Ojfcd*`IVDU4K`e;RT`>bD3D;ye4ngos}q><)TQ|FkC9NwLXH3&DoND+K1sH}R9| zlrLX*^&^pUV}b@8j{ZG)s){<|3v9wSjLKa1h62xk$4_kiH$wka3{>9uV%_ms&h>qU z0G2rO5Q1R7ig+)7D^}fY$zk(cgd5sw;yQuVN4p-SF`E=9%1cW1g^7B(35GfeG2BHC1M32} zWQIESzPZI_^M{_=`)1IcMKvB{OcrCjITp-TZOoH4Ug>X$dWvT}$@^W4J*&Mux=fIU z+36lz%^JY~)?o|LdS?ZEm5RcN+ll7njYmKIi9?iB`Fi=9*Ip%8vc?V+N)*s=Wv{UepJdb9apSC@`UQtL4Xz?dLthxI!H;YP<52QF`K zq(eY^rV+a1K$F!u)*WVprqw7@vi^;eBi!I-gp~~BD{I$` zK?akeOmsXk$>W5|Wn~J4nEfCQzEY9A(pVO}WVB@#UzLk$KiKgM9kgV>s{zw*xC1Njl!^&Y4EJe&qQipJWFx+`0WzLGQrTNvp;&$%NE}sD zTtWIEjfAe$=zR1cJ7gr4JQNErVH3f9)hf^R_2>1WF@m29tI4 zh~0uG^5#qdBMI~pR^aT0+AYG#N?_|gsNa+L1-#=T3_O25!YR6=P;>{_&riZ#vS5>@!6xan8b`aM70E%O|@JJblV%9Dv*7f;UVB=ecX*M39&uQvB8BhHg!MPjfrRI_i})js9v! zNp*EQ0DtPV5wVO_Eege=NDr+W2XXQI{CsV7eW6qHN%E>Bk>2wo#&#ZEl4CIB0GjlI zk1+Wh2AcM`{$ryk+a71DpgF6`5|N-!xiNMubutI|Am`)(%PH$zWH3o4z7}TdibY5y z#LzdH@+Ot~uea4t&3T$*_^2^fRX7n*bV)IUd^mt6p$BD2=fc7x9L-!4FAAgB* zRfEm~6sHO)C7&<&I>9NDZ!TU&*sVC;*0cdxDgqgydN9#zy<^Cp;g^;BkLaNSxy5Ve zwyYJ?bi#W{t3P>HZn4lCb`Ov5(=jKZbm3Bmi5QyPnfVxuXeu=M5)yKm8d}RNk+F3` zn#1)l#wu|A2j7ikN5N891+$IZFOeIMw(%K}#(ySG)!ML>a$B$DE|~TmjGN()(Esq9 zx^!UA^3YiU{2DxZ?)+m{+hqi|TEhEFn^aVle&{9>bkDL9;oBlSg@jbIvbgb!rFe4I zU~CqHu~ktEZufqc%$=WOm(A3{42@AQD#?3bLGk35LjH29gOe6&l=NST(SSts&EF6=$u%nMHAr$Z&CUDvogxaB~xuIGMVH zuuCfXsxL@T(^B=`li*DcEFLU!2t2_zmem&wYPmm@tQ8YRo&UX}5U4+u-Af6JI0A+F zC5rNNB5^aqH33g68+equJ3ycRTqm|jxuU5wVny70kO=&w9B1*VO(Nb5e4zZ^?h#0{ ztitE!?XIjW|LT^^Z<|uuRqFTJ^ zlLhj&60~^>m?}&rkOf)}Y*NqwTfvSN_M#1#1q=@QOwG5bph6qw^&mnDryjIz`tMl^ zv4gTGob)6;wkR7evI8_O6u3P|KwQ*4_CVP3wOG;+*Ad@nOO6LhzD<=K3up;;>zw!B zH7@)A@)>gFbhy6R6&PNUT-W0}!H_4V)zl(!+dlJ#IkMAUrFX;>4Llq7z#K{NKj5nAe?LEVI4N=za zNriGT2fF%02+|?`*bb7B)&rJIyZr&QDL#N$>r&yfB)71~mRj=p9Z$5yuPcG7FhP8o zkMhJfK%?gbqJzN~iQEwT42k)s3}~}TO|d7PoH=)}aN1meKaxZb?b_@+X|>MJLgIw% zT%rUZEisd$C&>K+UxkTf4gJJ^?`UNjm5pPWUzjQq7#`hHb`@8&ydC`Au!l%N%Qvr73OmI-Rn$lmHL zRtNKzd(#(vBx-AZAK2~COH{^Zbj8*YFb)xOHhw?s;?Bs$G6n_i@4i_+)hXaa?DM&8 z1z(M{i)`(}2{OdPh1UWkeye@kn}~>t znz|$k&jyo#8(|^_3R0p5C@6$shL+ZyjHa#^(ahO0ImtXzs^Hgd|9B?*^WY#-#^e`x zv^;dQ>F#my^7lNyr2mq7m`-G^k;gwmlhbo3N5dIYYOIt~67#{R{GelV&AdZ5h7&$_ z+FEpz({1YK8JHZt|1P*A>HPtGuqUoW$Oxi7@)_DYqjR7`v|DCrv_7@Lunx7+58SBr z&21phi5#<%Qmk8XJ`1{i{bt4mbh**!l0gP0$D|Oh2|`cAl2#Ky=s)jgo|c?QKM3|6 zc1_PCDwY)i6Xhi@5>C!kEYLIJPijv{RP|I~-B0UYODIUx3I;OABQ0(m*$q$7wT&+< z{1xu@CaN}z?9Bqnr{?o+SJ`$kkjuP&mBv(q%rUO&vs}4(wNWn}+Lgpl()r-^C5G3! zujp$a1N_8bM;HDHlQ~ZY70WqOCOAjC`j-`MIjnF^gx#BcJD-`*le&}Sd)MisSh}-- zad$h!7ZZkVpI-rSD6i_ju z{jbfOidOd47N+{94u%F&)()mdruu*PzWitPNTyecpB_GgKt)i2W}S&X%LPrF%bp1x z4j2)fRJzd`pSaP}G~9LTuovz+KSEuSDZplRV`U?C<>TG$>zhrqxbJ4#Y|D%S>E4Dl zdofC2js^0u^?W)-rQMm`V;z1buodHcf>bA_kY(Yi-8zvSilTj3qjM~9)l+bmg2y!t zNVaSE$LFk|btFq@S*f&(Z#pOrYcaDjCN+Dan=ZXXpgem^XZQWWHZ%=Hm zI(Ph|?+eUt(@TwL-2+qIgY|PTy+i>hH!Yld{QRA9E351C{T`zSk^_3dT~5?9+t-qA zoc0_UITs0+CdM+ES8RQ!3-7*WLpv0Rv8M1_r& zLvZLu_fZlUVi-5cj3|m-U(3%;p8&yze}I3%Z=hy7JyI}3hs3>YZ2B%5T6CuQUC;Pe zoMQJic}&^KC&U^C!@3P;ppWuK-XGV*t~b2tR-0?IbD)mQTz||oSo9>E@!fkWRGY~` zuE`}^AhhGGrQI0Zp>?$ixrs#FTQb7-9dTlo`p#Gpty@{5+p(x0ZUh;)kSp@V9|V(e zzbeMoO}@_1$JK??N2lh%D0DF#Pcdk)%K0MMOtnbx`c=)6huwre86qF7t^mCQXIC?B z=D^A&yhce@`F@-=Gee4XYVkH~DnR4og9OB5#`X$7Y1#ed=kBw}K^5ArrrqpgTFf$j z#80OJOCZex?!;1;Uo*s*=ADTp9OB6Fs)u?MJk%aeR4zfyk1vwe@jualu zz6Md$+2DKCsYJ8FjZLa)AqYdVDI6=IGg5MIj}8}LT6MZ3?6-V8TzDvb2Jr8lj!H#o zu&e=#6x`X+Q^dObU&0}>t~pZIvOjXQxO~e3C@>58>q~Ier2qXIn-E-<`v5%rPrz07 zAE}bPjVUd_sq7yH8vl;|j-3$uK@Xtt;tUB5b%(W}tec{NE}`(v%jF*DNymihN~9Wz z9Yz8CO9HL;|Bm5pKq;KdY~f^o5}zbK+Pk~J>0w_D_!z$y;9y9*(ij;v6<|XzH72${ zU~pA8XVg_^<9}Py)cA=#RiVbg+|)}=snEZLQV7T*#9TZd zV({Mx4F`^7 z@6E%Smuh3ikeK&-c|?|A7W*(tJPL^*!Gp$=mGuU2EO_v{Y4!nR1wU}k9b~YLJ}Vi7 zCcn+}@{7NWuY6vivJ?Tf5GNoI_>ZFQKUWYC3OE@4%N^iT`wV z@<$!#vsG9uil~p4+welcKNDbz&X$X9XK~NT>0|d5?zPFu{5_Z9u7zQ;3oe2hYY<(m zU9-idCMUAByT5k`O8!)LUIlu2;+Qs4{w3neZYqHcl@OKi(j({oBY#=_oY&oRfgT9T z)0IL~8&vqxML|@^7{EhgF1`tM;ypd?5y^iv7z&ta?K%8X((;tO=^;%8H>JLR1!A9@ zv;7_jbO==gjH(_#%L&xDh;vvKr7(K*c{fE}%$(2ToP0LPl)L0;Oj7Fn@OF&hBegd8 zgKBwrCpHo~Ado>R?z$iZQOOm1qNd!$y6-tXK)q)Z4hV(W6JuxukFwbzhX*E#8wE#f zN_pfY5a*=Xupr)xX*^oG(*+(jFKTtJi$5`scry+fPfd)nO>dIF#%ugJVZ(V*_0VpQ zlm%0LNyXekTmORrq(eu82%62{9TLit>kq2}TPd_|O{;GMg`7}>P)RUur%=`)0`ma!PpXSSPT4ZW_k)MR7sE#tNC3fo%FEl5QfLqllw)PiD#H7n>Y6!he_+*#NhEkGqdrPH zrhiq5YmlX3%=>y|&jBQT$KtYVhBL8dP(RI{A_`KbE$#%=2&F&lgmi#ytM;j(Qdli4 z^fHbJ^=fLQe|i$&!io|AuX318BIYLx^IeIZl3uHiBmWzv2aBD8u)ltyyP{H6?k()U zFE!o>7k)ZmnK1!^$$wbT{&T4T-agiLuK$>kxBHh^5-D%~kAbkj#<8SDeuRB$IB{9X zuExNCpTFb%{^q=4xg2FU;*>1W9PmjgfgDl|cM7%_&9I4qT1(BtvXaSpw8?INso(wO z@&wTXgo?2`$EXgS={jWZM+`dVZCl+`OY!Nk(XPRgPf6*uh#QY>Xe~O45P*1r&$lvv|$eeJR<;(ISKIFFsA{H zd$xy`5BzG0+08;uGmoKs=ic(jEvXpd`C!uQ4pXCQD z%4-QTMdEHT%|pXL@@%o%g*2KsUL>+kQ|sPMo|m3kFK2h8l>90)Zud$At_s%~D&A?x za?6TQ3(ZLlMZ=c1n5S6dx4N}dE;+fjytJ}CDe(js3YS{h7{Gi$zbnXt zgZ|J7Ef@{|ymWF~vx%H;H{kx+9;w90_=akqs!!Fi_!$g2hZ_Xz6d`P&YCw6<5X2<4 zkPAK_N2+vyHPO+lu@BrFZF2^^(vP;|rDeUGOL8uRP0qn3!c=-)X8JqyhFkODyJo}S ziZIc#alta${T#=iF1-}bH_1U0GQ#46D3YX5TP_K+FeQ|^SoXfme(e_rvlvrEVj{ne zrpukKO_*&V5mpID*;IzIY_~Yxzu58gT}P@t0~%pg0nV0ue+@$Z>kj`X?wjF%EJT&< zbZu<@<#sus0^xzJi1D>~$ueXVM`9|kmbS`YjcqA_pSVdaS>0f&mfm2Bg-ntz$}n;% zk&-DH55)Zq4wjDwWZ(x1Uxi9c6DR_i*-X=DZjPVaG(m`tEMMj5jc0xQ#buXkd;CQ& zZTI`pguC_U)<@?G`}L+k^tT=dmI&YGijKv;2k5%PvNW?v;~pC`6?@I%bwXtj!^%!G zNAY4rx+9_qmXx5f#yyMN_0`o9+8H+mfhGPhBZlh{p*MDDF1r+8Z5CT&@jnXJgG+g4 zmC!-J0CR8M7_@1D4Ysmm0hc2f2SQX(XhD|5AQACjOA>`k1t9gwe6r<;EHIt4Uc}<9 zLug39pg~_Q!d&?>5WPC8F?4bU2FeiHX?xy))x&K4 z?#maz`!`UXySQ70So(+v(5|q6aKuE6=onb4AVznt^$H`g%TF==Gho@*W%HW}e#pz7 z7~nCYOUrjEreX6RDJ=}A6{VX)bLWs%io5*~b51aJ*{%A%A&yjZRw=$NZ%jy7)S1;Jb@o)WG5X2~d> z?R5K`+>_ciF(B5kIH5i3*Aa=X{wNU?VOFR`1)8r?=4UD&Dk+Q)EyO;S37`ulu>bLG zNJ)8*khdl1B_gHFm^G>E7XtIHjJ}YV9SN-;H#HWMi+yJMnxeILN-B>a^@Ge6#|Dxi zXIa#BZk^WQ@spn`w|(#Ub!ke&B0{1s3pFi+u6&_*3XN6Y-dCb zO*#(ExNTbLr&H5hzSRNj=xRV1cE%t?G>r}XY1dNRDpY0wT$El>yU@-&oKYL4U9pu$ zG9SZ~q(-wg&Y{ehW};|Z@pk%N(=|@?LL;daHoYosw7J1Tje;2)1j%iMWFCAGdFuU# zzJME=kyvM+;%HmNd*UT5bFu|x0C6TCp(c6NCG;{&W`Ycqn(Ez1Xp>JTBjZ9kBL`hO z0~0Z$DZVoI{DF8Ql&e~r1Mdk?b5$b)1_|Vltlt zL}dO-V0|CaZIEbSL_Ye8Bpu|6SRGtG1P=+n7vO%KN?^iVK0kz-DAdI{pgxRgB0da@ zn4An9P(ECXgq*Y-XqK5ik~H%o_JHWVKt$+3X?Ts_&1m8_B*Vbeh!TE2!0`|ye3X&! zV!vW@5LZp+rSf4Rg#0P^$a_tW3jj9Q4hX=+!$C2?FF6Pr1icn?5CjE6aHTT>`4dd5 z5(S;Wo(0pWe&VKghQP^47R1X!HXyx;tu??^_$`ZYP}>}SQ;6%oYygA8ebinWA6&f` zt~TE_q_5fi(!s4rS`xRRfSVCKVzxx3&DP;LnMc#jk((eR7rfULmdvUvv9u0zV;f{krz_1A}lvI>&bj*$xJVLwXO{ zM(`7cz$IK3zGmxd0Lx}Of-&2=m*niuA$4x16lK0kIZ$BpqnGZZLvcV}qkvs^M@)Z1R($`Ow6sZ)TV zpo86O{Dxk3+{;S^_pL*(a@!Gi(tT&ICk5|{Ww!&ZT7dGgkCuYMxxY7zynUzVC0^c7ljnLz`>pb zU^Siav6p{HGtWHC5cvxKOz#9jbVmuQU!wArOZZ6~m77o75 ziMkSU+>}y&yA42xe&Xe5{t2siK4u%N(qD^{_;SzsOyP8Ur$w9X>Y3|0OGCv<@4@gs zFyY4ieu1pAvmHSfH5Q=8J2hwAx`?S>CfN=YpE9dbXHtCMpRN_fN=vg*h+d6+&?t1& zBj-V&1%%7)ip*!70?{1cs~5V(D4O`FS3=m)Rq&ktH{L7lF`XfGIeODLEjUCq5WMn4w{3LfX1N zE#)gdDU=)`oGfAE0D;?2u<VD)L8q&0`rnjS)lGj@X zrfBU}GQ5Yi`sO}dqunF!I^r2hy4^y?IKWrmqr9=Ps!4oA`u^kEe6Y4Uf)dMn)>f!& zH@$j7F}~pRic14o*?+5kuo3OrQ*quX`qr`u-%>Mc=plj2_MvcT&Io~S+yB)3nxtCt${C*-;Gdcif5IaIX< z_w8gC3#H3}@IpD*eUi*{&lDPUI^^WR5sHWria(@DYUIj9lWqh2us%oIJdEPsiWlbZ#&$0#n%fzU8`zKDD%?wA&&$S zHSb>NGW$#;-)j&Rr6jU(b9=t-fU1RkS;2u}_odBzpYu0z31oD5?`~0S>whYj>%l}4 z5p|nbAc$UHBU*{8!*m27nmCsP8Pk=1_A2+|_yv^hmgNG!{tjc*y5XE_BSCW}p{xQ& z_6}Emr&&sr0qP_e@Kt`_Y`{H2!2>8<178D_UfJf+(V&XI-dLpHe9XNQAR9kerQ4Sp zn+o|Yw{}eNoGLAe9oU+D6+8hNdL}gI#Z{Fq zn0SCJ5f@7pGeJswaNex&H(AVW$fRym)g-9@>`#9{PJ3`z72BRDld|RSm`Z=3N_$v` z$b?@YmkM!q^_|M^L6bTTNP$6k(~!I*x#sOk$HqN}(9Le*q!LYDi(4d49}IeClNFwQ zok28=ED3aF&&_TK&@zQe)CK<(mhJLN;tW7~Ya?#rXk)(g-}hP0rOViatek0W zp?ux3gRKC`w=a-fdw#3u~7 zt~{F^`uulEt$Qf?7;&wF}`Sv>d>HD84J3=$FT_lD)8)oq=#k+A?Ns z4x+KQc2g77gw(N{7DawKh%+Tgsr>*#VHJWEe9PPUJ%0{)C8=&(Z%(=N8)SWEQY!rI zx4Rp3eSBMr53cxc`O>6uaUDZ`27^TUi z#A;21OZqXluRGC}2AcNcKnoPu*bi1I`sdde_MI3hGr8+<);;G0!P|T zc6v-5K0ytg_oRqCF_gmG_sB4gvu5} z3V-#i>eCX$$1K;z1p6@*DS)&eJL9+2R;l>>aX+w747=919am#r#F@x~2SlV8(McK& zK<3hng%+xwD@FPo_scOIE10bw#MfO0uy~o(ppv?^_-&aH;KDXf8ja!MK5IRIi~o2BWid zAd+V#HbO`2uDR#|VV%&T>jkhmuHenU2t=Ic z*TnCsmoi6VfPY*vhvz;|9MOe)2J|Bu3qAefJK?n@5Ux z5Lk}yS(iPvp1}kaSMId|7$(cA@-+k2jSR@Dj3xvv;#_l-#LySVO)ZGzwl&Lii2`Y! zmIEGC2D+U)-4NEg`XfzIev?WitVm9zUqsk7GpCO^ zVxy>I-pAdjU4#<3grCB=Tq{9Y%~VPDUYazC^*TbaGccGpsr5=hQKDB&TbBnYK`oj( z*9HUyXreosH)-`^Ls?Bv73fw5xT8OqH}Uef1^}RJp!%F;^NJj9lCrYdKy{*8!XxFJkpQD+I+77iwEcV|FEVGC#f_ zSSN2neQsGHS3I-+8MHV*RLphWEd}^HwQqEgbZND7KL#3+&uu1zxE(F-Z=09QZBJ=D zPFg`^M836fx8>3 z!BLg9U{;Tm5sF4G^OTJaNJjGI`tt8OyeT+yBE&OZayOuCVmc zk{9v5iP+%kwV>%uT!i@5Z>;(!daP7yt-*acjgZ3q)6CPN#2s5VL1EO%lcHWbHl|(b z5o?r=RzDM^aB+tuU%clm!&FCFq9Khh_%azAlYvkcaEaE3#|EI{c9jV9HQ}kLK zCty#>X;<6*>Dz}|i0AG0-E<(Zu(a(1;l;PH~GdA{&~Oa z`((w<<@b5Fi~Xk1wVrmy@Kn41!?U4;;zLn|IvICs)IGQ0=bh3l1I7I=|Hq#^4tVD9 z_4Ys*)P;_*Oemn6Nugkj93_p8)sd3p5$}vMf#nV7L^R1qHO$wClFrV?t3(JT1b-Nw zk3-?$Jq*91-Bm-_w_kA!VWIJnHZu6=B<>79Qnm-?cjzMS!r@0~=TxhCc}xN9zI0}Q z*oDJtS`{{;ABVCT+AVGZ&|<`WGeXi+cG!pn%gs98W`0~vahHpDJf<_1*bx*7JUG4F zA+RrK7qkpJEEV{#j&$R#L$%N` z(Q1rTr>5-gK+)ki2Q-vbKyElkm2$c%A+)hi>dOdUwegEsT*DeU)v3AbV=VA2>Y z6R`f1sOx9h9$4vBAfzW0MyucIpj{iw(EA%OO#=#ScdzEJLRoLiB@kP3<9y+Pf)y_! zZ~MjY;E;hCT@B*lDlHxG#u0edz|~0|@hN&DWDpJgoIOa0aeDvN!M+{Rwo+LLGru^< z9U^n0z8WE`DRSNWh#|`bu(j8bq9MCt;82px9CmFzXKAKQ0xN-T)2(XvKk=Wuub zD6Ua9*9eCP2Z1Lyh(Fdq9m6iJDe+h3KSZE_3Fkz9kbZqsbA)PKH0s)d@6ooB_t%UW z(KJSC8}w*D{CG6{ab3VF2JGmfT#)hgf1PGzsPKZnIK0bgfR2(;A zX-`hW7AkjR4di_o%JKyFm6p=0BG^iYH6QHv5#lWR^{$`8QN*2``w4e2+%M(i^%;TS zuYaaD_itTvZu@t|2b|rV{>7F2!&_#x z-A5Yxn-Awn;#mx}z6hwBNZeMhn}R~{UO2MDoJB>a zkh(|R64pKO1JnXOIwxbB$IbCIWbZom9Y?s~95q`cI4fl!f?jY+qFsJH0k5=V0nlh_ z#9`BugQ6%ToinotMcwAu)x{~;O1#Kk#<_iasP$ON z<%FzDOsUN7k}NCm!dj;bp-9b642AcKiG}+D3(Z97op&r=&nZqSvfIQ3;k*W-+%y~4 z`s!}pzTj270r)_o7Fi;A6;g?r!oVP`Zo{4)GAmv}+_%S?Xzh zy4PBe*6Xi*r2Z$o1!>cVfZA-0VCa1@dlKaw{^r%Qg*D5C0{PR=n=pT^Qm z9Qn|vW5#zajFf!L&Jj(17US4U(8ImuQo%eUzOs-Z^fJys_K7Zac7JvuA{!@R%1$L^ zks>kYBACls(RvAZL5`uu$m$uciC!Eb9*&UTdIJ7w%@9hl_%J2D$~BYM4a4kx?N77A z7Z8n05em|JMZUkZ=|9%@a9m?&R`)cl}eszs0{!^3Z-`iaO-P-w^(!xPX()?>Jp?j>FJU7{Sy)!cT z(a!Qrr~+ah_8YLi%1pci!Ej!lXL;bqH_x~xuzc7myJTjogZ4j#w~sJhq%MAgDx)K4 zv=)cK2%4bVx|5k@6s;gLO0?ztZQW=x+$&eq;f`~Y`rtt79UK`-E}FMQV(!QV zV0VZFd}**NN~xPsOB2%EK`+ZPI4jMiI&aW)UG6^&8C>4AXFtS~;4&(RQsU(J%+2)% zV+vPF8$>gNTy)C-@O*1I6gSCWPM}i{^1Zu6E!e;&f84aQCxHJR9XWRYwSQ^f;=iIp z|Nk8wJ_l0^ga2)M#Yawx0r5f(be7edpW?Kg_NOA-UunozsZbzt-hs`~&XMj~B#)20 zm|?qp!x2kc_r*o5Zr&S3xe>p4zW?~X1^>&B0K;FAsJmF7o6JY7T)#oBkGW?%Mtj*A z8se5kJ4CU^Mt`2@DpdS}KlQ?loZLYWH|^6bk=%G8$BO(glki~3)?)t%79dr4UL%&y z{HVc2KG_aAS?~!24VGK)SK7Vhf*|&Jm>gq$vv`dH6+4yMET~hSleeuZD@d+?m@ht5 z9Zp2jF1*AW;8DUR>QtSm5TG^lTE6lQ^7mln$z?u9e|5y6zdGXoQGD>VCGl$u@;}<) z{__8x9W-}+Xqu5D@o5Y3$|nKVo<@e}!%dkplk*AQOgL4G(6}6O5Z}_)%@KLq`cj#o z87CrJK)4LAPjKCiozc^~c6xk1f$1QfLJB$BMB*vgyDI}|mLdi*!qagnZd-IjSjK4( zJJvWsfh*~fGFLMsB!|ko5_bdu#ZhuyrT7M@L~XV!Q8^pmiD8~;CtcSn_Zg+YTB4Zj z3LvO|*%F()%%39&V~R3gp~)@AJ-!C^L}SUQpT-5C`-oZZn||;gVYg-!1)mhyB?}=) z-EdX5A}+Al-WpnV>~d9ViZ-XyG>V-=q{flr!)TC^+KjccuJg_9mBWYba$G6WzQTz_6 z-ySg<9BtLqyEr3=F!8WZOr=izZmS`X*%|EN+jo!QoC%m-z_20+x504NVUkO#f$I%} zl6S{<*6Hm^3nw|)Z3+a2;CHsrMP-E`a5mYdLY_As#Z^|uYmYoM-+}KC&Wz`5H71m9QKnayt~stqR{}cZtZxE$gpjb%q&BxKlotc`s}PE zBMBr~D#uSiW^Tc}ZK{=)!z@3wPh68U_oJBj{hw?d+amZq+_!I=Um6d>|C9m#2I{}4 zx^`6vH--7+&rJ5%=G!J%5!4>9A2*P(ej-`lg=KKzgQ33z!RM%85i#rP&>wRPXnag1hq1m{)?x<|ux^U7`Uha7Mas*fxKK@K=PEM8}Lbdda z*Y0q=cyvF!ZvWV9-W~09zd-e3)k{UlO+(%FTMW)ZAWu^{?js|vaKhgfkQ+4mPOI9b z#8t{WT_2()cwzBGvjttRY6WH5 z%0RgKZYg{;WpvRpU}V;Yc0DWw%ZQ@Cd`v|-Fc~x-|2l~$8f|rk_k!g1r9y^bc?vs} zc&tT6PReu?RWJM`@B7@iyJV)Pf;u6(Wl*`4e^2TnA)jsyrX_7i9^*L?vvm|zun_Q? zS(Ml$MznizEO8>AVKK+C%IRM#@ z1udv*qS|qZBrz-7@9k|SQsh~-hI%q&Y3eHBu9UK-W-=MI*CO{RVZx0`ewHU98* zDT^e!J+(x+?ot6Ef<>Dyu# z(q@zxn;uG$jhF0M6B{-|$sz+tN;oodX~{~fXKHNtpqW&8N0YZOD8~Kl6}U>OgKkul zVfV?bqzlHN590Lt#}w*)CTiA{OMmj4T?qUZReM#Y1`8ZFkSpNBm!dD;QUup57O8Vl zrJ{>BdLHE;4lkYxC|b6P-6?=6rlGIluV7FdX;3WORpL|_8-ScUkzTL^slu2iFkT4r z-g)Xu!?t~vfQlG5epKFl>hYE88cBeQrP4!VdbVziA9@-H3`CtC_*!r zhAY;PH7Zl=H?*~|#B=3u$YjY)&fdx-HUfWIF!v!=j@Vwt>;sz+(pOIp0g>BIJNh)x0r%k zm@es^n=Z)J92CNW!%DRmaIilLIu1JhB92<^-GUpvbg++Z16YVM8>c+smN#_1UlDf_ zCc#`7NP$9wZT*p_Lz&e(Z85{6W$oC4osv*ht-^gUnq-A_uPuezqrM|wCHfiIXCzkm zE6{sl4g-V2ZxS&M-ECqjv6Ty6!G zKq4m(4~_IBpN+?;|A2Zv)5P+VNmK9b{qR!a!fa<48YjU?!vwxH%*an_#xm+uOY~Dj z1($lQ`x@P1+?Ah5lTB0QskW9jn+Nr^4V_wu#@0aH`3tPo7)B{0VI*9aoR)ivt7*kMsLEWfCpAzEdXn1TqRa4 zWJ9yS4oozN@`~T^HDANDOGd2THmoRoyrz4SR8cjlmc2bT?$BE{)w+?~bBkeGedt?q z+q-qrDd>6t#4A76KphToUMNP+CS9?C5_dBp*L*ygXut>{E#eIrgwRo`MS((~#`;S^ zki~1{V=#WJhTxzU^_znnh}THOq!K=t5awR<1Jzy;04Y8x137Iw48K-;-(ClJQ*RN2 z00vV*%&ro?)|fH_q3l`$AzaY|tr8XwOhQTYQbW2yU81Y_JVI*V51YKrbg{ezdP7{1 z108My0eMEiKv@h5%kAp}$zN@PAa5~){CMi?;uAd~YzF-_-{O1g^cG~<^$`XYWnjie z1~5Ma!81REOanOZg(E}onLor>)}C6b#O26_{{T3M6tQE;B7=_sZ}l{5&KeyTDEhyX zj|LF*YA~cnfHM$d2}zxHQ+tSpNkj{puj8ym>4aizVx9=msE2 zIPPYl;th+4j;ygzqyaKMG(?R=<$e!ah)yILL=Z9p?uLLf5aI!M!K45V>H@Ky$1M!L z#J=5bJe!DLlObr>Z{bPD-Egw|yp=^)TSY|&i}spriXSnfm~q@@c?%;0dHzq1&?<+S;APJ&zmHekQHV1=%p5 z_x^RfyOima!B_vsAY;}1tiEA_NLVP{gUd3zQXXl!u-Ok+Q9iXj4HYK%r2w5P|>$dsSrER>)f45fXuz$mCM1|ru2YM@2n!G!p zZ~C4z>9{r`?+IKZA!Ij7moUY!=4;!L8Rv#{ayxgE<;pWKd3T?r9IU?1~s$7I@x6zu@i1G zCR5ySlcR^kCD*=u;;VZd!OA8xLBq(W9x#qo6~ka(q(NVI=Yssc^Gl=yxN0N8-!L65 zH!PF1$hScfzvk?|KiG1c_8X3oZZWD|6Nqi>p>5^>Tj|kl4A>X+K)MviOp>+rE^`wT zc8o4xUiV!h7=FZd-EvX&{{r3NH@vppj~BX;x@JYwnlPHMEtf6og5VHFqI}%NF?FZh zEZAj_)8c7AzDwQW!1CnFAd*A-9G;iDP1f2)HB2YVLC?SovXF&y&(tEsRMXNJ@pFvo zloz!BQQUb_6tn_c^?LRZBGzF+g@5+*>?4+?4ujyG*!rmGEt5IK&YD?c4>NA1kY-jm zlR2{|=x$ES#`4RK*|qXXFKbBI9voU*)=AA)5;|9X!D3-B2OGK?^Y;#&1Y$UgbeTZ2 zihpws*!ODm(0(-v1WFaW3clJV5Ih^ol|F|cPz12)fbtwH_CBNiT_TsLhHaxXndc4! z=B-Obk4r+KwlcQ{dBLuMbSRhC*RkSTYsS)xR!o0|^YpApct0RUxecZ=#=J&LG#nhA zS&`Q#&!TpkU4809*CDHl5(?52B#gY;A5!Y&y@wo1rI&-iT!o9W2qf^|6C-a*6-uzd znjZMAHX?1fl!>6fH%?NfA6#tg!)gU8Z#o^s9UbTvRCzBL$T9Mm0Ab-9>am;kLATt3%!Odc5(9c{ZRn{A-^8lP2QA0Z8X1k(7Se3gYxkK@VgXFElM{MH zhHz~n`h~CzdE}ZBF2o;krA>Bg3vNn{)r{(Z)+jkJA0tD-VE*Rv65%ok#PdPJj-1>a zP3!dwuiitJ;NDi*Q@gt$a`8IsYHMbrXG~)2CgHlO51#VjuMap2)DAaqO-=4t9V* zZ~pi@!o6kg_UK{QY>6P_MxP?Zf4T+1P zeRxNxj3s-D9-cJy*cQ_lUP$iCji)?=*Vf59{D>}o`OG!{vskV1%2~nb^VVAf!r767 zZL{s0HaFg8zij4^d8$%w$9?h8+~y+Lh4)CrmIb@I^AEFS+2($81wX4T~KXEd>r0zI~b5F@<~(~L|*p0 zKWw6wJ%YNX!-;HAG5TsD6=1q|Sqb}Zmx#2w!gp8z$iz0K&Tvk_R@L1ZJwR?3aD{({ zUzw;Kq_1c0v5?lV#*ABJ{DIBpw0{TEE7~rVz_W_|QjP$~E7GN(Yb=ENKCI=P^pB5V z^k;R7G>P0u2Q2rJr4{3D`f|=iMOp1B%xpJ)&$_&we*%7wdIv2St1io?b?+ zPCFa#$eBfz{!n9*BTeYlvZ;>|SCs`e@2Ae@Sch(k3=ba~MaXy8B5?1ns|i+CIjz(~ z%+$ID3PY+yu<-~h-hq00E`zhu?Ql-5b{2lV%DF360OJWKJOE{k*_fLXahWX;nn`tx zIF0MH?QYU~?#{U8=Pr0l@Yq7}cJO|tdY2)@ki_X&mXi&6jSL#yU(ebG=GZVPt-lOx z95KJ_-K8|paulG@Y#*g+dnnO=ooHJPe5X_t7Dzt{DmTr*phsN!QY|7tNe8%|S6f-&v;#>+mQmVpg_k_bGo|{*Pq_d)2PVZMG?d zOkbgVslPgePE7->e0?a5ax3a>U4K&L{5HHL8hV|}Pg3nt&5T)_1w*!p775Do(YYD6 z(uB3-2zu68n}U*vTk5->-x|l%H(x*ZF!p%t>g{=0{y9fow2A%n`$Vi{_3K-28_P(j zQo&OIQj?~u>gYsK+&k<^~8sF~<+8fs!k4ksiO z^xBO0TfzEQ#!<`N!SYuUxA*PR8X&mNl@v^!bfO)JPwHE%Vs;r<)=lOwyo=XE!&erk zvezR~Gu7*VRcX4yveyS%=Qf};nnZ3fab3=1_X8|(un*KC%_B=i8uHzXXrRp$CW^p> zt^xjDH)^e#g5v|H@sjh^6LyoeLgo}d?d3)bsM@9UUIqNUq&!^n;ilpdG@E-(Pv!BL zTR!`bCU*PTHJ>}PC5&VhexfB0%tG4WWLU7`pSbpk4U!U_xGxNoTbowu zg*~8u)sPZfb}0k`|ZBe zi@28lL01y*c&8mPSBRPIoaYGA&qOU|X-HBV-usiQaES==DUMy(kcXC%D>0KEAEBDz zP-SBHK?Tk=P-~^6MLDra%iSBogKp$g%;O)lQ9&|A%)f}^iZ9~$Khj43X>d_SQo2V5 zHmzJF-$UT~LY4Jt2W_`sgaOZb3x#4*@=sn{jHCI9_U-@BpIY%IJdtOnj*iB}>^PZL zm)`)^d@SOEgR{*l?l<{0jeIPbw-Bje?q=9#TJ8`52y6(6E(;}~(L}LrWMz;VM3#JEOer~0klWwjVy5bUYz)fsz_ESD z@yzZ;`a4sszVG{U=_@+XU(xx0Y_dG6QV zHj$X~?o~gzMx0&0$4EYU%!kF~w>q;@6vr)LUHJM?GhK5-Bo5|8eClR62X@m;^B}1a zMlv862Ch4Y_306Vnbw0*8j#lMnxQUwG5DE_(6c9@)Vb)&7P!a)G76U7>BA8R$>(l_ zO#0d*%93K}KTAiWWafve7$=BFwha%5u3Pd`lb^l_^ggTd@x<&O@WJqp-CO<|+LZh9 z9s7^)`5M%;vT*!by!x+Aoqw^8{&AaM7D0%Eoy?Z-sTQ77+6y`PQTV3t7)5-FxH96? zdTK&shF6xUWroS)03)Z_Y?fV|tcf5PF1B6uKxV8i2}2>YuklfCDkk-aSyO zIXAN{kl41)Z>(+f9Fj%NXTLwzq!xKk^Ln6qJm-RPz_yw^Zl^H>)})re|>)2WJz`nnxTg*(qgC{ zs*{V|?6rkt7O8tdon?mT)GZE%@Ekb^v$HqKIgr2;J&rB&W@z}+(mUJwcBNf?tKB#? zE^L2WLg~YVUOG(HLMRnr&mCY7k;jfT6~1>vX}R355aj&)J19`~#^Towv%p(I(B}1> zYsLn_7z|6V{c8{e+>Vb~>J|WpHe4@AMZpfd@An|}w6Yk<{v@RxYUF_oe@E!;v((|M zW;${1fgA5>5@wLw>C|2;w4}8lwj7sUACa-6v>*-)zCgWHK>bJuQV&NyjWnO+k;hov z%!gn@A!RkZY?%Oy^AE%Q+hfna=T6xdxWTip+$r?cY5RZ7TmO|i|D76a|H=yavXbJx zUp-m`ef`q%cJL3c5S=T`Yq=HqFK(OM9CakYq45kL=8^i#(~DbdP2jDFEKqqfCpgH!P?k2=5racefl1^7|+N-PxzK|*rOeL zbz`%-!xiI1O~{KD!uQ19tzEJR8n@0K)mq^r6x(9|N{Ybl9)*UzW`#8Z!X?4moFv%X zNYG!~D85s@Mcvh#bgtYqzEe02>sSAH$-q9!4z7O%s^;q@L-6%9({laPt#$QH45>|Y zZ7r<;f2hp>2By@e0DD7QfUX6#Ai&Yo)(T*02>5b=)%|L3|L;6=y1b^kuz>sWnzNpENV_sSa6PL+jc>LL;OnYuEL2GpU71YtjOCp55yfJN_~3_ zpD)>!d!)PDME&jiV4~GGB^lizg@i^lTgKu%O+%87_-rJj(IYI~GDNt17q_nWsM3hf zoOuLqLlqJEXiz*j~d6bb3#5PLE-uF-Kx~3i(?tz*Enwp%?RYUnfB3Q`UfGg3c5Cc8B_lXA8q4?tR(C8zmAm;pwxEsAjGq7~8)dmJ57buYZUSBHflwKPd}7x=LShwn)k^59c#I)9Iq z3gGbqhTxk7qM1|tIHcq!;U^gg@SLM!zCTxzbZqqRPd44@MiM3RT|Ub04I(nn zu-^7F=CIK()YKL3BOnur3bDZ}s;)`onm46H7+HHrDEHheu+Kvb%fEpA9b$47Mj-mB8)qw$ZUVa=(NDnA&Z%{BjEjD9Z0-H&`JCNLudKY->EYwNU|3+<*vqV2m`hIKii0o-yGkLz?q#9A3;STt#0*vE+65)(fweDjt$~2o}cx76ei$5~hjL-BsPiCp)PLTN&#$`O?+r zYr8#;Md3UGV5lmI$J?5KvN!u(X!Lu&lR)cnz)WGdri&xP&!j0k}qqIO}!7GopIkSu6SNTlJCqH=dFSayZ9#reRL`R+l!~ z@dNREzl}R*SWq*ajcBp9h!@K2%>g-7v4~4st4wpWSACjRV)l^0Xrk3M_7sq^m@s%$ zDla6lYrLahqQ6h!vlVMHbV2}KWt5)0%@0UU+|kVbuCxgPs557zCtuzVgGYZT2w4<$ z$8Lf)Y$%jp!*1{rI<_YU2~s35^~UuPo8bhrML*_g`)88yHQ5FB73j)ce7r_FQ&dKa zes53!dZnU5RYd2e!*DyqI{#tgP$VMgn)L-jrvE+-GyHEFK9%}fW&Hu7hMb@%Mhe{5 zifh?Sfx81ti1!nyCFuLCz^CM@D7!(jrBP#eTRhQ^U?MIr7($oVnT@V#BoR<_C@7vjgE4vJO+tI^1AiP@I|wH?hb)f6Yu zkaJ)sc8U(_Q*&r7sw;5&LAn$He6j!&wDV@GdJ8$flA^R0%EZVt`f5Xh7%o*{hin2; zz5qX*D{$FY-sIOqx>P9p`F#hi3b4k3dqCF18kS;og+laH$m>OknHW})W_Au`H#r~u z*n8{j5axX#pAv`ajK-y9FpbGk4NZBD&dT%AMZ`CvtHMSA1fL%=Fs!Q=u5pa!tos zP-B=*m>PqczciZ;x6rZebwP6voJ|PA)51N%mQi`Si72E?tKbz(s9ls4mtpvdOEBVZz_RabnIJ&lF)(KpwSXk@n3T7Mx?TeA5=R*Gcb`El1*Xmc1&=Uf zP14jR>HubNF+UiVKD=*Rl5B%MV%lzW0SM++Y9qxM%!d-2dg+ z!w=zan4ix<5n>h9z<~^V^&LM_hk-QGYv)jxy@9`>b^M~idvaiKa{A}gUj@j<@&fWo zN|2=E!9??82CLnnl;_9G2T&KJ5-Q*D92fs!OkIBG*iG+6XZ0% z)+$t?G@iVVi6>p&88;!~TkQ<6Opm!LZT5v5Mynm5H96tn5N(y5x+TZQ8M4$#Z z)OjC+ZYM<008Wp(HL;Yfr2`|TsUWvI&hjL>ADObyHqv zcMEA|5DJr|q%-u0-jQHBenyKkm@)X$<(y$<#N@|HvIgx4dC8xX@Liw7ci#M-Ar^4r zvmj1l?Oj7N>eT&!dezv)6kyNq5KeOEA$|>FS@u1fW&IF{{{(Z_<*OJ_GA(4EPZt7{ zl|4VEr$TRWXD#9)A=CNv5A({N&WVt&ubc9p zFV<1|zq=3eT3cHf+RNzL>RK9pT^jA=tsHFi4gWeq<^QfS4*vDm9UI51PZ-zeoCFsbn`h|e;_Nz^-q?6C zv%~WVbPKux)b9SAfN#HpiOrS78$D8g0#rA%HgTi`&e#GB;!C4IyLuK^MW;YaMpiVP zD>@(tJuq^Yi;|A#1l*Fk)G?*t)HThsEUPD#n|*vNf+5RD7Lk#JV2MDl7u&8kZqDBhagACB<@t z(^T=)SRI7+@SXRCCv!afDVfB9bWVKc%h_%d*#G5Zp_O{xu{@bAqD-Tj4 zXgzm*V_V{#LCJX1x&z}LJY%?SD@rNDeq7bkOu*`3F7zt@eDJaZ@o~wMi0b(Q0u9OD zqr=z|EVUwR!agNys;!myA2->7)0&mUCPKR@=g89V^hOoWbUVO^N<8G0aojP4+e?VL z&pbF2U)hg8dkUf%b~oiyZZy+(7*}!SB z8-_|B<4^8?tVyGO7z~~H0*TTWU?l%Lu!uID35%k@= zWJz*dk^pM^s4~#+O?WL(jjl@<TPsjX?4V)w7W z0sr?WP5zIay`klQ4qv(4=-0dfY#9?R#^QWm(KRKufSXsS3w(blbq-!g$fGD7A%dfE z@0q}m_Oa;o)~~1U;2vQttzbEQp*y+-t>!HyrMelLIGNupbTXn;w3>?5>F-+6&QsSQHytf!?lrvO*49nX$bLi`N?B#TnxL!HVIFTEDF`*0cdrGT_!> zyx~H~V+}56TYp(ivxkQ#j~J7v=8;@VuJqtsrz4}g!6=Vk(wenS>qMA?|5%g3J!r(t(?3HYc#pB{@0!r zH?SO>_lBNr$L!Q^;pJ~Nw3bX4nSBZzGiPCVW8EMBI3}ge=mLKQ|4GHVo+eXz;)gqLgIOZb)%*pn?KmacRJ4-TDYYrHCR8z69k)L_Bfp zN|bf;3ptkSeCGZwjAZ`#Iik2`Qx#364oG{C=4Psu4*oe(09DzK&$U!e2!9l9bQ7;_9JiW*% zr}s-}-h#lMwv-=rt}bIWMG0alU-f+ApI?H6Im#a`qv!9_SWrByt*u^L?7_eLaL^Kt z!Nk0{V5zNnS-C49MP+8TQI+qZsCi3>hlE`B>ICxev!uscM0tKdfCBMYZD9OIdiomP z)M}}48Lx^o$zG~&0T0DgF7cg;M)x{gc)&f6fjI73A-Mr?FZcs4EA1{;cx*CG*n`5r zD}FpXL3;K`2WsISNN%(ME@E)y;wuuv^UR}7;F*pdPQ0T~s$Mo{cGX6{-RIc^i(p7f zS{?BQyqLXwGxqWWSa=+;&Cgdwla@|%vYO8YZ^$CAcx-_MGHs@I4&cc%<0czorePd;R-i5pu_5m zHWchEW@8Oy-@lrLOz4q7dmKb?iPR0?M$Zy*2`!Migzm%0p>3xs8;#Il8Q-x8xtJl? zsf{v0_^IG1Y`FSEe+)s+$Qb-$#L*E=INm2~0vcOc?HXHs^bn!5mAI z0ZM2xk|sfyBEQ^P8mcrYhVrPE!7zT08pTwtrl_yGXi39AT{7S2?I819wi$(7`^6Ei z5>qVzaV{tsh0OKs`h=R~Q6VG1j*A2r6nwKkS7N5dSyE{}!rnMCj2%C25jZ}Jb^gf=z ziqp!#(7BS1nmPnXG!zj+fnVP7M3;LI8>wa%bLnr1CbTeuoQQv5!N;^AE^2Vm_lro2 zScO<(FZ0+PIaWJo3_U0&R~7B3I{LM|j9Jc>rPBkHa<9b@%!Sg`>YOd=3@q%+{gj2; zO+k<#j3IrFW6m_?HZ1bqh76Ao?xUsLHv_N`{qKXOWPTC*fq@EzVV}&*n*IC@my5nc z@Up>{(6|O#nioGIq47)yUAeVW5KX9qBB-y~=ZU*iuI%tjk8@hYGk!@0NiR9PIz=(x za;7X*N5l3yv_iw#bQD>0rKUfz!D2X{QorbwT32=454m}o?A)A+cd=za@t$;#m{BuC z(Fi!HtaJyC#( zXCF4dVXre~lEXYn$dF*UhNQ}{bKXXpM=`0|6~bF>Y}l{E((kN4yf}>>35TMG$)&_ zmF{8!_sh`Iy@QyVt!z_Cj@rllZam4l^jxAsAvPsek_ z;GibFEF(N?7+p#8^h&COkur*_&FHz`OWUEp?N9E@GoB)c7Xc9;A+LrPnl^zw9<^sz z|1dIzMT$Ni!@q405|AQexChGVaV@r_&U+F~gKJ3w(*t&!{#V&NbR$CiUU z`=ijlMx*GyR-=ksH={6bq*$x_TQ*JxTa3oKTj?>s&xVrt$AUUwzmJBj@nIp@L$6zJ ze|1qNbRP?ocU=#O-2P^5zrF7B=#R3v6=3BF!fm6+O&km?z3aw45BTs z2-Ljn16SJV6O(fvBO2tVL1mB`;YZCz>P-+wjKA(POQI|k6fJ|48O4z)dv2#Ir3g|4 zS3Bs7rNUHJX|)wTY_nC?+V2ZhzvyE$Plqfp=cD=JZws857)(jj5{-+cbhxd&yPaZR zgr#U+GcEbRpMD4<1&j-Pj1ZhHBv2>!mA8%3>N;q7dlMCmLBC=0W*hmC7DUX`;Ubjn1Fw9)?2Dw+m!a6w=~kA&N!%~6=_C01OzS;zn$*aW>uF%-9+87Q-N z{W=AYWlw@!n!!HIw>7L(P~MybQx3iO1n}T-X>!o5g)vS6qO=b`K~_O_SZXG_xxwK3 z#2zxcSC>$?2X^GndzNx(cw1iE}NxxJlF zNyCb=;$}^->0+(S_TcjGA=&DXobr7oe?x6BsA_~}WdZ8ayaaS=L`GWAWGe`!+lrKG z*kq#R?uoKxzw?EN?`advbKbgbKg4~hr#3)jTnwR6BuxJ}cfG1j`wc;T+cNhH6SvKN zG_K*%H}eI>RN8gX#KLV7J$8*;2>ZFwlsH=48+K;=X>!K0LsF%OD^Q7gh+=>abD}$z zi6R*!^x<)w#*tlO1gJQ7vt#k3e*0V+O+;A{BXh*5qzMPLu`~zcu>RV7nsb1fv-!j& zb|5y~F+PIeJPwjBZFpTw(K8H=EAQqPsj5G0ZTnUj#zv4kmM$L5+$(PW`E?%R^&pM% zBpY@kZV21Gw`c0h-yEfT1*!(v-CFp6I07;Xe)qH>`UDFJi)v;*mN@z(?>hF@kQY=? zgMMeT@%XYzf;PCDV5ZVy^}=C$p4XQ1hA4d1&t2#(Ci5qR+yX^2)@0*_OY4z9MyJXd z(g+v%MRJ+G1g7d)X2*B3kVvH6Vy52$eDpEw_bX>gh))|Vfn}RfbB9brmqqI>Zpmu1 zY$YT7j+&m!KXz@E!?|N`f5ozU;ZL^^w?)4NGf*^ZE%rS>vQJDh)(X?pl7GT5Dt5Aw zyWbSI6H!lDM@EhkZE$a4^gre-ITX_ULz*e=zNk} z0#>rZ?M-;FaA-341xgvYXA3i2VZ~r(WzqD>#o~so{hqs55gE31a*fW}8(d9Po z8Gr{5g?IFrY&+-Zck;@-XY?KS04aKC0vX{aC&*rfN;oclDDJ#}PHkV8nB-Sv+C2&5(eXsA z&P@JyK5@6c@<+PzXE4fVa!PPZDr9$ol+7-@{+rxbjDmOi9sbyK>^Ib5foFHmr?y@v zs_jF%pI{(6;Lo}y)vJJK(lS2K%mGtrta1%gt$lJ$v&L+Y$(SFba-?QrhpFsqJQoznD(cdjn zAyLpCl_F?X8~2wS5akSY5!FQ_Vg-0N-YuL?|DE=h{%`DNGh! zOA8x>;_Sy^FKotaI*;RX+LRZ`+oxL-woL}C@ep3ds86Rzo0w72{fG4VjrV={ca z{AL)gRNJ9~hHhw~Ctl<;*UO^(EZ`}9;}s99iXifWMZBebq2)-fh>T^9A6JX! zW)2>{(4?AM-EXcG)ntyIzG&ZAfjL{ItXonp1iLNQ1OeWJ0=j^Kr6|QV@ILh0oDoM+ z<3_D3rVM3E)MgjDF)3xzS(~WkF1|I&W#Cs$=;aGTx6aWsC50)FGi5;h07vM2%8Jnx zX6LSur(ioUEf^>ilSu>SX0IjZFk|z*3}A0lmgv?H!sX!@s4FF^tSQ@&aV&r9`dD5W zU+;T6aJaJh!bo=tv*T-SyY`rw_hD|kUKw@8j588@Hkb0!+}#C##$_{~lY)Vew~_Z^ zZhM_vkDQ(#;q-u@K@gs9AaF}0IRc%6VcdeAaKqZJ6Pj84zLRM7$g=MvGu@97Zi_p% zfcdFu+JPkY+6$3`F}4SeB5h0yCJo1I!5f{#<)Ee$r^68pmEyZx$(144wQxo|s>Y%S zydrKtjT5eOMNEMXcHjFV=?(m2F1)|-C|~<01&Rb3VZ%-BG+oLRX3()TA=>Ij8!o4t zRV_Ug4odpHa+oW@jXHC5w??R{K}kGeCCMI|IUZJs^v=GtBp z@#9L-cdGkEF-}O{aNOKJ-6NU{g|=&n64DN1aj8GFd5FG?&qd_f6af^j_-0kQ+oi92 zBEB1z^&=4DDVuQxEdv&*Y_aqnN0*IaiCjgtzYes10Y)DS^F(bXUkyh@D~6uv)SkeZ zoACl9TfVmBILujXbqndqP7Q`Nckg>@;7}Ot&C(NvfWiRYhK;6;7t{>?2lem0W85;z z)}B&Q_-$cMzeZ?d+OUZjSiC_^!;9D|Gi;fIHe&i}$x z9S~i`Sy#>XS&Rb_pBv)+hnJ$AQydndbD$^7;d;YiDl6^3L_p9LLon2EX6y{8IQ}{% zy-;NHD)HE1=|aj+hTjFru{`xj?MeRlv&h~~;roG@cX6`i)7Nc>wk;M~jqiO==woB& z>L1bT+e!v4z6ZqD6;j)0_g#ophfnmt@73DB#=}xEN_p`aw9Tr>8rSa92 z8401J0iNm`uk)6)u1LX#0#RHVnPMWk8I_W6esI+3e1sUGPjqO|NO`FR7r|$GYm;-B z$`XGK3?*La8EDgMh3TcLe1+_A!QWldGN8!_zdRgkPFvM$EeuvnFOl8#J6U&UjMBZAfAsv+W)h&-#w$|$i$=yzz0cqq{j=hjMMNN8c1F;Tz!G` z_X2o(aE&@Rtp;McQYW|Co+r4EH_~3e_Rm>=$<&U*EnrgP{)KAODoR>6&;_b%ffCxy zRO%cUEoe{}rOQ~FDmnCXr2XEYMp&RE8aQF(nHvtLyewQK*eko*6>P!s=&Ww6V|WudXBNQ!nsgb0 zR?74$-?m(Y>7V3+aN8IoG%RhjspMp8$Kf(?UHF1^IICI0oHs-{ukzUyW*xAa2prMF z7xbOLDsN2*E&@ENlWe%k*nc>Cii*yfsiw>iJd@Wjd!=DN74u-~Y7$?6IGym9mVN}H z+LU}^V=jp}Nga4P^b03i8Zp5UBt9laiYw|6zRu=L^G+W>X2PffxCCyMxCKzc1&1}I zX71kcc6i00oXoPQ)OPQ~7z`)9miLTizld9blciTL(kyXX8(@xq)Y19{k!A?`2YUbmu=vV#DAU!&mYbD zCk^6%rv;VlEq@w84*z3<6D6-@F|Ui{y+vYXY1Lxcl%X-%{#y5FF{ya50h*)+2a$!T z$hs0$d})ypPm*4o@9(-_1D6LC{x^#ix#LFpMx>0?488O(9scpYn@sk7X8%7R0-Imf z1k-qhb4J@ZbfIPT?M(JR#Rq!aHUcV=PWTsRevLHfWAfEStF~^&yK@Tu!hve6oBS=wI_X4v*OZu92)#UjVuI!={RE1a}NlUtQ1ik^Ml$1|3 zVvVpN_PTpjQ&n&tdh$571Z&f9bXyIl*42#8rro=2i^_R)nP7`iEJxmPDgzR_0)sx( zd{TFYHT?m__jc5niTt7c8&~$>LiY)K5WHl75FS1p9~wVU0vute0Q5csN`I=r9HT^b z+gX|glhmm7jBf&R{~oMI7KRJXDRY9y?^UNwt{Lq9@nPLo^XE(sA6?hcfwZR%QecVH z5}qx@+!RG$e5qBdyU32jSO4>z&wZ#>IyYSag7^`6By?mw5S5V-G95JdS~V~*geRJN zYy{3pvJ8PrOH!VZOrd{wypJrl+$Zk|Kw>B8+0ein&22O_E% zGA2nqX!?zO?2TRm2-RMWt6dtHIzN;jQn7CcMSJE|1L-p^qM(j00_c?tOEXYXU^-wQ zK@UKGwMYrb48Tf#1&Bsg23e*|xmaly`kuM!>)$Mgxb^)LB7fkjHt_!*B>7({RwYL> z%l{VDqmr!@HWZPDzsX_2*PDv+8c{5$tBN4OcI#&R$z;jaX<&`Wnavk#JyxNO6PPpb z6s^3x&pdQq@H5R#atRruYaEAQcZY9^_S;-o^$6(>fk{cb-+5i8e;WOmUvJOL+rJ+6 z;sBL;&4APWaezA^-jE(B(PZgLcf$Sgf28Vaiq>LX!QN7T6=Kn2;sv6$6k@Uh^zlY1 z8%h38)4{m-2bUOMIVuKD$~=~R!?Zv&2d&{OqHe)m_9HPi0cUf<{_yP6mHBFgR0tvj z3{$Ghw&JV=Tm4B@R;KY<2lcrp)#x?^442i9F^q9ncqGB>FW&SUDa!Hvafi2TGc!hE za$XB0;s@L2yj5Yp#I@Gz!?epZ^neo9V^_0oRY%Pjqy9`{&B#DWjv#*<6#^K=q6vTU zGvn0}O%uX$_S;g7E;wvwlvE8miJ}u)Ct<;Rp(7lgci{d<$$oW1;_bU~#jsF{$qgsQ z{;L%rsd3dh)uab|Me{8aP-ILcnzW$bNuTgWOO9p@*e(gteeHT_t4xd=lHO~LTt~`6 zW}t$T>}I?PxX&j{l`q;(SM^EE;hWt1d93j633)Eu55@d895?PB{57l(Z~Qg94FHuwJ8Qv3n|X{>dFN>y>l9`Um5L1Z z`M)E0nk1`ISWks+Gjk0L)fIClYsT0}_lePue{v#Q@%Hm0Q;am@XG!+!BLgFy(Xkmg zj5-JkB!pWc>CtP%OvNuxtKipe7V;?Y56cAWxtmH3&2|j)(^D8pHZoTvUN0S4IAjh0 zb8DA$UviTPr8FKF4n2$uy=dK==_H%2x(%NZow3DRHKuNO(6K09+0<=Wqm7vc>A|_9 z!8=BEw!`<`ItV;Bjem+R(yIY$O;v8jT|4GmI<)S*~w$E2b&xLB2; z7(E?9NLYi=;yoWoSX)}f>=?%HmK|xBA-uZlDpxC6^bX1KKdXW zQeK#e_@vm;`_)-A6S`G&sV-lvgJ*$zyD2_Go$iVMP#*FM>F~+l0OQqwKuG6@jVuS| z~i?ooS9ekJX5x6?+9sCA->#0 zBm;L`e&Ovv_U1ER(X353HjCUq zuYxnhU*=k!6idz0MdEM(cd82E;^gA;>i*)@gY(&e_!@%y>aBHzQYrfRy+d>a)P#OE zgO;9*83E9RX(zbw?n_RV1+DK6kATSndqx05w;{v|m0CXh5rYRC_q@-h8DQ+y`vZNOz$ph$_2ufb0`Q6|DhUPQylhCXE6x;ougN^w=DYn*@4zyB64h}!} zYlr`#@{1HTWETGXuzJeLRfl`+V5JeP3!8`X%j=MVWP%6@1VhX(T#lrh_(tZ%)ZpDC zDpGg|xSkKaxOz7+Xwy(ae>4&F6Q(lRQ)+&uowNJC|FVmvWdJW*7+GDEpMo=gfxS;z`t+ee4M-lfXMp;ornoW8YNpg zm({IDMFaCcxkP`GM~5u=lgCCp2;IgH-Xh45cj+SEep-820Qmdk{zLymLaV}YLk zAxWDBCw{@c%7>|}9<|Tdytbz`*B5mTH8CA;u-m#`Hv}_H+DHV4m!uV^&ew0GoMzwp zjwJTlqIdQi5&p`}Vp_>koW;!@?m|ptmRKTK1zw|!D$`oPod0XeWb7R_0TS(ENL+LC!ObL?{s71h(v(ziVpc(dLy?+76nCA-sr_fOs z_wz-J=sCtu#o-1pd*wpp=E4l<`DVqvI!;p{D$evi(dXa7fhDxJm0>}DhHQQU4gO(} z_`eq5e|=W}yAUU-XxU<_Ab%~rHK`8QW3^e!&kZz2QH{%|H|M?LR}~QLC`Jol=}W5L zsH=~kS1Mm!jfsI3Q76uQ&&lU@D?k7CwI>rJF;voqasM!6- zt40O>$b`Rx2%-%?iE`C(=LdpK=EuldDw7@6s>*rgiC9Bn>2h;Q5QF4{Sha2&@ybhV z<3(rm3K@%zO_g&6M05#C4f!)Dlod~WPV!}^nvM3mZ^YsWaI=x|?#{09C1#n#GR{S& zkSW;Em$`ZgS?w=}ZK_4(4LWvhXMd#TvkaKrIOvU(r^yiaBsH+AiclC1 zy3ALMm5B1M3XCn>t7WMv^krlO4wWuj&6O;S<+vT2OQ%-U7h`8Oe=Sylc5nr!YGp9P zo|nrtmjuenG+niUDN^AScbg|Sj77?4$~Q<#7nx^{OJfpKSJ0Ce=bfktwA5=4tJ3fs z?>XS`klwU$@Q8R?n*!&&i@sQ_h^V|@ut}Ac9~)D)B?us_nWQ?QXpm>~^xEH1$<1@} zzW2yqx}#`Rtpy$`QJcz`MUtAUoI6EMP`FEBXGiLK0F{Bc6N-w=pz@LUe}UD*9}uj- z_mUE}viomRdCpgvn(Jss1#VM|zi8!CLRvV&T8;Y4d^3fnV+4*#1vQn+5bEI)UlLR+ zUZV%z=vmz@DN(C$y`hi>2Upk6 zRjSTE{BI(h|H9IBTNnC(ye%Jg*gbsmyucpoNBM^@Y;}!G5 z8G1tKz{M&s#J6e!bPN^aH5UAJ9_= za~iOLNkJjgD-P<0_eSr+LD6rJ2dASM58fQ2!R$LiWfI_4uaGP~0)PHV`5LpAr)REvO0;@RA)t&O zp}h`ONbK)WUJ;gY`;ro<8X+x0%YQ-ZTkwpj0B@89Y%f~2eMaa?0;Aa_4|fRNO4jZ% zKsALX=-uuY9gza4mJ;K~%lm9+d-V#m3D_K!)waz3LqojI9dfakJwM!JUC$R~)gY z$5(xA3_Fn)%?u&DJZi8Rs$;l_%S=Iphhs*HZ4K@|wp8RT@(>%dU5uTl)sW2_y>!j! z$`ySw_mCa~2%Afxz*gL_KRWN21I(c^Y6t&nFA19S1@=kt!d`3z&MVY1U^hAUz*=XN zbB(`%16Z{2Tk=hzMw|3kb@j%lCikClfkv*#DA$hB_hRJhjM}tGGWhjLcN~X~=Y`Ie z3u43!m3E;<$jzK&}+N8$j^ZNH5iC=zwyqgp?IS?Zm0 z!e?M&nq-}~9d7>l+j~FYjc!V&5Q)(l##ZtyC}0W57vYbmYeJz{AtHuT!8}38<)+=Q!<3n1F;RVHQ1a?KM&vHT862^ za@M{CD(V}7P$6t?a#Bh5YySJdvI_ZR4|pzS?gR}F|g7kNx?TBkkaGDzN( zcJ}9;_=ON&agQ6)66$D1g5*^*0Jivb6!5Z~s(ZCroH=LBQDumkc>PMdF6EG0o3Crq zLcNdG*&wt*vJ8r;WE*51u$n07>u5*X-M<1hxpYe@Q&fAL60RTASZTOPM_G`yaocH& zQXi=H-6EfV8$XiTpEJ^1Fi$Ov*+1&5)j#ioG`9a2u*|}+upw-@eFu2PO&t#*@s*j? zsE0&}eKg%zyHlFeLMY_>b1A=cq^xPwW}ycDw#~`tNu`opBm8^7B%w5?NzZ*aNklTKZ*pKiXpY8gao&OdjWl}EU zBqcY+1NwCdKDZT?d|~_=tre5ZIu4nC*FSmo{vJd5)NfjcHmSloPyAP>_V&}$zM;J> zr@sUpbJ9ouyCY48CKYHAfbg|(`W6Py)ZaXbes$$N5fP9Zg!jBNGF}Ry_i{mi9EZqb z1jnd)M(>GXn;7G=f^Q)8q;Qmme5B#wz5>3Y#pdQ1Ch(VeI-1lm)g(cjzq7Z3-JB^) z8v^I3a}mu5^HO{ngVd&7gv|~jVJcgK`ezZI0G8B_AK-Ere~vSlm3IM-Q2IdNyseJQ zi==N&TwQ)*pY3NxB*a5j(8h>n{=87x%-X)=t5iDwM4@gWmhSA|XE%^`vS=vR#GS_w zD+H^k2R!!KO*)7worsHNMeA_LVBXt=sMbs?c}Kba!r@aLFU25NbJI4|wjReFboMoM zlpZMxls*-IKN49l{8OG`*RO_GToiC4CrStsr3(U(eP}~v9HSn94+v(U=-ZzF!6k-V zdvbg1To1(uFaJn%cYC9-T?chBIJpyOlUo}2=}i$d;T;_(kLZ`sD|4>jSD@{nB`e_~ zt%UP`Xt*6Z&+k=zMz{q2=Dud{M!q7Ydc2C2`Zt;|<12_S!+7_Va3FZ7sl1KfD0~TI z^M#_r5C?~MA4YDgokOw+_d3dtu#Z>+s7px)fmq7EegL1So=9rtonq@kdIA*6(0Ot{ zSmpBs+^@^NJgdO8MnxyApX)Q{arvXCArE&}!e8CE6>k}g^f6nJco-jRp%@tF8ScXU z{h)b4dBDNc;SMVji;u|@A1leHPnYz@u2PQ3IFG3~6>_al^=`$EDp@2aDdXtb{4Cko z0H1y5S8qk(2ot`NZqLS2_xb{7{Dnwv%E`mu93-fX4XZ8n5_kpoU=|OVdIoQ*+k0D* z@&SbIK=4{f^ZZUlD=9s&z-Rs#O31@VwduPX)1dPKyc z7I_ELp2ryo=jyNTp9j6=j2YpTm0!XTWGH37a-SB8_l#XLPBiE)F9gSy>j*!ee(OPS zPjTYR*cjO6nMFQ;mE0PYcQlqekn8W6-vXTUF?P6Kb&Ql%oJdpaVHazay(%Ax4b%RL z!dNz^2iDZTmS{|1{O#KwoiZ|p6^`&Ey2ZP;`3sHvI-;jj<<~y5&u~ zT<##A@77i)ZGVcPH%z(iV!SKDlti-o1#9LVNN}Be^WNiI)qUDxUHw14)>3a(MVpWi zT6vLsa3C2*wie<`43(VB!zuK3CfDCXUzTq8!6t!pN5KmMO5M7)d|=EMPDX%D?4$VK zt~75-mNYuUAmQyBL^5|yf+AfB01N5nHT{Uj7#|otsR06OhO{moCj^pVMg-G?vwTum ziS^io#yoG@ zG+U=i*rsh7`!g*7HSuPZv#>N;=%UdhI__AVY?nWlH`zagz})KOe`vvpyn z?Oj2fU)4djw9*RCE_LAFu1(3U@z463{} z(UW01w$Gj1VeCK5iD`MVLRr~s4oqwnx>6&R3GbTay_D%FG{DaM$@CvtDEau!Im=87 zu+9zeeZGQxv8vQ2Gf+yl7Od`K!pESJ6D7&XNK`DL!QYPp&bzTpD@eY6xS1F--l2eG zb|_1j+R3a11o(|*Y;PTucLe|Ocds}j$!kGk>6W42G}H+qhWaAx!4CKuQM_y~I4NiJ zek{(%2oAO_JR+;*&bv&{?5zO3Zi`(&EC;!{(2{$=hs&0v2pTeF_KM(*9_VDqlT>12 zsSE(E@chwikFl>rK7UFsI5p0L5M>32Sa%JlMP^O z6SbS8+0?MuN zi<$$f4~=A#$^A%q<}3_6%!NI~4s*hqrsOYdWe~h-`cctC4WV#vhQT99F0c=bERnJJ zpNX)M`FhLUAti-*0eStZGmS|B_&F^eKuG2D zzTH`pR6nQC%Yp;X@1d)qoDuFR2aY?bPyOs^UkAv>=ZAem@(y~N+_)3!tE6)%L4z36 z(r2puS5Ea9`A>oBv(4b7Ut_{r#k{J4GO61;!F3Lc{KMepyr>}T;tL|$BVjDYswnPI zN2Xq08i9btYh^!4Kp(Ym?G}EED{pWVb=@DWal?CBV2GN?s^i3;;T>t7UA9m=6aRig zyrO?@y&6TtB9`PlmgR6t)ZCMX)t7lGlEKqrZQNrt2w^YSF4&?C-KzbqiDA6*I?LTV zoV*)e4C^(f5Es$IoTdnGi28!O-n7>B+b5{-+!hq;iXlKETO76uyr~@Ef>`IxOj1Nc zt;xC0es%`8SJIM0uK~$nTgPD{@hvebOEU*olC8+%;W1!lx_Ir2iHej#gtLyR4O|4{&;ggcTg!tZSfLNiPTtX~5r3@^n9a_QD;>@Rs)b`rdhD|Gq`!t4r#o<&Io;EXwavqiv-s@DA*5n4 zOui!RpNW%T$XDMQ$i&h>HP3c29PE+H`OP!Y6bqGC>MXtak#j2H-$j?Wcz?ZC_4}7b zr^ugK`jRn#C$fB_SJdZH!M);_wroy%f0a;+v}(;W1R7k{m)x!XWUFy%*6wj>uuEJj z%%nndy4vY_lOi#7xcy!u*k567zJEW`XwKUV??2(l8?niy@RgN7PjZvTqDBT?Yq)eO zbCz9g{$*+JA$K&E=mfeNl8GoGs+y{d58z)hw8%2br?ijP2(V67+@v&#B;f12(E$&C zsnu+m@~2-%a2?WC0Qd)?PJfCEMc^JCR`?SggENwOB zg|?@MC_qLS+Pw^jStN)4J^eQOjlmMS!b$_M>S3MLjOr=0iD|J~crmldwTZsRsYtCZ zqk-i+*6eV3F19{2PL>YzbE9Ks6n6)*o9zTIjCV9XEp1;Jxx@p29m74Yd#3`{I4-|iX_rzRYrdBv>R17?*l>X(hv`={{V z)eERvY23ABMk%*^$VWY zy~8FwoWHb*INc&@iWJrib!~T59(=<+)W9q)`&d?NEJg;W=By`|}{N zl6UZr_?E0C05ea~GXZuY#cdg8vb=ol>@cS`vWG69qVQ*Y10k&g6H%Umb|B_G%QmOd zTQ>w%5AuUZ2;5mwq-UrR={d1Hd7T;`Q)_uW5q-*2LS#a?1e)j7bKz^EMWj-krC)_vjG-v*>%{5~B+e=v`i zpI(E=f1=&m{#Qqzme0}A-t1=_*+|jN)`-vA@W1#SSv|A=ah#I>C&SayT$EV}JqJ`9ipnY>TgQyWn$sDs<eq!b@N*DfKM>@00#V1uZk*(j%@P>tzb$XaG}ax2md z!>+eG854MzfoslZCkx?wjsOm~XmrozkYv|#9~3{e4fQ1+S?lqu1iNqN4f5?e{WO92Y zeSJ{5E520!{5OJQFjP(a{fFLA`w{E8{y#Qb(ooO#C*s8DUuljkML7jbC8RHw)mkxC z0D*aNA)qQ2xRYiu(L7ml|6*%D6o}%gHHmuYajJ~gRk}-yVN?@O=i;tLp2wysGPA)l z8=e7zov8L#sUVk@eVsQzB=S{@0aG7aE zQ*`v1y&Z?DnES>e{OKZ)%$_m;#ily+PC!Djr; zY7l2A_jcINltOWZM5|uxp7Tc9gT?BlNSwk51$;ObOUK(OV+qyRiz;vv8_Bo zhLS^QgC1Xj+fttGG_Y)UTd&pHzSG=AE5geFdDOP=|0cGjB}34)j5o2;@GGvhysf9@ z>h3Te@8~-mYxhSpYTLqI+^#)cJVP~clbZnnmg`ovND4N<(4Lzq+HDQ~0XQvOg#==P zRhS>lPv&j;`!OL9j(TYv9ylhBlHoB}zjegW(k0VCkFDyz)BOp{zWQl+)5i>9n3--D z?XKQwg6@wGhNmz+&+_{%JR=rGhgb9YP=+@R!X8C(L=H8=*dgmREA z>wL4zEjSnBuV4zg+_iUJh*Rth%l#K^@@h|#B~RI|0Of5Krdq}Be)uN!4em)+9{Uun z1D0Es1XnjGJRSG6)eaXOeI`rMB{nP6QRuAY6Vt>U)ucfyj$$bX548`Y%v##3m_p3y z3clSEi=awWp78A(j#YNS7i5v#`z0XnU2_9m6*>I^ zN0tMcVRK*Ta3&0ijWMSb>APT z%%VT);S1ro4GvdF30F`asGc?yC z%;fJ&sWTXgG9*i`F2iAatd?GZk{Uzz)}^wpiX1Ym+b54Vj*8bEY5!h#w@J-okUChT ze`nt3eA`X=bba%Z#&mit^ZXJi>+igAlRFB!8bqRnx!Z%IO?Io>h)_Vz%`Lv?ROnUG znm3$ZWZ@R*)zWHcmP;4jZL7#I$8dl?98#*WvP8g_;*cW9<%igMjY~ytnR`r3y>?sx z^e)RM)2esQgIgn46Y1WM{E3gkDawwMChb?IsFGbtm{ZlN$K^_z? z`WKzOq^)FLQ?GbVj559%!S1d}lmJmCLkyVPd}yL^^@NNfA>qI=)h@cjFbGN=Va+q=Ynqrto=iRB(9I_*tAIw1xa-MB7lpp@;)Cv*B@oK4hwW6>|x$ zno1tOXRExmfV=X5c;2qE3A4<|xaFiJV{M;pp5y zruu$xG1XER(wMu{h14y z1rYTzWKvcOo`VDtB8)b31T3vha^TpB5Ns*5;Nvu%QN@L0*0sA*DYYy}7Dck~+4O^s zxiF|q8fyJ^STmn2loAUHc7^#W!9d~0?d)dh+qf@tR@p81j+zTM^;EU_@+nYhUD{xu zTGx3*Hl8?PDIh(<_P78iDcodPHCa5JXyZU6&qHU>8a34{UC6yFTwKz&Z6z*KR?byi z6D`gfJJjDbz!o)9SAf~rJavv38Y<%CXtNFiKNaM8YU55ULUb0INK%T17|USILc2;X zN(deV+;V=1`w6e&s#hVjj#mavowE%OCdTN)n3}0o?&p9uF@FgRZcshx7ou3cmF&D(0i+8~TZc#k z4URwskd}h!X7w9=3K1!xQ;XXDM!#rep#8{;m6&|H`S#bsV59lKpOx55CeTa&_5l;+ zwyMEEJpWGF99?7{gp==8k)Z!Fz2$PIcsU@SvY{Buk>6Z+;DNY49J?Xq*TewQu?0A8HC%5jF8A`XYmLZv9R5v&xOMAvqE4q3sXjFviO@ASXFx!$}BI z$=gTMEHa3Sg{xk&L#m#&tB!4qy|=B3cBqvSDT#Hc)f%>2!EawaO(iY_*`Bd$hm#Pc z?kel=X>ptwdgSqUwp_m>QDe*yHC3&lsGo;)ouwB4|+Urz)54E|aFZN)4&=f=5X0w%yCcN!e$Z=BU8Q)^T-B5{)&E8?m7^2y&tdl16!O?6;~&kKJS37ZnuGJca8i|W;? zDXA5067-P|l{2`>k3-Qv=&Cw0?RL*flHYOa^_sy(oMOGJ#jIgFkRq}Yp3zp~(eO)d z00Ew`c}-NE!8uhym{DycD{L-FSz|-gB!17zh#(;{HKHo@Ct~Cd^3~u`-gO7jm;WnN zat@)FBJnMBb9?N%oZi4c#S2>-%l9@jZAcEfYBWb=(=Ww2tTdhPtbpxgD$2~f*y@ir zA!1_m8p#ycb?VNqEwHOWBkJGf`mEZ}<(sb5NVX=oF+7qmZTw%dC^km7Fjdb2kWu#b zU`%tXOw5Rgt?{F!0?2$E8NNIi4wl0T_SSIy%NI^K2G{Al(BvM7m$vlg00p~y8%e$E zw{yPfJ&&4O`Yx~s=Kj5$x9ZB+jhHnLgh*Qv)YKlc>j*O-N~?HZ%(+bA#!0LdL(rvj zvdXVl{mC9e=g7-AN=p9kw)EdF`$qNJTLmz3V9x~v( zX=M-^A=sJGh^gzi!(2?U*}lTfq;*>U zh;}F_^uI{+AW0G9Bfy3Rf%*tE{S+?nfYJG_x54MAu%@PwAI$4;CWcd1&;4;1UnqXF zj0gAJXyQ&gaIjn3H`6UtvbE(BoC7tnBi$I@wgBU+5XaC*@LCHQ@C0vpLJ7QrZLPa!-$mU4|z809yg}B&= zxYqzI(tQ4<-OUQS6hI%%#4jT^G)<(sY(TN*>Z}YP8zTtWwL_$q(#epMc(OsUKry6P z`EWUSlnekBqy?$@*z0w5qUrL}GS@0!=2qP8f^e_x;~wVqTA#tJZp-$5@sLm?qob+d zvT)}v?^D?Q3J!I(j7y;uI-r9AU3}qr;s0_{Q>rIvM9ndWPXqX1sn}p2-03PmiOw^z zEI158sc?qs9K4s~ykFPqh4z0ANmOFALol%%`}xH4ENUvWpzclI2GnMcmt2bfzof;#Wz zs{Q4Mqc=S{kQ&`~;Z~ce?a&Dco~SuZs*>k0vn(rvS8qr(@R^DXp^Q^t^&r!#3)h_@ zHSTISaH94hQ*Ix+$qw>6=dhkum>phuP=j>f3rkbocZ#?&BkAb~ z<30m&O@bPqgt2vyPXIOLDsLm9*OxNF=Sh#>R`&IM$B6L{ zm|lrqi?!X5Gf_2)X)a*OO@1)oAK~VDpNh}jtZ-RnbC`B|ZVxW6=69AhUt2|Jt5f*?6S+k6|Uu+cz&ti zIyXf-v-WsW%V_00i>jI=JGcKpWo$kGq7cag)NY*(qN4z#$s#X2Rk_Bj2Y1 ze7EnORBzWi^0RJU6#Hj(+ZXL_P$(d!yd&wgponclqZcy$+`y`(&dO?i;ZN{qH_*Mz z2ems1E*SwqT8$*kAE$j|Gci2N{<@1;-|bdtxcVXpe{oSkDmF|QpW8;f3mtxEr*DsX zCdYYal3St#R;i*_-W|A0;lH=C?V|VOfG+mRqXO|?BM^P8@@h4=<}NGE#R#bO(3++N zTK|RkiYC_5VeI&|RugY&R&imVFZZraV3U}1`i4;O4vQ7F**Vg0>Q32Zxh)RIuO`nZCWh_zHxA02p!OrT%|7d&lTZ zyKY;zQmG`BElF7Kaw?>iBb@W<+)uZ7=>-@Pl4OvjofjA|4%k?6ax zj>+qqq-SWH+fGZRTQ}CPT>Vd=M4y5aoue7IRL0vmFL|yJL2pv#A4yM3>wv!;6LHOI zb6?u9(b!=92bo*CChAak&RiCn;1pZAFSge#F$qdKJCPf~#bCu#tzj49-VzrY*d6l+ zREZV>(i&$C!yFf$#ai1957O<@YjSF=n^SczvlShxm7X9hHz!kg;#aC1cZuv1OC0xG z|9kJ~pLdjW<(7--cYBido8kCBqSF1_1M}azlagi*j)ecwr&O`mv;BsS{ipS`QsM7^ z08NVuDYcZiUPvG_44J+JF}Y->L#6?>)T=75Vv|EB@19_00SI* z7~A!z)0Qm0g)XkO4pW{-R~$#@@9%ftbZH|_6Va40rr;eU5w=-!fuk?VOsM3 z;Am|AmQJl3;Y`Azb_#ccP;EXO4@%NO>eV2G+7FM@pc*lgrL0k z#T}2w{uW)ov=`wUYj;l8?1E5Hd(N)JdrJJmlDW8TGH2hAivuLuvL!(p^;khvT)y5G znh$;N^%S_DrGV!|HNyB^d!f++gfyf@>*w^H!wwPLt{RP`0v9ZeMK~~M0gmLrTy*1`K!DvJ)HD4MQiIuYCF#2kgT7u(eAD5j{kL@HS&RdjPRqH^6$HiF~ zf|vL}kScb6`Jok%<#mziTa56kV;HS9Q2Qj26I#k+Jcx;Hw*-M;?&(bOLPLnrjLkkQ zv=bgJD=CCHT!c`?Uonb6;j|YBQSF=Z_s=e*wLlj)BT$<=gKaJFZST2&CZ%jROh;6r zyHt-*0?^30fWiq5$^L@HPM;|szd+BX^kLQ6&oPV2BupqBKFL*K{*hN(5jl}KzfYa2 zUGWtC>k>Bzls$8SzDgQsInP^h0?$aul}}hJ6(5&bdDHR1xdu|I%E2>6 zv^lZ_vDCCgWF)>pNEcX}huiG{&h3CI5UNHCGMlP{>FeH{?F5Ox9`s`A5!gI&U>*l^ny@=lAV$hereNtjU(*W<}XB?x2^ zbRaFnhCtb&MI*t!;iCM_hDt18iE2Q86PAig^5H+^W)oZTGz^bK^%e`#Vh9bKRq<*m zhg79mB_)pOfRfZ!^={(u1z5>41jYbvp=GTs*$t+0&E{kc2skixNw~G{;@Qap=@rBL zU?fF}p-IJK74xYISWARydARkbJIWwU1n2RqY zOwp+Xh7xnqGrM@&3&%3)FR(_)Ko1NzH>SqRHarJp5!a0w&W!onFpGci%Psz4LKw0v zQDI&bl_?TToHx(}(Bw)Hnai=Qb`_?`7p_`(xE|xSv(~pcapYQo6ClSY*c-}&ON|M0 z=1vC}-It)tJB9P7G{#n?q?a&iYFzF z7*CtYQpA}dOgpwcbUd26Uw%Fmmw&{3BY4gP7s6C&cJ<(5LR}RH4DgvlS4i~}LWhNZ z2{nY87AF5jao&dpvgjL(;y*pL^)8PsBhOr>EHDFXsZhikxjgg1OZ@`g`Kpx1bX0IC z)m&gkvUs5$W06TInAw=U1!-yu{QT{snzBR2TE($a-0FyDe#_0es`^*4#Nai($RDEC zUMZU=OVHki6v?DC5WvEv`d6HiLA}P4*rpJ^qjP}!%Hjwf-ImuM1{j`;jv5?0QS6$b z!cT*rs^1(lab^N{*9{yA051Tg9ed3f02YE8OvD-356@0ZoC~oBe~MOSC&(Y#8<0X+ z(Kimib}i2KxT6%j{C*rbVLK5+ZR&l#Z^i=eeP7!EMi<_BUqfC4 z2^XA?v=W6HpzVjJSjrif zjKgJ_hs%LCQ#H1|i$81Q```+%J?AA}2f2Qdb1H0)bW&m+m@{M9lkB^;{nI$0&nojb zb*_ykP_ebap~(6JWFLA9IL7Y`*=S{Q7vMutg2JpDL{Kxt77EPWO2%6jpKD}eWIO4e zCpG5kk3s{q0G@GPF2(d6e!Bj8BD9h{%wR3Ui@aKYG<9UVStY?)3xx`)3^qhcF2AGm zgF>WHYNQ0H3f{*^0pYC9pQ}nJ-lVt~t;18tq6MRY_P3<@HY{nD;BUhLR4%m!Kqgk3 zIb?Rxgs`Vq+fRQlGVPsFW# znW4`-k=kpZCS3SWPK9_q3gN7!(&G6;g1=_P0)4%19rdASKS6D9=h{MHevvc>26+V zov)lbH9b_ffBQ}`-(g!@bZdj8)&-`{gG(U|K`A|;QBbOuWvW%eMpXLbH-NhDVYZrQtZJ{#p z6Rn2rcSc1Uupg~wLf-LU=vk|+0k1ZwR4TTN4+gyz8SWfEIHIy+g5oet>>1{MHIKi0 zMR!B$tUa@F*Q`79}yE#mgKtR{7J$5c+5n@$-PXmRPlwR$!oq3f6mpp9!e4#gCE=UoA=dI z_S4(unV(Ge>kX`LvF&oSBS&@(!E&@b$Jn{5*)TcB7znN|IcddAt@<$4&qM$4U!}<$ z@wVggH3BJXqUGg8CNwvo?|eQLl0EABwEpS(?YwKzi|_?I!Nn+ZzwMAw%BF{d&=p{2 z;?W}(8-tkC@tcL921e7-8;RHMn9JjCQC$cX;2@g83nZ3i>O{H65Ip(TX8ku~W%BhB zkO|ovKJ1uevF^<(8wzMj(yN3z%~kJ`ByiFjR!*Bxq1Z;0h?z_J1`kySa4f}37M7K` z#_Q7;j~$X2Hz_aFLgxaL8ie;wP7F`^!IgH7>Sc6yxgUH_A44`48gj5 z*GSkWPtaWaO)_r-W!hV$%AkNVL!}X*Zc))8t?NxXx3An^)~x0*KbtIDGucUVeAoWr zNDHqBe5s3js$DIVZ=NtjnarciGtoDLe|d}QWfeKhsHS(om!r*!p~NH5bbq$CQUJ1` zJlRa#BBuk17=2@`csE4wshZL5bkk>a$%G;7D3m&whoO&jmdIv+6eQr--^GI+PGmld z24$h$jb0+E=;+S4iOMu*7|rxXhK>V6Y_9Uu8!W_3*`yZ+C1K^d6l}yy*{l}?MZ~PQ zCTrBMjUvh&vpnmU=z_3eK=&o2S}m9_gTup9w$2L5GDVjfk&6jRcO6nd&bL zu1#_%M(R5a-WdOaW~<2ni1@&Purx8i+#Fao)q+z+Qv3<)jNH&GrovfKF#8 z+#v$rinG<^Zx2+#S_uM%kCtGigT}^8vWp^ev&PPRuezq{=ON>FV zuLP{I5UNuJwNnrh?%^j1BV`3WNT6LghBJfuki{wMOPP03330;l2=gmzo3 zllGW9XdrLAUYn$)6@P zp=69uOe!?MS(wVIWQKc4L2-JuyKA+{33Y|wpo=$^mr_4FFxM{71;a2?ZXx=mM!sJ# zZB!s{?1Tih9YTfyt<~n6yz%P622N!eST;N&zTR$j!gXsrCndOK&{tN|TQGc^dWJof zeBZN1{c9D{Eh2HQYUk@ww{PifWq*_&CePwWwGZK zut|=V)NWJ5E%Wo{3_)&|;I@#jg>2%YLnj!RHqh$;ZS4tv%};CQ4RQhE8#Hkgh6f4S zXhxKA)Ut!~Dth+z_zm(3BZH+s{zjd_c$!hapP==#upw0XmH)vO86Yu$H^~*os=rskq{Rs zQ?$kErLxTjIF&}-eh-~0%Ql6VM#}W!=nbZWUKet?`itFZwX3F6y&43FUNV`lTBE~; zG&XiDvif~6SMQTrZYlj>F1%Q6$fZmfBv$vQWSkD3_A2k3E{Yh_pvm;jKb>(jxPlw! z-GGmerIgn}l?hR8Ifm7c0~#a2HO7Gy$6xBhfQd(LYyQqy$KZ`MIRJ_kE=cPFOOR7hwv;wlx~^i$@j57*|uPx;KWI zr+-u}w!GdU(hiK_54wb=~Zm;cX!P#mLwi=92_xfnbn>e21IH*`{9w7G^XV0{{ z;5DuyS}(J4f&SuHH@_IdB&&U`t32fTXh}CZ9e%3DtzTi(KRI>ZD;pfmc-#hs>CE0h z6+9~GOo(Y)3SiZ7eaqOK)8Ckj?=V_hZaEOGX^*2*HpRJ!9cZYDlFU$S9u0i-R7#^9 zps7hjHNwO0aqZ}-T^>us+{fjdD76hduusfcNg?H$QsVH@84}9m1(Uc#*A`+q!Ad^H zmEJjGo$TWb(y79=?WJ~?8Ip|Jz{8aR7~q2BRv4fyKUf>+i=K5UWFdn2{gnC&l2pqs$k-C1!wGHZX#g0>S&5oxA?X1 z8f+ls=<#|+^WA`~-4Csd?@Z+}qxVmBLY(XE;P9coSXMA@TH5>Xaj64VU2i-jiA?yT zpOJ2#gVE{-VRk+qS%nSqkLoa#qrBvzv(jpD&7=HrsY&_bqSLBT{i1t{jZKmmVYHuS ztND@JqPp`@{Y=N>qLYM#+wEQKhr`05BkR0eQgqUZYEra02mZllw zej$?5S!KEDIQ=85_1zm%CS<^lZU;Y~oTA-ElMx!yFLiZR;WkD@`4M9iFGC?$5n6Qc zX0x4^$i`+1JqWgR|G5GtE%;@9#o3A4!wbJ-d5A)$5PZE!Qv*we3<9f*^F@%g=L7TT zz`Zr=zwPONV8e}8`J%GK{6r=3$Ms!>dW7Orj?yadnVjwM1=u6(Y_T*s~ijwz+N3w zcmk2t(2!A$VCkhEiK7)Tf(Gh|!M7e+OUSyq{guJxYU~uq;1@IMON?5g96@kl17>ZF z>Y#3&-p3!&R_p%lh@9sNRorDn-jC5`xO)=686UOW+l?`fAj^{cpu=7pAb~l4e#+u* zoK`~zH7xO(nl&^EV2X!crvAcPnt^=i>lHGxAhrfX9SXUaraxSHI`(HIKkQoyg{b6_7@QdvS^|NYxvh6CaZPUS8jTiyF@Q)m_M{MX5mq7pl?k@VL%L(j1x@K z6GJbDkJ=L2%Zar6uOBb`>PL}dwme^{X`25n3hL1be)1b5gB3sQB0NxC67JDmNSt6+ z*~fR?sQu8y$}}R7<|abu6W1>+7#Poo74dG_ycU&!m*Nnba0@%?{5QSRJ4Is+G88k( zWzN0xs_)_}s0|B>^iiO5{f4NEf$zb@<|ZD!+$5>id4rI%EdKPdq7Z?VmxY!h!@J4w z4_u05MbyAqlK>9=UI{h=E@XY}Ws&0q4rCa?y;>O+T+CSwhD;X(r^_9>^_iJ*F|)T=%= z>csY%o}eIVO8eZtph0R%JH1lKam^A(y;evH&1ZkeD2U?a%r;}nZRavJp`bsK(o*(O zqWb9C@o6dvdFZh^vEkh_XO-J4XiNbmNQvXsVoI>Au^RI>?Fk%(hxN_4LWhe0E)g~> zK5>)R;SwH^4J-}CO!7=Op^sMkzT$lwX=MlaADf8sH+Ki8vF`jnRTUXI{?$6%@-Q=b zeR*S_6sg0%P|%kxY`gbUW8DWNW9GxPM{YMGL$*WM&wA=#tXhY ztmnsN36~Y@lPAJpt}3VyT=_N?mdHkggBCjVyma-dnu|?yHkujtp+NChlc{s++COYj z7X~o&v{))URq&_4|3Uyc|S*COx0 zng`{jD$#^ZQ68~aZ1P^sR5&tYeS*6jg16P|A!tx7A&N6Qt@r)lq>?%$hfaZeOD?7R zk6^Pu)yu&E^0#>IryTMZxK3!rm!%Jt*ow+9^eT15KY@V5WMSIZgYauqS$=ur*C%GX$U4u_Y1Uk?YV{JZi9-U1LKu zjP9Lb)B~Swi^04x;dj~vQw=FDA9bPFxk^ytV>~!pct_AZMO?SwHaq(W!gkuRB?rB* zCy?g?-?&0|fz*!qV5a)?V2JndV2ZZ&V2pR+PPoXq;xRc7`Ka3r)tkYzG2!eN0@OJ# z`Lbfw??q$wBc8Lt>aPpH9IhL{3SE`CbH;lXT{ok$T%|^IHdcakTJ6ZR9rq+y@%Baj z@fz?1z8A;lfV&Bel=FW|jJ#QE2IoM!NsahGzWA^>N0j}24vXE2Ck??!fxNQspxlRI zc^o;y_S_#znroLw)Ff*t33|_o?S^>Ci0y`a2@ITOhbI~!8%PSHxQ>tA`u&1~clG-vKh`CvgJfR- z?+f;pEUXT^)jwo8~V5anmm{Sl5CT_9}EN94ao_v|bqrU>05K_$p6|E)`(- z#al}Aqh=>#0}OhVf4_pj1lujVa=yH6@jOIO*b3Jv0ftf-J-H<6+zmh$cn#H*x8p1x z9;{V!RyW`A*F5nm1ax%5W72Lqx*2o}w(nT=Iu^esK zQ$&f1z#cZgllx7saVVIY>8K{PC}Yy6hz>TUqk0&>5?y$-Q`tT^5_F zzd40)eXLj;oM(gsgUt>zcg(?VMB9C1c0(66O+ZiBGImB@{-(CaPJ==BioFEgO2y zSo$u|#I=9!*SMnSz{>w%px6;k)H(|@N{0OoUwzus|Eo-Mu^paV>0ox|Jt9ob&roG@ z?rVU3OMQ& z?@z6MsOh=u)y@+3cmQFQH{`fouCb97FM7C?( zI8qT2kYlQ!cPK&3?Hk?Cg~9#PA{H&qzL?|W>G=Q+V>NB#pM+ff_AE5SKa;ZDi_W-N zU!QGzMgOFyK$Im31e}WTJ7vmp36ylnY}O~bXUmiPUW5!h72<#Rnfp2$`ln6TRJIb6 zT#<%hhG%bt;@vw*wo|yoTg*nAK(X3KTJ{Fp^z|Ci4L&4zI@o+-6#eK*P|iN7ykS-> zM(MkQ4mK@F^!3_zPptO}rRSbO`w@-O$s>EJCEgiw;F<$+DZ?qhWkUDnz#nH(lW9e( z$DUCChQhWPEH!Ms!wEj02^5iO?Ra`VmU}xY*5cVy;yn@a@h?-Z@HXROX-Z66-F8|Ah_BJI|VV6rGHjd>6#QAi+Tq+hq|z-OcvJ$6`02Bu_L zzKB|3+^u~8y*IFvp*uq|RhFB@YR!x<)sAdc12OTHWT8t zEXh!MHYNCdJ4Bd;fd`XqW9tLZ$k3)5M7f?!kjK~O4 zMvU$73XAr6wLi6+>XjBlA3=4ZgJ;cIq>%G<#KVNe@aqZD@Kf>;pgqEF+%jHTpM>}C zb#)A){|W`-Lw(@VA)(^Y+44AQfAen4B~ds2D_#2 zQ4X;a8~#V6aSz;yE?Z8HbNo>VN#@4^5oBVDD=WIlw#3F7*zYks>tw}08#ey*>9L}A z3j-H*>@@Yo6&pKLRJMe_NT~2wjk|6*B^hGGP5cyIxo!Lc>QORs(X}qgZP9D(u^2qy zD?lbP8kK93@iK(Z{S>tP>t4usPr0P>Z@o@RhFl*3 z37u*eJi^Mm6Un=yo^`W9b-|~J2E0l)xQCX!2bH`hm3WFOa^sWZz$bMhB*lb|4HL8> zAl*tCscMO!-LPcPRVe&2p@Gt}*aNO#MlN2E%HYCdUR`ouUBaNi(Af7CQ$I+3Y2SpN zN=U0m3#A;!vVCEv>o<9nV5jQ>OJTZ|MO&_fsQb_|=Nu+>ES;BDk0ZLXvd%Of58OJG zt}$*hnzTIo%b2lrzU(7GIRsS%RrnrH=MgRLOii*QBGg_gO&8dl#>YOMnQr!jf(Mtl zoK#dc&a8yC{tMU5;3m*)kemVDTJFGrm6*gLJ$^f5{dO|yPI7C5RmTT`{FiGLx;n~@ zhIjGAOrvwD*r>P(@q22T9@!*q68Q_5@K=uRB#sz@w}0a#fBIz3Ey+sSQoc#45rB&A zD3qK#v%rvO&PoXwwctpBA2}+?MK?sWE=>T@y3-GBI&oKi*e|s9d7YNHr-o?OxNyhNv_U z(^FT$vrbA)*}VE7;65dxb-CwU2&nm^2y76|!$GpCbs5cdA_DFLzN6Q?k z7kfCGbNLq*{SKOSoz$jAiKx=lXR8)sXZsAh2&&svwrm%AV(q>k7$R0rxbx05!s}fT znoWCFPX>7xe2A;i22~e$lucamvW8`p<>j!mmCkx}I>f6D?$k7LmFGmrXsyy*R_?cL zYUpQ!+2LXCaHg$TXQR~A&{6N3u;=Y_x%TE z_R5as4Ex?}cdS*3eQXh=HxOvVG3U7t19zoqj}3EVXlw z$mW(dr=LowO=_QuXM+MKouSd<=u<*b&mtf5sloPYntfL%&*XFPp45q76=^IdzHSL! zLlQP9($CuNm7RUsLm}cT8AmHevW_j3R5Vm?kpZS74h2?J4u@ZCvPdaiVsB*7t`tb81!)S244se4~U=|yrBj)$VoNh|HaONn_@dD^SYHA8=d0f1>$1bDw^2YW8 z3pg}l%MN07!|c%p^Cf?&W|e}mLE055G6$%KRyN3B6Ah|HJ?yj9`rXdoRCCUI0Cy*7 z)X2$PJ$(K8ufwi^C$2M~Z;GP$_rQzizZrJ@fA?mD^$Z+s?A`ulvry8K!Bj%^26c9M zjELdqE0(8}wFAAc-A&cfh|uS35vcVV>OPrUVD$P=`*9jNzWd10M{?HgkXPyOm)`M z%eZvaMKR1A{lJZSlP**>nz1gS2CqELZk?!{66diy=hq#B1=GjkIafL@t^{P0g##C_ zjZeH})+>x8ngw~+2va9_fSBmo>dUl?W@~MAtBsI_UT5x0gooKCIb0v5Al|?ERc5fw zt0TVVp;5kVrc=Y5K}SGv&M$JYRO=wUbeKhS_(LwfJNR|)Qik$&6LP|_E`9!aJR3(* z(@zv_Io?+iRAMYKRkV{7N(eVb8dhp3F;%dW=Tms3Js>#P-n23!^9!1>dl)zNrei$P z;?pb-jCp*Fo?S|>Wc-DmULP`yE6`|?!-B~kY52v!P!}*U+qKVdQWdDOd$5K1)N(ql zNLXHsj%7lxBv#>W+`>;M5>chP$$wa45ag#g^`1EeJ=^%~Q_RLIsy4%jUm`_7obnrV z-WASdzGS$SahH{*ktP1P#}qz`HlCHL5iqoW>kQB3N)e<&i=V>sVoCfC(zUa{*}12{ zu6CgeHKLBlXow{;MNytw+iHBpyMV81&Q$ z)%Z84>}P=taP4rX`aX#y+HBVr?0g>2{YQA!8*8r6n>XLGf@YPUT(wZnF1(I=XG3;d zOpFmTS zmcgx~7O8jYE?jq%t!)WUiB`YrYpl4C=QhzttT_pOmyzT(iHTxFCMb71#u&Swz!eJS zWF148JO@8>d{=BL9%#UJ*3-Cbn+J&}aXpF3_|L=bmVte#+u<*j~QE;Q{Ih z9JL)ESvG$I*b(T!9DoG})hW(Z%g)td$Uf**Fjs(B8@$v zCUd+;W-zNz-4)EjB~RDD2fubTOa_$GX7G9Hl5Zv{dSRB;`fpVD`w_XzVTgMIPSN1S z0imQ=B_&9~@q0~@n|sO{saBWHSWec?iVEpm%WMf!JLysfX;&>Im3G#{M1tK^Tu@?A zWKd>MZNWytji(bbxhDt4CS#0i5QXE5J~qKs-5)V${m9W{jq*;nc8?VExu*})^aJfC z`^8uEmZ&~yay42SLrw-`%TAQKQX)U;up&awMsQOG$eZLxcID7rYOz9x1sU!%o_;#I zcRWcaBr`CrA+3!|Dv{f5Trme~>_KJBt(F#5V?N4tR)SL%MbA9&u#Td1BvC2cj|T z&(oCSckQYY>b4F**D$tC8td^GJu~`!oC>ep%OFUT^mrn?I#Lt=(bniBFMt@El$br^2hQ&6{n!I!oOw` z|1U;3NnzX?few+&ngKjZdY!QWNFA5+Cm|VaRO|{OUanbO_?$2LNOTZ~L3$~%^EE5c z`>(B^@E~Cz`hSshdWvzYLT)J`>#n_CHXULv&iboyxPO}J2kEtq6~@!NnWt9K?_Ukj zGrORz0E3c9CL#ioWJec{^-O&{3+JMys)_~wG(x4L2V7Rs`Z*D@L3()R z#CVRr)owgA57v9g6`*+*x_EJK>&ZNGRlO~2ZY9W_!!)eL5afP{7Ja(6BfRrkMXSkK z(IYD48e}^LNr&wvOgaT;o(z&<&6S;&F{ppO-;ZCYgn(p{>X!XT$z7;R{0KzYik=np zh-zydvXo(JRyR;6DhpEoVEGB-@+fH9i)=A$w%87sw)py6IQgbu`7rG9tBgn1%u=vP z<;&tOhek?Mdts<6YHxoyxWt8Pzjj-1C>(PPo7i?NAYfjBRBtrg2t_E6j=~7e0Gt4kx>n6vmb93Bnd}BL5RY@V_7vaeu}8d0~U5n`Q}_($&AddLVPH5K*d; zgvkA6%Vf!1TcuK*CEDVo5WOgA1h4zRu5$;(6a_tqhz*VH>pZ&B&d=8GAbq(kX%Q_R zp!@gz=E%7WYx-4-Z>fz)VFoL=<7T|PH?hWI2_+)p47Y1f9PFt2{PuzMgloHw1pX?# zuMISpkw9IY1m-lXMbT8}^IWdHPEhS?{WkiY1+A#xUq@%wZ(PFY)7<=}U|B4D!W}j| z>C-owuZ}SsRey>FBjk!rOnZ_0<4_;sfN~;vJC9$1aToi8*T<6c3!^*Zh2GUfU1B~| zFn%NunK3E3GDA)!U1B!Mkl7M5yo4ZfY?EhDo}-H{ms2TjfY?uq{qQH(0&-mhd;W<1 zVsVG)BGRJJnD=#HknS6tL+=#9A#8ZOaZRMisKuv(04T61JQFN42|~hE3z5`SIh^;s!mz zJQbB5ui2g&M-Ar?ba6$I_#tw^QE_42X+h#;f8s-r{)jUKB?0&MQZl@7QsJv87uJHr zCFE7CpHd+rN~RWl3p#IX$oX6e+!3})%l!-I8Q1iWeAvkvV#?AQ9+*Y^W1u|jVUo;uc+ z&Ocpgf|UCA(Fi#;wRT5pxp^|BEvr9w?Uc&0Vkj(6V~eG`-D-tV5@dNv*wA;VVoDCJ z&t+X+Ss6s&KwaJ(+IUeCqLOmD)-JiRWQLBMnx=Meth$`GcB7@8+iIjyoyN-o8)KKb z^I&A&Nz%A@1Tr3>5>m<(X^u`~MN36XSxX7wF9o{%vOHH|qBt!jCch=(xj}e*Tr06r zvh2p}clQ_@Bkz}6g$^bugua?2DL?it@jmkGHTB(KT{$lfSR8ep=24DWhyqn%UEvMOTcBcRw?!GuLz`iw^E|nTKD>(Xl%iw~ULGg{zAPPMjI}MVs?0suL6$i{jZmu}avN z4dzMOr@4y@Z(iEwAy5Z&FQebIF_`Ti@c z-nYLxl)TG>jGLZWazu5#al%@LuF7v1-MsEuIxFUOt8nx%GJZ}nNzHR|=X9G{_vq|B zEKRAZ>}eT9=c{>2WwYz-fp0!cKy$@qQpgy{jfXf%DU+0?LAIZSHHmOf0-iA@pt4S2 z7-zDVDsr*C%ztX<<%bGtGXX-1(nPX|8SXJ0HK;TNZ} zvhL~TZphF+v-l?ZxQ8w%xQeN!H)~t_WHx6Hqfps2oFQ$xw^OtDzQzmB>2JDMmr6pH zFO4YaSnc(-6)A08611s#hA%fKw>$-t|GDI9TveEkqHvo=`0acxb~kg!xC9=Etw}U@ z<~fOt{Mdktaaj|5;sn%A6}?vUhG8ml{4U>Fe~X~s)E#FoU6$mIfx$)5NxYV*U8Y3w zC)JJO9qsuSCyBYvMr zY4bVp!$cWNbu1$EA9o}y>jZ((>jr48th3TRAr&`ti4UMFfJZ$7rDT#%xm7h&%;LM#~Pj3@{uU z=S2EFgp~%ub@g{R1ZXe|n5aNVATv`{DF*gM0kKo6tOdp#Kb@f)=lEG?Rt;W0n6qxg z*;ywA*MpE>(j;X}tTY*3mS`wN+PDF`t4#v{pxMQyL|XxzJ`+u%mRyCxp!Dq@gXOK8i6 z;*^cR8kRPt?Z9T#q)COBj@tBD>q`e28Oc0Jj>2=SB?#e(V+rGvHe18fT@|3B#105f|Ktd7bUs1^#KpBn%yK;kKQprjOGPpy;RQ z7##EKJQWHFLiVC5nbKNg%c|?5UKAP26?o$dV!>SO4^`Jy*PtD9(N5Z>P1L+=hcFe> z%~FmniTIAW2~L)Y+zMP#PE2?XP+_Gy2KPb&Qa*f%+)Ki1^GM5crIi|T%O{A=+P>$% zWvrxSPjB4z<(Q@Mgs`~Hg=?4(S=*VHs-o&G_Ab_LoGVAFq#7;e&(|E=muiP5bT3-q zoUID9FpQQ-Ir|s)wa+@clFow`U)h}g5Uh z+Y6$>#$}0}btQ|99%xGMX5*(or`yVu5EDkW3wm`ln)SVoH}Nt&bI@At=;p}7oJmr8 zWhb}6(DXzdXZ{ww8vfV?XH3(R712RU8tGE{gder?f8br1G$bHo%~bR8Vl}6|2qS|8- zKe1yEZhfzBOv|P`w-QHax^=T=hUZNz<vJef@RqKXew6(*LFitBR+yoC6QPBG(>mh^|n0d`Wk3Vm3K0$O>g zhG-U8n}Nl7mW{>0n*pa#1nq2`gaB6ZNwLgs3RWKpQC-SeO-@lm;+*7HN9N6pS#3P8 z`=i4~rk?VOwX=9&NdQfYBtZ^sYe$;Oi02H_aiS6H&qwarnV~~>V|v~W>SXZt-@jZ% zdk%xSq;O&PgR}32t4U-9tVdTxU$n0w@N@V0s@76+1PH$Hb@t3QdmL>DUi9Nt^$k?{ zQ}}2rvYmC|vhi355?MfUZ7)v`^_Pmm`{#}pMa5In@U z1+zy$SiFS)(Ne@9TOb-8F|3z!r(xiTwy@ORM4cE&H#{YBQ^`yudvg_p>V&X+# zQYW>GC&Ft!B=8Frv-a)J;o2lC%F=r@aTM%Z&L@`Q`;Sbt*h*-j7?|$K!!pg}=6m7^ zh~yW{X5cuOtMac5EY5#1p3LLEj%F4@csy zg_RkLO7>BN4H$>7<1c@yGU`f-JrU5OGq)A2)1gI;(VQq32ogk7u!XCJ4H-E#B7ZZh zS-4UA@lyj#y&MSAld6Iz*d2`GDpv>c^}|UrZ3`Z#&eoCo^N*w|$U|r1k$UeDVIpQL z3XGsAz}u}15!S&i+5;mic0-@B)dsa@-=Qf8D1LUaLU5~p4es2pY!XLeW60biilEIP ztp{b}dh;Q2&dyUH%IGD3F`hKLhH_Y_D&nkgP>3VIoUfYcmN1+nv<}*bbk^ZR?~yUo z=SA-wVypGzx68XI8?u;$8>$MbEEANostf#TX!R@rjlYZ)RfiS33Km?;7R3q?K1Njo zuGc>$)0u&e67?xKsKxB@i>kXtDjO-2HdG@g$ONn zR*}%tF#kL!)pw0FTmc>$Xy8pjeQ8-)I-$2dmunp&6-Q;WHm;50qF0F%I80L$xkQ>5 z+=~wX`FKApf~tnuFM8;qujqn2KeuPFvPdcbiEnKgY3L%MniU_#CSnAgC%MG+$N`mw zIeI#n304az5>)T-P@oKz{GyrmOEz)hcsbQx8d!*#4ktQ|KAs#NMwWbM7qB|wbe~r(lT}6<=-2NcNQW(#h&qm?@NVVh z=xk2WFL_5ASaVtm5^)TOi#m_PI?p4BxHc`$Mwmy7m{rMy)!4`0vvkN?yU4%ZAQ5EQ z5uwvCSgQ6|hFdR-@IeBJ*dvd6{RLJw-(ChRMHOF zo*cc(9%v*@^_2tTeoo(h_SMW4nxu%r3FM`DO#%w`dm9#1;Khy-;GE0L-bxId$^Tc1_+YTT*{l~AD;+HLI0H$|EFER==eXka^ z=}@~?O>%E5;B&Ai>Z#>Vd~Y+Li@=wl)fxVCHpuHn8-;T4t!3+j`aEo1(-w&PxDT+g z<3Dd(3@JURjFQ>=2Yy{Mb?OgG05?FG9yPQ*HTmzvx-|-Cu!kls^t#qH0x%2rKuZYP z)9*cOyB*Vwai}*XE3qe>dl2JnFcS0jwOsj^M0P%CrTWgqwBCiL0?4%uq`aVP|_18Mp&xkhD=F{*0D6 zzRgau6qW>FrfnGtD-N|Mv69gN9i|;Ike$$l4gdilGq8sB+JiCy%+V_JV0C9Ebg=^J zQ8S0PJwZ|EpQ!>OP&J3P?Lk#&TgJj3cFjpj2O&saRSCHd`-csm2TVbO0HTE6*4Gij zBvo)+r~pIS?A{wd=%R1xkZv0S#$YWVm=<*mH-e8j02A~9fR1YEsGo2=`UfRo2S7Zq zr#Tzb8|qqt2#mTvY|xlGqRSkBfJ$j#OCN9mI7NL%tuV4x=cI=7LX9-04dO!zcmX8S zvL^8ApL1iTUsz>@&Q^o_BtvP);*-q z-GflFX9BsJ&tU(Nt}CEv^jAEmxRmX?w^5Slg3fSu+DZFE#Q^-brXK@d5~mz-Hc*M; ztx5>2$n#2aW@*~lf#4{1R z55Y&=R+8)OKpo*UmBj67oo65AYTCGc=)?a***m~^5=HC2)3$Bfwr$(CF>UMLwr$(p z)3$Bf?wNMqKKGuNymOLw^G>p|E2->MrBcbxUTd%4_wg=S3lL6XJ)Mr&Ft&&rDgKW?OsPS%c(H;);)of7N%FdzQ80xj!@i)6g4*BogN z!qmum5i&*&N(UV&9$~Q^9kI6V4*Y7J+ckgdO8Bz3Rsp|3ZJU4EwIg{$GehcEkxcz{ z8VpUbC{GtoS{~}EDdb%b{ibr+poqZb2qa|>g4!pZ4u&BFrVAUjhs=pYU!tEDh)^4_ zxGx>4P)k0=2I>#7I(WNp-wywyQZ24k$vSM4f>Lf}Lc^q61~nWW31h!U(g90+Ydr zol8unVwoNA+8*0VHpW>qBZLA7!s?kdZXYw(q#{inO{b+eDJ5@>gy0A)MP4lo9>>uk zBnxK)Ai|4p4S72>rpQ?!84@HsQsy*{THWRa__?x!$M0ASCJp^nVFbzzqq@sBrPw6x zGcWt$0J?|ed83DwTvJgiRcLK)&{7vUbKVTd*x2Q*uSN_%&l7RS`!{emnt`WlN{p*K zER{>!@kTn>$ePre)67nPs!59K^#(IyTrkd?65(?_fR(O#ZpVi1P{ z%05l~hD4eNmqPnkFh8eO47{@3gqA6~FBzhh0T8I5l@+We{#ERd*n3WuR;^*Qg-qYA z!ynvMI8m=GRN7*ZuQ7&vlqbE-CTeU^+-RFaFeP;LY;9`11}m{Pm5&?AQ^3nLt<*Pi zb7|l^VIOnhLJZ)4bW#fF=CX85LENp0p6DR@a^#L{&}&cmpRQ5cn){%PBzG)sb}NhR zg7%#?VEx=}x`sHqS?K1f1d}`@@EuMF=y;Ldw@&gVb^0>?=rzx6`DjWE`mMz^)zoyy zKVc|BOn~P@aOX3O2*Ho2sNM$6r^6;uYGesjXmgbcv87Bhf?QBKSrL;ckXXYSQn#?{VS<*D)k4S-PN@#bRJn;$vl=UNl`t!>13L;!BeUg zY6LORhuyc?_Ptm~jdW!P(>hl(-BD6|cgG;i{G#0zWqEf(S+O&Ug7on-FGC8){gUcV zpNmRIXjz%_&*wW;qN7ay0FSr2_3_aorj$cej95{Ixy zv=fQuDqfnfX$QDeJ746FtwNo!59MKve_5dv75|`rTX#f{FVF(54_{@ogEgo**|kV5 zdt%Z<-z(k!ZNASw2=^krkU7t0yXFfqVG#($dyVr6z#m>V_1(Nbx?sPb*Z0$JfMVXd z;MYwEGhumjr(schAT=FHRVy zM9mtZif6E6S{0Wx8E8rHz+$qCKlh4xlD{4jqWjuDFbpEYB;lb*RGfiEiZo)dj8|lL zMVhEe2ys4JMVW8_1Vu?vro}7LlNIQS)9OnJcW_t!%#fi>&eFlv74_BZ8X32vo4%Iy zuO$`WS}pc#W0vV#nMvLZ`Db1foh39%7cZz}1->JCe?QF#>j0y4;KV+ESe>(ER7|Sq zO6>Tlgv|La3A!Tz$}b3NPX^qE6u1fK%aIV;*rfbV+9?!XbJF*YH4CoO#o;78Ix zD^K#kj;<8r<1vUc5aI_yq*o-QS0QP5A;6JdL zuA9-I^Rv2Fv(50Q!JoRuev5b%nfjgPp|~>AH^=y>7iEwEV+jK(0aSly6c`4^jgG0g zH^$Y+oFT%@wbS`)V!Z~H&^An!g+w~#RSD*W%1Eajs`P}iD+OSBdteHWWD=gPAUt`(;Y28~O%mgxP9c{x1W>`5d4go^6Ur9&r03`X8+)Uy~V4r2(6 zW@anM)XcV!=QW{0iq5f(hl|8XRVavusKdX?5+^GNtOARQL#TpBXk4;@w3l!&M@Z{y ztvQ-?Vrg;1i7bI5!7;nizjama5naQgxCQX8GmHYW4TVK@6QVvZO~SRTP!ckKRk*=N zx|7o>!)0#kCGIs^oCIkhcafY_sv|-#ITSqOnIN^Fyge^pLOWSaW=$C>v!@M9z7Pr{@W^B(V|Yq7ngKIU2;0o_UM>3!d&ktzD)Y{GW1%TsKh7f!i9{7Zk+M=3TT0hCbqL|Kx$Mhn&x^ zTR`w##tUT64;|Y5g1b13v8Lh^oN=IoOWZTad(Rh(F0jXWPmnEp%z96v9wE{${1Gh& zy@wUq_lOGi^EW&y3J+UU_3Jq6Lr*qKhYs%s+fC)sUa#*ycWTQgaarDPzT&0Sm zNHFPK&0<&#e6tYEl4#Vb6s8{+6{Twig?2NXF-tzXO!7*p&0h?PYs}fodSJb!Ybq;y zW|CpRl@;v}tr=_^G0S&}Q*Um}!5ylLRub(m#nFxeDVt*_xy}SrsP*D``-t$-jHA{Ny$`)|(v~t#)N= z`*n?AhTIxkUGB5WPk4!@vT2fv(jR>`vnM0SZ37)@z*=>fRz=StCWW^R_2*#Bk22&L z<9zq*OR8st&g*#BwhQa+p;ias9Hs^sw5eqHWVTA9Fp;9W4No1 z&nP6UaXnQvxCE?uMy`2gu6c&7d8V#;5>fNu_yO@?$K;^;lmT&l_}A_C+8LE@b!#&1 zVitCIP&91^{MKfe5x@U7$&?Pq`c)Rr6WS(X?yPA`=-+6Xz_{Fr=a%VLqV_>S3sB`J zKm3#$Bdb_M4_n;YlsESSDJE;}}aDfy;>d-m^G_*QcW!vBwpiqpG2bP_jn-+(-pVL3!HR=zZ5%7ZW) zzVb5Y1Pd~efn1=JwYH?YzGahvA&B`WS#?;V4t(6rIef5kL$~WaS zo64jPA%JBLS6WcY>%2pKMLKm@W4p9C`NUn3HG~w@8V%A7=gxEUr1ABJ{ocO*mCxE8C%JGCCtdhk+AKpv_|#dHQ7nAa5cGQFGrtlcKx7;G z{(@anwM``QjWDNF{jB6Bi0Hz;k@;G&oF9~B>5pP5KQu*U+@SUIFV-rB0kDfjN5C7c zt&%~I_fl^^`!m{F$rm2JxXL%1?Ugd2chw7J(FNUA` zu0(-ffRk!zIe~Ge7ovA1ff0EM$dUr1%qObL(k!FGC$2=f!5-zaOm?APOw*EsW9(aw zYL{>FO~M1{a_kG+q6u1*88z+L@k~5az3>E=8hIZz>49m+FPr3K`DCbid8o7dbje6- z!Hkq&JbS-P$3WMBW<`j}`Y`5ATxR=0e=)DVy&e2gl2J$KfnJ_ruF&$V*0knX(Xc4n zcU@@`{c7)5$=RlEZHw&M($0F}^bi=6P7OOeUd3U#4lnz+9|SyT*BsgVU_=PEi9oUq zuU?_CyrF&%9_svnlQ)HU^uw%8wj2UGJNuvXb%3vf!{{L-)t-uJSDY_=5H=cj{lw;437ONCRg zu2^3z z-yd$48y%!qy+>BA1k|fg#|s6XySvV7N{s#Ge)YDq@lMlrdWO3`JLVZtkkK|Y`D;%W zcl(?vop5bzUzIp)@7&d%R5>V~k}z&P`fzc50B?`oBE!2t{`dZ$TpW0pVvE`p-DE+x zB{vp{bpBrvhPDZ&S5?ppVHw%O-=@AB4Xxa9NYYs^#e$PgHeD%L!05{1x;-MgSxw7d zcoQhM+?rh_)*tk!RSUS;GEC)Y2zK_8KULTL{qGhq?yL|()=s}5UtTrtU z&ZMI4Jw@2H#qR!!R(nTr8YYN9Z5AjWI?k3wLNy(PjE!?fVICOh78l{fRZGCaTRlv6 zcP$3z$6{!ag{dqDW=A?^M+jy|GG<3MW=9ZaM zdo(2U(H~s_r7kAYSgA$~g~r2lQkHGlu5KPgvH*2L-GZA4uG!2e1+AtX+fYLk_$1Zh z-_q10>jp@u;$29|SZ%E_e+_xA`-7Vyc&re#iQ?ox_IEtO%~1x4kA$6Gs?DZ2F;4lq z`&0>1z1F<>bfQjNrkzzP^-^j}`;_aqCm=yDuk&6Bv))6_@_Z=Tb+B*>gOhm94Vg(d zKQQ7MAnXLrHh?5oazjwBsT^%)kP494{%NiBE@lPxn`h=;|tQmxx{xWCRebOBj zb-~!a>Kb02f)x|v6#H@S%T(mqYuYU%pWV{D?!-G8xOqC94W3rZ^^&Etxxx912n;7M z-K^+RiG4*DYx{{Y_gsF7oXOR@BdT7TY&{{=g;G(g_n6&+8X0xiaX zjk{w5Amqix+=%o>*z>`w<~aZ61M)ft%qb`Y^?NZNol!CBE5u3v3oCcM9mc4hjIO`^ zOX;ILFjLFV*?RkzmgAABeleE$54zDC({|<;h}37)$`cX6s#sw+X=~hNb%j8IU)(|7 zbj5OvYlI5a^+;?rt;!!PFH>udNBG&&?M&j|mpgyvRa%l`Rbz0af-@@6z*yKs%&o&x zD(*3siRNo^%41-pmRP@L^vSKQa)kG5Z?oAlGAdBNl+DHOsVvMw(LPSJo@<=){D&d2$ab$AQ^}aC&XXw5@87 zHuvqV^CQO#qSTLe)ojD68VHeK66*=qI~OS>-6>SE5*rw2C(M$zq{s(kv69lmP=7|gD)e{ZS9 zIT>S+3O$4JPoN4TUodN}3=%0G0~HPSNRV8=2z4D(C|*l%QUm!iHLC*WwK1!Le~C{- zp%9w~_ap+Eyt5tn#ON9AZ??zf-sh4n_1FOXF=Ut`fj(%6Z}w!GJ{_PLTcjiE$_Sw7 zE4kxdMs9$m4-ylVL7oYQDaf=Q_kgDj3S~8b_M>6hUL2qMFg)%C|1v%94s#rjPJb|b z53L>_7C#s$c8QWZg-a%xR5L;(b!SrHkOIN!2Nq|ph3GN^5;&?my~m@8uc$xR<9nEh zU0Ai44C?hexB5(vgoXV6s!+pP0$v68hgw|xl0)OzS*nD!4_piqfWNT%?vBK9uvB|% z={wj{0C;KlHZ$Y2HB*CV8!F#vi1O7C7-qy|>7;zo%?X729}CCGf9Yw!ke=SnGM%mO z5f~r4NtysvK%9m5ReZx*q4u}Kg%pGZAcX;&z@e4mU?*d9t73zDz(Qmj5A|aYLRsM4 z*Uvlln~4K&8IlfMiz9!`ONQZzLtilq*UkQ0Ti6EqZYezByDNfS&p}1_E}HzE!*a(b zv%ps!f3JIP+6Qq2axPja-Y`0l ze?$}0GCH__yCDLiP6f}bUU+Wa3p};ojg?xDdpHlOS9j4Mt$+0el|_iV=%qu zbc_9-&9udIXAadQT<5O7Cy^dG)LIQHlxDictNH`6%2@-L7wweE?gYX^4S_}wJ#O2P z7XKFRR!~~H>5H5}PbB;A(K>Nx_&7mnn7g?*4>3a46j6HioE(uw( zJ++(k+Ll20>_T(&nAQ0cnsgMnMLJ9A7K*lHrPMT=aY_owf@P^`fPf;1;;SVmyRG0Py`BCIf+vVPG+*L0(7pvRad!wM(%YSx)RmYByq z=R=?Nfp)}N4)%eX5iwI9`mpe5nSHB6Xpi}J=Cy!_S(^%5jf7V zwV>A#InMERGz;uDBY+c+I@a$4=prx;?0N3bD=To0){`58`|71z## z)2+IWGFk>r#6RgF{Z1%KTb9i&rPbV9AoEIE%sici+wPKH7 zcrDM-!Ra=In^p()R4W*c^|3Cnx#xWwfPUH%4C;x?SnZUxGCluJ< zRGJ%ox&)hSX@@^jg^()eul5^t15u3#5N>;*ykR@^BOcm03*HJB-1AQ{^9MK|ifEeR zhN#5E?YSPJywu!dZJGNZIn#KA+X>#r7m8_RQNxvk*oP3mKF*=Gr$)aRA{%n+igE2@ z<@g`cU%;HE$^ADs9E8Q;`n4!jT@nYjmj!uxaW7|A&|x}~h;RXgqCW}N)p zt8o6iZ#|p!c%9&m)60+}XMUCYhl{JAw3+tEDN(jq+NB2O-<9sGog5FlYM0uCS7NKX z{2x5uhzZ#-$EVPqSiktoGlbAsAjU-|L}|QWVV_OntP3$lt=t^pGdPBEoJU<~BR5YY z9ch5w3qnzdbD^$FPov_5xZ$5{3N#$Y7G<#5@Bf$g+J9gbvJoH{tv^_W!H=oq|IN_x z|DzxOzksbd%5n}UOo+bZR;^mXz4-;94@&Tqa$xGAf|9C#P^sh9&xy*F<7P&raqX^B zRso6rU}e&T_aHAy5e+!RVyqCH)u+>08K)NB{$Fo@LHdw#nUb*~Fkn+mN>X?VR4H+%2Dy5nMIyw=x?pq$j&N_ilBrJ2E)FIhl4Vuih#n>X8eO zi6ZN<3nuDwLIz{9Ctf6!o^sAiAMgfmq)LHdhrI; zjg=GhAgg@%NiL&~Sie=uTh$a`I2uC^Td~$vb1P(x2`)_m`|zLHrp!LD2$bGvi1iEI z12e0Nexf$ANS680AiU(NUG~I&QN%gW{}iEtPf>jxo_SX25$fvSLlcz|D?$oZh4THj zSyArFL*Oa}GNQcAljiXEnTN4+!Fhg;YCybRaQ-XnT&n}kOa%SwR~y<-qvHPnv-uCM z=KsJMDH_*0s-tM%(~b3$&T69l<>l$3x|)Vyg{9(3LFtAVs-nrFNxEw^)%3s5Zwf8n zexSq+)@hqX)kB*WqE<~g)~YaeayyfSCzVYK-#3gSsjMfN-e(aLf0tWFt<;jZi@}Tx z7K@XQnai!ur^|mk5Qenl+mj3*#Uoumii7kysLK_kyyF zN!p$q(`^?U|)hh9Iu&1c^r4I z<6dbj$`?^okUq7~BcY@pPw99~Yi?OCpzw0YIeP|Y*h<-M$PmtO3&o4OVlgn;8pd?b zRh>X_u?+&Q6HEz!uvB%c#DOQz*^04>Q=MM3ZDVn|NJRen*f8TWc`y4owhiaamr-Z~ zD%U#r!tttgM{2A;F?zOF>83?|1d|}FLqj$;&L0yxp%H1{mmTl z8#mO2mNlU~KeBeC-N9Lcc*^A`St}cTH#rH+UqWljp~U_jD=}XpO_E73J6-O^!I5mnX^1H)w6CJ`EH- zB5d;o6yqyYK26D#le$p66EnLcG4b$rV9@t`FB$ZF{42s&^;SF-nhQ3=U-D8s75W45 z&$E6j7!9A*v#%>kI792MPqfsRCgXQ#qXlr=Nl4?#z>A#Ky5LFmT(M@74oW8q$AchY z*UEBIKZjzc4{{QHEcQcLWDeoudCW>4>za8p~CyFWmD$GD{vP~>aEh+M6jiqW& zG-0Jo>nyAEXAnbCf3&61BfBr#1v=_p5V)M1zRGr`y*X$!3hQO=7gjg=ecMItaK;Qc0cQU=rpW<4E~Q*|wsD;Eoe%`~9eV6lZ$U;&MDD!s$H5 z!)p><_v#Tg@0v*&Bp(V9a-7$xIJoakr1TSx;0WCJ;z`5FJjD|&$X)|U1(J^>5_uWM zs}es%6IXrC5+m`4nWSRhBYtMhN%ky!MwUlxj#kletK%CMY+c1)#GR3s^f7z4l82Q7Yh8pwvsJZsg>C%{w zi=G4qHpG0?Bgd^HLsM>`qv?I)zV&VhECv0pV!wpEQ~%C=cYh2H^1V$QG--#|0zozT8` z5>$sZ-9ac+*#u6Cr&=G+R+fLH!{a-0KR@c2XTuwF5jamtCN{{Vzon8VwB(^N`1@KF z_sE+Cp)F#GR{0WH{5+wYrFaNYxGoaW>zp_7WYSttr3I*QT8tLPZOY!6vB|a7 zD)-Rq7YuFiMU0AWcpRYR{Gn0Vy$p_5E4|_kO*D>ZMQPcFQ$>J$lRw=ph`#A!CKH_M zhIOGuQ!Dw79$KHn>W0wkIMR2ZN`8fN8{T0}7~~3LCk4vJG0w_8qFe%@1_l#%4~m)l zukz$aMOa{4-w`exqx4@5SnKqNU68YrIToTednTx{#x@!Wm)JXhB2_qm35-vf#y1z# zl1=XAcOZQNa%xhjx>wc38YlRoQ5al22`%NBD;-e zC0m@&ax&tt*CaPF(*u0+Iyxu6iuW)3$4rz-}GyzGPp(?Dmw3Cmx zUAtLpp++P7bZ=k0vNyM*khvpZxFcedT-U7)u`ap&+PV9qRAeg&rw7w`(d#Hf4T*AI zOcwUm<%B__>2_V|d`(=FMd%DN^#O2(w0?ib>s^>_JKpU@)mm#*?iW=*#LqIP5MxV2 z61P*mFN8zzlreNu(9)qI?MuqYq_&qph z^PAmbsb8e=5Gqi{KbsJqDgY@z$Fa2W=Rsebs@{VYd<84^5)Lse=CAN5UgDJlL0GSo z{)`vIS1O9Vg&|jvc(rV_IAu2C)QB-LI1fBJzPnf*4tQ?mj;8_Z(39x8Y*42i9W*w}+`f+ekI2I7(%^C5ExXc}>EfX5D%+P*19-QS zc>8EAv*`+iWfYxVP&>OMbVkx}n2M`6Y%r+BYFH*ru{R*$BMCQHl5EIXIf!KhSIU|d zWTQ1)wv)5oTfMXj-*I|2n$SWQlRy>|<+m}&1J_6W!l(F!2P67h`%vrXm!@e&&WpS3 z= zHN4}Izta(NZg6BP&CgYjWFIB8AYQnoE}pFn_p>5|SqO+}UXE0SzLf=k;|=T)%x6G4 zo75!Mmx@|ZhB#AB5h)4Tw0w?s@&H5c2HYPi{8Ho6XeWt*k10&LzQ(xVIqK$_g04u3 zQtp~;VTwJK?;D)B1B13v#@vx#&E*1o{2Fa*C2-oN=JUIpP4;r(T|1uAjySANNP_)K zMT=ghL^hMJpFK?N1b;c^F9}=5C2-_ZQ$0F3Mek>5(y{!h>$7@Q9G?gG(O*bw+0seK zSk@?6?6~5VS%({lR?A0mxyzTB;CXA<*&eNR01Z^KfM3bAviz`lr*b(&@b%vk5WOpB zrSYHSgYm~v{{LqF{NEFh{{wP6yZk>UTq&yC|KTS8t=DKY*oYSK$=F){0#p!KEk>EL zGWReaL>d4Wl#lm^^mk%R)^>Xrq1y-+fse}w1Oc~*#oI~)ziX+RYadd}Vbsivgx2gf zZ3ZBK1cB>c_U>y=)9K;K*Ym&GUZC~>9i}1UITH{5uqLMLr~;la49q@6slT(}&Rp>} zu(Z>2UO(p=0wUl*NcyzQlwf7rCW=w59J5tHoCis8_MWhIWc#PStIaa76cbyMT(z3c z{OIhj+%!H(IOuIMBLiMys6QU^0@O%?I6YROiiq}pSACyniIm@8wz5WUA49zgKz5`9VVKms9UU| zx{lJUAl>J@vgleba5H0@^o=lGw-Wnpx)ssIGrH79d+f%N!>ry1S~|?uQZ0@`PVW=* zJ795#>pEsiwNPt?T-Zxb9-p-k@WOj`y_?C=s5gqFn43LVeTEsbawAo!<*PW04!F>u z(CR8ZI}B8+wK-kiR3)bOP`T z9}fQEhY_R_dP3e4Hj=xLCpAfs*>zSVw=lf=XQX|-zrUk!N-o?ZZ@7|{a01DVN;O|b z945x5-IorHxbj9#Dt8qYfjCIH=!!t2V1qlVMN+{9rzab0M`FQQ>8{>!+e_ZJiZe{J zQIQwtYlvmIM!Mb~$mz&TZeTW#?52Ie;b|?RKjJLA?bF}8$&8rh0Jo)f*huq$wsbe` zqYt?)BA@jmE{_<_fnXFQWfFG?ui&^YEQX!E>P`77NW-j1TDt;&DmvodCY7#AnZ^k7 zhxm>m1|!$kLE4dBNs%^%!&G&7{Fasa1kCUiYaAxzIl5rn@=9G3Zibfq6VZg)=Yy>+ zJ)oPQM|VLmgugO0qRosL(Q%L89FhFzJ{A||LzblIUhj&5RXF2d!g|*lwgYh{BYG~9 zbNCMlf!8{S_;Ddkk$9o48yQOYmj92)xSQ~yY$4RKQ_-`WYf`uL3R|;DVk=LKOM9UH z)I#$KV=OIs{2(m4BTAH}c!9Z?QgBWTR$iM*Np;p@XUqYD? z#MBMH0AMnyw(*98vA+8~4VT3$s?d!-yPw(bJAD7PIeK|tZy-vl|u#$``rYK)WSluh-ly&SYx|{8=*z6pGulFQp z`DxN7Wq>W?ud;Jp>sG9z)Y3TQX=!k%iD|?XGgn;lR$PdvGt;o+ZAU&v7iEA}u0t^6 z<{qIBj`JC?R$Vfw6h*W!RCpmc+S%od=2++|WGr>mRu`RnrpX9)QN-TW;Xu_CRaND? zVKnCkt?0~!l}mJDX*}aTLkBx>-PjLpFxE6zF19MMO=E4y(NvUUvE?2}OSdeP-ggqS zE9oMKRnmmn(;(SzS|_S-%<>`RHB8CT_0xsgt6>3VhHP`?(p?sf!e&5@haSX9r9w)g zt=F@)rx3>~u&kl=%tvwpkcFz2+-FeCHXBAFP=>RU#nDo^f+`5gJ~*#Ou>`O`Jci@M z1-L&HKh8`c!=g5KXB}xjwqWwlLhruG<+WO-_Yb;mF>VheU7|FgX8RuX?~8dqpT=Un zULEv}I4{xexEsbn&V1D$1LI}r9+~M0DGy2Y;{tx~}l`&3(Au9Q{g!U2T4UFe<9GOVh$q4n(|& zTTgcGCJ_YPq)2b6`gfSX`KrwIPX5WaXcGiB0Rc9mAW7xCsLQ&r3b){@JJhpl44kW8 z4kpnoWf)T|X00*4il!K-RU@wMD4*=1-qeBb)V_$ezz8t^Ae>JunGZnc1$=U?AVMpV-7qin52iNwP-Lu8`BgKX^} zQQXn-!I1)Ak{yQGf8PkX#eiU~{ZwL&el|nG|Gz754t7RX_KMC9t_~&+wqhP8W{$2_ z4)*`41eW-}>#<=5WpW@{@nOQ!RA6tRl5L7nENb*rDS}F1%||!()kDj*c%iF z^19_ifh-3YPQuX~RfwWq2h8|!7P+3k&HX>#-r)LRY#FCmTe)Ffx}>X`$NP2|QAwCw z6OE2Vvm;q*#R^^H2uw$-nk3i4IwzN&#h_WCPLVw?P;(uDEEU)iSE$so8KgfzkVb;uRmZfWBhsEUJS@2d~Nt6 z4>ipd_LCEBUeHkcx;u1)0=xpKZ#*{gs{re{f z^i$q|;iinEo{>QcP~ z4)JYrt5CP0Q9tLp{gV+giUaq8#{cC#<9V9{IE$at{%T=%4Fuz z{9#gKB8R!{eR?92NbzDjb3gOV#T1Q<)}%D(WE9q8*Sl(VzA;#T>MhD}?(HMsVy{)$ zXXEId+6V1pl)`^#IO8^pcZ*`z_7%<8@#wPC#E}v=5`)PF>V^hM{ZKj)6fmewj$m>3 z&Q&Xbh=~pva!??-W}q_S!!nEmyEz9XX2<90f;W9n{kAm_3)8;`H2~ z{zMO>E>;L6Oyl3=$dnr?piA2$Z%^_}Z1(be_p!WRR|OLWa)7?PUD%nmxyxGXp}wM! zhadf*TWJnjRf~sjjG?1Oig*+t6f?)jPSrWZr@P$G>5z^tr#9hACX+o=1u|4xQ`A`<} z0a0~9pKh)$CArk7T*gjvxtu4Of?=tDYj6DsK`lM53Kxs!FiEQevlUSI<)z!nIDs%5 z&}*SsMO?TwG=*a{WL7rIV4z}Mk8h&#cc5$=J0=c41AelcVFJX_YpBVFyHnNl8q)k~ zfd#3y-dWw_BRks6orDd^zGo$58Z`vb#Ur4HOvU{ z^L(XYV_MY=K@6BT!d(SgJ~h=vMrGzx^DML_PhU+dNUD}>>ol!N>w3{fk7l7?V8AaP zZR3;=x)H0H_2Wo3h7`>vWvBYWmCW|aR|1>d?*{Y#ePN>eE=hS(Gp9CCo zJ%Jb|xruv#%zjO6Pd{W4p4!2#t3fGgjdf85NF)v)WDcfe=u*llxhw(h<&$}wN>EU; z+cy9<+36=Cy8vklPTO$hNA8Yvo0cU_1lub$FY4D}ytlMm@y_P%T>#YJrw>H~zK=F+ zq@Oe`2o2zPKdXAlL$=~?QjN23PQvbIaSc=FrMlBB7t;q61V+U z=CN{Z8D)9r0&GW8P`Ba&t}Z6|eUyPzz$#$okh(N`Vu3hBf!KlCfnvbEj%7HXVD!l8 zRE~VkTW68F9OnDD9EHG6fnI^@z%HOCFuKva9L8r?BgWaM;&?N^O=|mi11~|*AwlPc zW3s@)_BiZy1G=``p=iwVy|*v}ytgR_eC?k`KJ8^kZ@10>YW7dal&I;k%l5i~5JRs* zf#J-KJS&jA#CPR=CctqpyhL{pffQi5$eJ{F&3!Du{-~N1ch!Oep=4`&1Ilnah%bGi zI-;Fm4$$3XcLgwQ#((<216M)yF+4UyH}862CWl_#c`53Z@`d(112I6^p={ATv<##A z^1xc5ZBf?f?_&G9fc@R};kzmC68rK%^_`457&T)xzt|mF^~0 zj7D{{$cXIkoxN>L7&dPiXrUzQP%0nSW$eX;iLS=je-d7haZRq?yePV@5!A&=x8GY6 z$HFdy&Syx`?;CJy)k`A(G-11{Y*uvMEI*5R=~T6`d3o2|aELg(pI@W?!7FdeE+V`r zpXfdC|I9k?J@LoDdg7-z(-TbGwB-t>8#OY+d(rCm`l#u9qjiV6!dRoLSJ;d16AAi?g367h_ffjR^ig_(v0a-6LcZ@Taz2jSj7!#=_Rm6^0UA7Lv0uVX;ncm zznQ;3vV|?2P21RwR{Z;GXh%9WjOQr2F>BUZpT8S1b4c}LhbB`z@UuXl*2oG+iHP{* z0q07jhT&eznWB1a3PmHFk>5`mRfrKBlEQi>yVf2Jf?NGnSwg85)SLf_Bm;O{4Jf=|y- zHNw|FuZ2~E(`F@an}hV|$N4+ZYliFbIdjBUjhRf6ul#k$j|O6otGQk{gefswys2h~ zX<|Oz$3B{(nd^DZ=gS%8Yyfk95nVZ~9LdI5F zoRevaXJ`Fc8~@f>l}NqoM+e(Y6z zTq~h-t?x6pP}B3g?*o_J1FfQy){4K_ZQ-%!GW4j@ahO);&zTO)z`-)y8oROjX*j6nA4rzjBZ-qoK7ZqPNXrlBs5zIJy#@~M!a!FzNsC% z(`ltA)~B}Eo;OQ;W*Tud6vTkSZc1pMYYPm*O@95Y*tUdfb18XxP-N3%$*h}QNS}<( zzxRY`d#bomC4nQOTg&Ug3x<<~8HKZT&01*~h&{DCaU4fd>P}>L#hsq>_bEcXw^`HI zr5cMS|3SOPw88THg<6wFN{PT}Ej5Y-ZJAZ$`@aoB_`1=AzTXu>Ir?!df#1ch!$fY9Ew@Q4x>|`>*!r$hYy_U1OoA{I{o%q zQf=;;St2ejUlCaSW+gxmK z31A}Qkw~VaoIBSQ$$^Mwg}K^BL@gu669dfFQ9M*QzkiNBCf~a#G}EkrFBi{*+1gOXQm^(G|Ac35rdW$7QL8!j$k;0^x^&UNt+;qo zva~BrUz@%BTBhZ4WN0m5kdfz|dFIsOOTcOOVo+5$vg0(Ew#3*u){(3vLdh$!9bF^W z${nxD-}I=J+T2UNZZ!8Bw2DABcl79`SIgz%%E91?&mnyYhvvSD7HIDKk z(MlFLi}Is4t3W>C)Pr1$zaD9sS*7B#JzXoO|E|jLv#(KRYpcamZIRXE$+yOmyVuq3 z{v&tq1sQsDy0US~Czn?vvO>skPGaE}>mEr_-ja^4LrLKlbjwYYDi_s4;#*CkU5y4c zVUKo~I)8Jkj=eEYWV#KEoOi(Acyz}{hS}K!2=jd8s>`?*g zYeia{FQYW_$^@VvW$grBW`#Dwo_=OWhq1)9FTB?^Ira#s9TLwBm}W)NIj6ode5F*| zW66|-&lJvJO|dz%z8G*es7(|)Dr2rJ2B;3N{F*lQM3O5bQRDZv1VU|lF?-V3U7aYALGvUn)h#If~DmcdkRN5a|W#)dlx z*BUUA$!Bw2VL|texXgng^%~j6EA)?z4@S?pw>>^YGv`G+e(oFw5{)>H(WSjCl?L=JGp zj=XLvZQ9C}uq{rklQGuHDq4CWO3y~tI4XH0r$X#91-N2D_KX8`=Y@^I=8Tz@9(V0Z z7SAV-={`PeJCHg@0C43+NQ={MHC2cqqDA@H$(U!e$ACx@7&68*tRj}qMCm!UGyjPH zFVfB`sFEm1(~Y}3T-@E=p>cP2ch{zI*T&u5-QC@xak#iUG!Dze&Thoa(`@Wx)k{Uy zIZ>H;^3VSx8I_Hg;@rvTh9tp+yTG);B?)@0#>6DIJyDlx(3tX$;hbBrhiyf z`s|c94>U3K(Q6JXkByQhy#u8_3AG|34%oo4MY|4SxN-Z{tt8B)v=$KMjiM6zKm}Ew zz=AtPYNUQBfS>3LN*n?IXW2XX=LumR@X6kNvhF5GQ@+eOgir8RyOB3r6>kwI3TqBygMVL0RWHhQ3P)q~H9At{vM|Y7!wIvh(<~D&@LPOF- zsBRM)vgwM- z9P5!5>To}}g7aHVu4hahv9B}-f!{lwDF`{2P;yntUdz&QFRov-X0Qx+AIK^ObjS*t_#q!= z$M+^{5kQ|?vePdKB+8xRY`H$_SM4+fp75Zdu*_6&s1&BllzzB3Cd+Adclae63vg4D zMifSw>P4$Ju!fO1G=4}z(DzbJTdsE`Hp@a0KlW&}SX`CTn_9LEgEwrQznSSM90BxO zt#wu>5GR-Jw<)S~=vQkCH-2|yD-`r_<5`i!h9HRqyvjszxfAkU2<*%QfgMMl`}PA0 zs7`P3ssWH5zu*4mQ7s_CukAw3Y^M`YU(gRpz#VQmSu|+VT$9qC#XFHo{iN2w`bQy}`_g@#|km~jH#8apQi&?#VvF0_M5Ssoo7bLGn7D0Ov<>9&rH)(Is zxk#C6J!HZOG169cC~v4dRj7Js(R=C9d-Z|LH{t=4hB81{Pa{hKdbXX4IiE_=`z^GL zSrkveds`o)e=c$xtgkW<#xbrh5s07fO#!hDr%!Pc1!M=k2CIe3p7rlz3^;~;XW^o} zp#?&K_JZhB-(&(YKzkvske`Xz?@EUq(EKdw@X?W$-?kOIu|m$e`Bbl8IHz|4zKFJg zD}8t(AK9S2ussGqkA4}E`yH&;9s=0k21uc2PePW0Q4T!U;=XEKEh03{1;>2bizs|K zs9hSxldc_l1qLTKW;_^L9s%0Dr7Cck?~)eTL1gqoEA8ig{TOPbh_c=5L*h#3YfbEB z%(Ej)=Cdtj2sw6Yc>EhBGj|sx>}PB8%^`NYdK%=ElDwCt**)x+uBvKGhT7_89L-LG zi}3-p55?L~VA*dm0t1i?imq?u7so6gv3`WcwFV{*q;1^q79^26i-DO1d+v0>deItY z-1-^Go-u#-LeBa(S|HdPPN}Y5nQ@Euv44T?j7V*cE^-aBhV#kf4&)TLlwEkeB6_DY z5N(LPf>FLBuuO|>tDiKM2^xLok>4ijSMpxv94vSHu3_-FjPqjZTL*p5AE8x3%n^_s z^ka3EIebC<*C;|s^!f1eebBdw`{M`4|MYi z3Hl>PgfKG3afE@QkJ!RIWQd0a9~;0n*1`m;!hFU47LWV+YGI+=s6PIiYtwm~oO|_diDfRx6Yc6` zDq&foLg5A11Rh?<*?~tdvhHCF)ETavZCD8RWGOMPX`EyslNzn$HoD9Z3%l+gC*cn} zgh$?M+j2YmRZ&<6YJEq}%XQ!5zo8x78}wa9Pgi=K7_R*~?#*mB1$mdvojSNWo{~z` za_HF}d8d{KHIi<82`A;-iBiL;{CMs7`Kyu!25j@wVw5rG(Polo7lJ-q83lUTVCj|_ zI(kX-Ze;6jRr3EZ6gmrTEgjhUlV>(g|7jjUGm7tQ5Jubw&i=&xg*vXrSq+^>{1Ev$e3ZL5({*8NUJfTA)>tsk&&%!h8#RBS`Q&7cE#oQ? zcg-W4I{a$sGo@PMGvU-+u4ml~WQg146bZk0 zM|Giq7W$|VjiWj>ZaPZRE{d>fv*%c5pIa(?AlXGcUDK2JLeW|Gd{eS^E0Yf4M3V#l>Z8E=;N0xZznntqhqpHL!NmaxdX}qcf3$r3U zjT)Yl%+I~$2+xiV?hJVe@1Fs38oWEH(%Tq?nU$Srr)SmU+mdwi8PetndgGq@wu39K z-OJiblxU~2Wbyf%$-RriM+6=Hi&#>{g_Q#_%5F!-)7B=t9GI=x&j7Gm%2`|UQ%Lgb z6t&4C`bE1LRkkg{V;Bb-vy|$#EIHa_mWgFuD=T*ri;NiIjF=RPx?_=ku)NRVlI2IErz%%?pK&*7IbU?gUqdYn>#w zzNfk)8n1!JSE_W0_c8T#KCGjf2XBLRin5)TlnD`3rHDjAFmvFm0H!ZF?J+XI-<6-w zA#ex`wk}4UaINigCj*FB?j3UnB8_nL3`4qHX9LVwX^moyZZ8mWjadAxfpQx3_E$Cb zuX>ANsgc~MncIK&+IAToGS&(>Cg!pXdVDylqs&TXT9{+v#FFcIXn*ghoxF+l(YdB4 z!FYA!$UHY!DYWItH0N!zO$lo3 ze8g3_>O4wx{e8$@p6+6>%uX=dah~F#evl1l+s~-cM`LAtRk|A11KkG8#VSraAFigl z+ryl?FF?HSJ`wASD)Ltb?|%OMo{nYXv>ipjcRI`uDi7DD(I@rZj&(h(;`|(lWpm@j zXpf0JfYl{wqFTqi%W@@#&_i|10DH*@Aq#z(;BT?@jK)U^tmWehs`X@w_Im)TJllYL z0s99Ve138e4Bvw?zGUyf?2rgX;Xpsd`via8fcKCCc|m*5`?(u z@jdwhVn1L^b(nAz1J&lMvHe=8%Q&s`MZCg!RQ(lxj;EO7;U|z}3QjGrT+yyfLdh0N z_**}giZg$ah(U=!q}J<4=?%Bj+8q-t!=CIYc8}jF3BffqhLy>)+$6Ms5_{y=4iK7)!GsEkJscOd3+N96 z|7{Y)3e1A;d}r9H{szaP9P>mTfdlqoO{6;yTHo}-F2ZOiX5^e|ZZ@DUC$4d=8$%vZ z(9_TT7i(*+@RpJdo;qjbdrn(ZT{n=XhYz@Q9hlsZ2}gT_N0L!zmQGd%6D6i6TR3_@ zd}b&q>%tvbB~GieVw$Oh__H^JJRD3?TI)#M>-)6RkL^|?x{I37wqrj|gutPYhlPip zFHO{X2tADdEX5U|Ar(YLtV>;sGf%v}p~eEed<{r?9f)FA{xI!1&ONXz#9}wT!dBEx zg->JL=}ZB)r;70Va+O8#9F`NzOF0Ppp*#nL^CnK&ewKas{`-Y)Ry?waeG*Z5NF{=hc z+9ek6PjEc_9Zxhm&Xc>}2-_`xsKy?yT^IGWIBaunip$%&{*(6>{rqi50;Y220f3b= zE$*-? zP9xXk$IO0|Cn_3U^6^a)O4o)g=N>Y7Umuz2L?266>FqT)sVT=9TYy`Y7B9P(zf?n7 z68{o|^b|L}B3>GuIlf;qn^$}DYP7OzJvx5Ny~^@mI!m#Z8%*_vo1$m&+j~~cF;&8N z!)fxD6$>D96p;62yf^R^@yu+naVSTW_)*`#whpUXNRH9Py-U)rXXMT^VEoH%@Tj>& zT-JfrNM}wi`WoQ<1m0bA>khGPL4F}m(MDE z|E{xX{})~U3Qh?QSPS0m{og_zdVxj&2w1TuyGN=)6!hR^0GEYqu_FX0QE9+}aB z5n+Qirli?YfPm*v=ceZ^blo{vA?xm?1VzAiqEvwtK6{Tw5C}*7cQMK;4xM%gBtrZBJE&v-*a>Zs)33jiKDbMi;_~Q}V-`s!hDh#rJheDS&U~98v*W zv->VGK4-B+bs_|w9ct8hn~y%}1^U zoRi0D(UA@yHHH6z^|P}dK^y&)sm38W$-ieENIsgou;AE=@#mTOgK%KBJfWLwkbZto zTP;9n_~)vw;f%{GU3<%D^~V&g(U%@}m&HExCS1@ul)SwzSD{zgo1q3_3EK6j?xR1k zYrPly3g6MKn-Oewn6!DAxDsvpOi7uYI)w7nxKTRlzx0rSk_rK_dx30?s2qSt-0+rM zs^8ikw@|j-^T0^l)U#!@h{90IdICUWWmPkLYw=P&<@P`!DKm8#SpQKLe8|q-b+K?4AR=O3(e;n9>>E~c3iu6@Eo&zUW`j1*T$ud(*tUr!!0 zAK5Om-7m*GI|LwHp*qCiBCB{Jjo?g9;;T+D0h*yu+$rg@7M|SLmHq@fzDRm|de&X30iDJuCWTOBXPS~v>6&dpBF_bi#tK5K;xg(sLa*ORhq=LZfm_w=c=L*cS#5Q3-_5O*3F+$1A}^n!#Wl zDf^e1F;8Z`Tu?_^tu*CzuLrs}Lx`$kO^!QWLu6THd&O#<#`u$R-F0cx*@${goQ4+j zCTDF%tRNaO@7}QBnq8#SONb{%ADdpJIth&k<1mhKk>%%av#&22^dg)tMtoXO3BFuL zn3=6##y5xr*MTEXe1li4m-E1PE|cuLE+bf zH4dkdtc%$13Us$s|6__Kte9V_sy;V_U3vm-nyZeyL2N%rHWY0ueqs;VW;HblVD*rDHpk?mZGN|1NCg$v;P0!Xy>gp4An- z{o6;UBP2YCIKTW)L?2}N{6D!qX-m-PX&se=VWa89y|9|!RlhB$IeswA+y1FwlVy>Z z4`jA3aXM?NT+&)8lcTUHdQvNXGOE<55CC8;{2tmOFWM|8#)fn+fP)omRbH009W33T=7@+*mg>f2+im=gM*n@V&4MLX zm|npefH*Tac|IBfP++$aJ}(CI?L$R&j2ZEvSmd&qEOJUik_|@!BbCP?9lv;bzYwuN zEue57kTFEoV{309DO}5F?``$yvgS}25q61sWq8gw=efY_iKPTdONDqB(N^RWlC&>1 z>Mt{aW<@mL0e>%DAdD)ia~Z6l^`m0(!R10T zGTYLM4i9pzZrh~sGbM=Oy~_@)7=5-`Zt@9*i|1{2jmho`!Gu{ol>B)!wO=gZc6-RD zQssadT;j#26_|Dn4e0Jn1?b(49{n-Y7rJloRBqeKL-caBq|t9N-&)$DMqe@5^N@Eb z0Y5vU1G8EZLg?J5|K4P3z94l`{e~mTeXHgF$NEuaGZzP2cQa=)VS6K6FBdBpWiv+y zXV?GKk0#nFpa~<7e#vZfwgBQFATY#!2GeBCCP+#`TZ@P=fds~TOm1nX=ssn1+r%^O zJ>5VM&krF1pO{CmV^}5X^Lpky$3M(1+}+*H-JkZKJP3bm_IC-{dz;JjY0Zh3Mu8gZ z7)pw3Q_vo%y^Bzs(`-fD3{*Nc?)E9p?xp*<22-b7cGgXEZnWw^z~>5BU_Y z86EFdTdrE>VE{<9sS|;jkAElGBpYWm@uv9gf1B?3ZBCtN_^o+v`rfyq|I;kw|L$2; zOJ_49Q&}q)S226n|3g&}rpV$d zX+gBxsGHt)1NKg}pB>1I%Ng48)WZMdwb0|&)dSKtgd$p?e92N&o2))h4_3))%8&oo z2PG7KI6e*L3XUIGy)F5VH1xg?zAY{MQ}HgJXw)wa@iUBox=@n6LqiuFAL-6U`0ZET)p}>cM*(+RjiHDH zf`Je4|C&ZlIiF_fd@msKw`g7B|6>7F%C8{j!eY_LO^ z`-8zrR?)Hr61-RkCE_8r52um4kT^>G!HeriU)m9K62(mA2qFtoR(|g!IhNF5t~~m9 z;5gw`NyNYtHOz$p=E`Lk??cG>sFOtMm(M_nFderrGs4dT)6+sHqXNSMOXC>-j`mdt z=#H!0N2-)c^O^qjWv%TJzd!4^t4#GqgFoi;l|w@+Lfp7gCR&nOw^lVUH{z6r%s5S@ z29lT6G=9EYao{+wSqv(ISleIJJN6aLJ>E6k@xJT&p@UXp%@&Ok2K!dkA_t?L?EY{9 z(94>Mx6lx+DlNOIgQ$1j$7=ryc-0AAQ>iav5(@u~aY@&@l#RfJTiK2LRB zPZF$=b;983A_}9!5QDUXR^?G36JqPzOR%ap+SQ7FbUNM(&|uB`v9@suP>a(N^cM zcHad$64Ku&sc+X-kHg^iAAaL=JV~;NSRc>Aot}U)#27(It6Cye{1+gQQdqy( zi}T$2Jmu!V%1y?)aCj=Uu%`Z7J{18xBbm&=6}>$;0@H)h13#>a3f^xR1Jp2P}eos_D%~bNrp8&WLjWq-kIqK@l)TG}XCBu8oyFBsPOBoe=N>QDW z>z-Sv0_zb|-C1afbT}4F9EIxg6BRO((UM7TZP=MsQ3mFjR)mpx%as|})0j<@cCDT2 z^3h8hdbE_wBR2F-s_N^F?XJTaqVC4oHscjTFVeg&HSG0J`zeTWHu^10==2Vnf00{5 z*LZ8;oivnk*z$+*w0dN$O)z}?i=`08>Zq6Fi@#q6u|{D(=&%`Ers`Z5HDY+sJ9Q0) zO&z}+ewZYNHZ2^%=RX{GZBuX>oS5(i$fu(`J3<|QmznXHq$6y}hu~%u{iUc|V&{2Vw~*4InCPYe<*GP| zduYy%DS^cq1}F-PMq_8o|OH zs=R?4P@}gx#&W(TT$M0gKT?`Q?gZrTOq9;R!#zLr+A4VJVI7EArDUvUiS{@nuWtmLKeT|74?@Y=#te z?RQLyD)0I=qAI~%lL9sunJ_Y<#jBhel5`$5&?e3&*F3LDRUU5DL6bVeBczdtF#|Jh zi^_lewnNsl(yR*wum!f8wd3#5DM$vUuyVV2xr7&ny~a}MLRTiJxwKnS>i8dyTdpPx z6?0pQ@zBs1)hFiT?{Q%_v*L_YDN1Bq=JD|dsGoTDs8n~wPYSQ|r$oI}G; z22T<`H#mWDckmfa7WL$IbMlkwaD#} z#v@8uNPC{Qr_4t>oz7wyZO&2X>pAKb?%!q#}ksS<;mC`8V#Vq((1!zB*)ez<66`|Kp}tqqZ0Z- z$(7}piMF2Q*ok)KIFK#hHVM+})F+16whEHU1yqL8J@TK#cMJimaqUw>Y+DCe;WDfS z`^yc~{-&cEc7xTp^gSZB^@DKo7zTlH@E9h7 zSb&=Xuuq_WD&U4?)a7t%f3vU?mEOyZRGV^gX!A}Lgog8ZQUyFu_F5~41^h52>#jR+ z&i!NBf$@jsHvI03m+a7fH0diLFN6|X z+n2})4hdV&7g-594o}@zNZ#w~sU=P_n3AjI9c!3`Z?NnRERO7-fw-Ot41tDX&ld=& z2ced4-z|6?Zd2=C+|HXi!65&=GS!Db$0uRpdaJg#yv%RXQNkqc@nExGdbvTlHtsa6 zET32v^Nc%goMJCxo$|~pMKzE%@4{utvaEv1mwajC%9WaN--ggxVS=@`gb&^2cMrJ< z0;&9B7T$Z^VsR%OjtjzvN6E>>wkHjNa$7cs;J<5Rn>h9SdQQ?Sgj*lvmRV|le%1=w z92`y4N{#E}cA@iaFpB&d=Q?!rx%-ATdPILf}?`R@UbwZz;+#{a-i&T}q^WBw8 zmWuQggfe>=J;GmtNMaAWy3T-^^fRR)mv`HiC|PJ%#fK_BNi()w^L@(d-r;|NJ-F0R zsD2H3Yc51gp4svE>K+^;e!I#Nc?>H);jgvTU+a;O<&`|#J`PS)&I|`bILkn~IRfZ? zMj2Q&h04mgT|r$jeWt3^bEJGYlq{U_a16_RymV$h7@GKfD!*?wBVFzMmi}#5JIl-T z$Ss8TB~$qQFh2<-0Wxh@Lyb2eRz~k^;#o=%qClCU-{aSbI$&w< z;|ojtQzQQ};A#}CJFgVV8}5WOuh!ogtl0 zJV3%R2g=vjKMd%Dlod<)3rGv{HNb-eh>PNLEb#Az(}b2sVuR*V6Dstt^QQorgxF*R zw!$;X)L{Vcgc#cR)24r@i*!I~gIA%}iT6Q(9tDkpNr;9*%>>9Ik(hcZ!Z3lSfo8#b z($qq+_8$vFnf{t1Cqi=OL+)SXuao&6lrrDLAxNVI5`rR*vhp+in7!+(2Q`Nq8*b!x zgw5Fx7zRy&^~?expy`V{mQFSBLIy8l_UCRJ0jtC@L;~UV%yH%30o&P!Ab5`RNB&#~ zE4&dwk{#ah%tK|o>*E8VgyGWaV*%+MiQ>QE(ccRQ@GPHlPKP?Xbw+xJsYSk!MnW8_ zbN75z!TK#Cq1GXA*UgTX}_4h15TlYGE-m}~G6%q-3KW3q$9}J^S$#eUl zfAE$f{nI@C8WRZ}Xh)#w@8L-l>ER9J@0tu@b&B$b0=LDOV=yfB4};*N0Jee>co>n} z|HpSn1VMuRMnjW=<{;k``IqWyhGatU(HN$}9RvA6uP_{Q{ol5@aKA1`m_bMOWbFBH z{TP99pxdZ7A^r~FK8(O#c&f>m{aXW2&s9$m5dJML5ChB`B*>rke2_b?`%cdV{;A;a za($(s0v;w2bJBDd*YIPfBM~B*k{?@|k&Mv5GxYxubih-M#;BO}lrJ!02%_BJfGOM4 zq3O#bE6NLigtga;R4h8S`tQJaO7)$CZX@4Ng7{(H#QOKbdK&aW!H*#u!b+k6k%6c{ z_kCAT5Pgs}(0BW+fLUly^>4|^Hs%c$hyl#Ad|#Zsz=#LLd!Iijs5cxokzrouY|N;- zQU_jTc^sZayo6AwzrKA|%q)zjejg!t7bQ>>#GvCv=xflQ1>ymDPNOd$^c99nw-3dh z4<#4#MghbC_BjRQu%jN*54A1~1V15m_&L%)ZqW&~hXPpWniZY<4S5wYe?p26ebgg0 zG5+}#PAQ3 zV=c{QN>-4PZ+wKJtA-FY*nDgLk_N09-|w5|5d6Up zatiW;XzG{;&!T_$#75hp5G@~WqywsyQiq>!wN&eHtWfHRn zVc+Y(@07Q`$(%R){RhGp9avd*z7FTit}~6@iVSETw)d|am_HPRghZq}r2{M3+FqyRV65}>bBkkD8dY?FWSbAqUCMK^tV;~RTV(i$sb{y;r-x1yK(jEM1)3e3? z3?tTH{WL_@MSyTbfDda{1V1zOu zHfW{IYPx$*#1BCl)XD1XKqGF5RH+Or4(VZ0l#R2NlYv5yr`5(#{4@4qW{i}YT%?@b z+0;Wk$5`C`Iw;=7E+Q*endD^)$4h{m^lAxp{CZ}ra%#-x&F}zDhh&-vjS@ z`6qK0iYsK+rK|5;h%hJQ;HX0{;vCJ3 zOOL;LtidEWSo(`smT9l@qJpkC94CxBRh86zzyDAyYP@>5vPebOBNibE+w!U4{2;UH zxb*~~vaT#B`JIb>$8#KZBD=qlLp0xC9$$306L~K2hv_bMi>b=I4e6qmu`rwcBv1ypkt$sTj&UyM}1xDCS zaM29KdQ4DARf({G{o1JQcQ!j=Xjj!+jc+IDwN6xeS;{t@HoO(LQ|pwsgTiEXL^uk$ zux>T~K@@LG{#BXBu`b2SU6B<A$9NL?x1K@|3CwM80!~mCkJ%!_@6CbAIh$6HT0Je0Oi7RN* z<(8`LkCleg1_BqX{m8r{A*L{IYycE@pjR4cnw}>cUl92XtbDMCBdSky;;u~AfYOwz zDnQx7k?ZU*t)39dKa6!&VvmpRfF+#rJ{HRG%l_HYw-6k;_Ru3a~p zwhl#u#kQaImQ6RPbU(xsQosLD%@ec6VmpM^as3T(?jcoHHUJCoU$z_f+L4nmcI zw<>d|F1G6jA?XPr2#B4x*$!HqBEI8qMa|BGMPCmcpQ60; z^9R%}x;#^SOBLrQpC!D(c8XhX`Cn;2lLZd%T;BbAMxIXb-ot(S;xK@e6MY_PNbkCj z1B|MI?_sz@W+0yuF@3p9mY^79r5WGjUNJru8KBl2kIL*zI@5&$XQsBw&0NwUr%bm$ zJZS*LE&RJ6s#yw-InNj+2>zdYglQZ(%n&7!Ldb)Fzor#pHy{kgvvVrh;G{S*K@b;i zC5=yxj(Lkn=1eIwpUWVAhwKf8q}_e>IZfN6`o+Ok@|LBYKs)_u2&9F}Dt?5ET!Ipv zUDlBWBdjg(uOV?DT}rbH^3!CW$%!LekVRRtTL~u1t_e1LE)aBV!1~Aum%+%E0SCZN zFtN(L>CIVtK3wT}8OH=Fun8%#)>P`%RWdL63zIP$4y;<;dnjjivMU$<$#NZ!368*U zO2R={@oBPTb{9EqK=*Ktv&)#UF}_GTaCAc0ewj^U2($D6xo-ZgW#XqBm10C=ekXtAgPsw%&`!Dt+TFGh!L z375tJjV$JpgCKN^8avg*aImM)XLFiU2?-1MHEE*>_wd){6IXvk*5k4Kj3~|oOaT_; z$$hWs|F8~Sv&+ZhCQhzBn~@H(g}#V-F5{ZXuRy$oo?f~t%>nj;2-^lmytIw_hV>o9 zQ1DJi{L^m`jgdF3s@qY#BNi=7|GM)y$@i6m_nLd-@#0xMmDmLrWOEgZdl)Td28C>t zr|1EGwLnyRGntgS;$;!TSuv$?pDPqv&S!;?k z8gfsEx|BgO_njQI5GcAcXrQNdX=z}}U30me!R)wQ>rL6sT7Rzra==X*A z;SChQdkQF?<4Ghh^f%GJ!8W&w)+2+KD2VyXT!Hd~^R7IYi#S{nGp3|Ykm?I-Tv0Rq z+B{gP3n6XMzCp|#&cqG^#wvM1ISIT0SbYYM9)T?~kj?{PEe?`+vQ7v=vP06rUcrk|i%qdpnuB_QY zNb_un2IdQeY*Fs>d<<9%_7#Q4mM|XyDGO^$vZeD{54hF&oTt*Stks3BR-_*x8osF( zUU9xMe#Mlhzr8aAim*;ey|V>Mdgm!0$Oo@aRKy&XMDYvo|MZtOLYmjhFcE8*^=tBlEEb|Xv!m~d zxRZA$<9$xu^BDOn-@tbAVdWa2b&ZIxPOsmBL1})h#$e1n-B5RuAlXdx8iAVNR52P1 z>P!h!*i2)s7n=)z=Y05k#y}}9n9phX@kwfX!3U#oJ$2?VtwOKhRIq|UBPN%_LG2kn zO6OkN7Y9M0#-9I;{wgeCB-ntUaH6|{FHgd~N;+dI2aCct0Y<+AN8QHbqHx+V(tf&R zX8^ui8<8Id1CTZyMDV}{wDRCfH0J>Mw60Go|{tSQy}#+)Ms?RHbARcS<|qU z)*o?p+X7~@&&mbr(43&o7i{6o(rreWqsdy7ckONs=RD%sEzkUsrS>|+e+XpS5QK;( zJ1vV{x(^q^?JPL|E9$_Z=>drkGHQS0yf@~xJB9Bm&bu|D-~Wf|*P!=U!wtQwEU(># zWMb5Fv`{)w$qJ|<4}GJBq)b4in2xNv#w2zq6mln8JP`s>fkkI_sWp!K&DSe#4l|YB zN`NlIPGlvC>9*=cYX%yY;1Ch2e@0DefeL6&1vsI}bOg@Q6Dk<%fq7N5Zux+%AQ_4G zE+^CjIxbhp=go2%e9NdrF`Pz{hNaLjUNng+=|$;5@uorXY9QP%7%Iiyf^ja=)?^|% z-KFGzrji+l0o0ZTGh&Zni!jhz7Afd8D_{@8cYAY%-a+J0sdw(!;AgN7)KTuZFCXv- zP#taa3$;enzuusanl9Tn9GV(XQi(zB5gjRJt!m$t{6aky$K6$0xB9o)8xat*O%(V7 zDD8u)xU>J>TD0upU;IS1*Em3ReB%#rb?+8S$dU5iT7p&i81YVPQ=mZIcLB4<7)!3_ zAJ*WAI6Ht`{NNv+#&fwCf0b#UNO6t*ZUbOANhuqsAKbtF9WK z+_3rtIE@awcgeutb%KD*Y@!DuEEswC>rtB9|gY~jzfmbqP63_loTmf3KMUajm%5<} zcA;E4uwQ|bqfQI-YDV2wq`$Ek+0m%nMRUXTsg@7B#{Lq{jwQSr;MrUT0c2dVsxsp@L<(3*9m z%~lBsxModTqqK2D(u~ijuCTX!W@W233#53Y+b;19d#X5gZ1e{4D8sr%c|^TZX58OD z!|+L%EM2aA&hSRqQLf$JI79F;_(1t8**?m8z<*De^egZEQ@&m7`Uv8+9F{a_R`VJT zSsque_*=Sg*#ccPchQp}PR*|r_7P%Q(Lg2nHCA4AXOWLVLH#Q~9AwFsO4|wauB>$mjKKHYP z<`i$=(XP(V-#=|JxWB|8}8baNqcUnnZ3U`>($2;PoB8f^BE@WF70Z)oM=0Fd6#vE_#HnSOgP7D#$LKi z>n`SN(HU8)g;l11}%!Dah*;vY*g1B;E-T6qH_O&`H=X|jrFetX-3h8&V z#n-nZBp6K24`H~zYj_r5SFg|%oqpjt>H5u{f4r=vuCeS)yu`Q-hfqn4V{AK0Dm0Bk zk}*WPTldoJj<7|mbL_#Uv`H{FYF)~-hL8gPl=oH=zyUADdXSXuv5e!QnsPClb0FTE zg1@$!-S3%>`PyYGWxKrikm1i19sh6!i&}h61;Pl_=D40WC_#>*OTCi5yP5J8 zkF-LD2{TZNg$T?|{3&fJ!MCol$YW}uQs@mObt~aO8Bv5XP|ohgy_9W{Tq&|sMKCpa zMKEpEhDooWTZqS7LZ)j}emw!5(NBd*l#!M1&n=rvx@BD;d%AN|$ygPEm*WnCTL3)1 z-_)Y>A-LO5BKmRZ64S7A@*hAs$fAan-=!J^+w|(LmX;2W9{*%}e1z?nt;yqMNyM&F zHHqh}AT&yUQ&4ytV6?B_sKR%k&8v3om|5HeUBc@JiXxsG`lod9Y3iUR){^CLTrdVi zWz$+*4BfI1pjPUxx$_W1eM@$cK^rx;m2@VX-Fb32r<2`G8c@eu8UHYBRL`HjC4%I# zg}oDafyUjkto>u*_D;{bnmlmTq9`>5`PEmp6+L9rAoPhgR9(ysVD{x8bT zG02uEOWS4Ju3NUvd&{sjv; zwKMt{Gq%U#Kuop_e`=kTs8gD=69e(WxwL$LXskse<|%Eh%%x=kdvgkCqu#-87yX4~ zIC(dpv)np!&B*rIm<$_a==PS?0YYm6&4MIpfKrHE&}R}Eq&+-KKa&bT6s3=0lh}JJ zOp$3S8Ke-&_~RRbhZP28#+=s;Vn9~LOtQ_EgH^$5*a0(O-LRhU^N2*&gHGX!RM@dI zK;$-|4o-TiORQ0H$TJ9zxq^s&M)nH(N?DZPc@)#DDIwte-##rV-e4ZE~{GVLpU{B?!xVcPn|XdFNC!exZ1 zBWtsdzp(uhei!94E4q)JuKSTein%>!NGn6%T_C>iQGQfE{6a@V@15(uPZo~pabk&V z8YSi!WH!S&U-)Q@wQ0VYXRivWm$knNg zgRkoFj`JSFDZ#C>eVkf(eFCXzAhXapEn(5xA>4g6v%H&Od?DsYF<@dJHbu?)AQe@( znq%|CW{Uo9B2Cy&%_x$Y40|NaA#&^}Ot^?+nSCtNWWm9!t*uwp2rTM;GH=+(ILn(q zbl}geV;Ff~D>NKryUL_O`Bbt}Y%Ie9jO&!ECDt;rG3Pum?i2?mAVIEJO?JGiYX*-Q&kH(*aD8p%ah`r6qC zb-a%t&popF$d8N*{Vm*tBfl`bqLqYvbL1+ch1lQ9Ah(vM2FkV^_IYYv6+gOHcDcTKx?$`p4DjrPYdlTmm9!n^ zSHi9=Z&YTemYEr6P73gl%vI@eXb!t*=ukAQ%LVFRX!Li7$Yrw~SyRv$UTbDjd7VSq z+O9r#MS39Mp1Q$(X2QKDv?1QcDADu=^ed4AvJIHR=~TLzZAj598o3Lapk%2PPBWZ; z^`WG73H*n@jK8spfOvnT7Iyp;mh*J#ycqC4dWVdhR)_~Fkxw1tzuRIYymNl#KpY%{ z37Gqv#f*bHksqk%dCJ##!&I=RBeyV1bII1^8oXPAi2S+?n|vEDdax?_E9K#xgQH;! zU;tfN_e6a+o+_mr;#>A6xgDm&(wapJj|FHj%8E5|w;^m`lp5;DN_K{9e%CVpV8-o= z6=Obc;9_OWVbsg+8uyGIXslK3+tjWJK7D>CJ2)XM0niGI^EC}HB!w%!eQ!ERMo8(z)^8;n3aSv`6og zp4UeR5%a@*z~Calqy49}4F~}cg(W`ehFdiUD3_T?E0n~0%0y&@unc>38P%0)-#n<- z%#vd!oRpW`{tzcQA#4~*QDLcKZe%g?WF|pQ@yYOEYw{J?Eg-IFceQLaq|7qHXu4sG zP05DG@w^dEB+4Zb<>WI}xLYJ#6NZ>oi@BMcWW_}hu9eLR{~Nobp_Blc``h+PU(EJQ zNVYyHSMCkaZHI1hj(t3>GYnvFU|>}vJfHzj5X~b4&p03GuE`NKt!&?d2{OINR}@L+ zoFIw~)_G4r^9gh{tuKIxHcj(x5WRa;RikdOTjNE5>i2 zj7b;0lviGEJ#T>NRG%R93HV)_d!m=#4-DR;C!dV#U#U43Ea`O1n6t`60hc{5K!HW{ zVCE|x2r&Mh1A9JD3 zXXp37tmb>}6;#8R%$V5g!pB2a!BiYxA!hzB-^~&E`ZD>0TGIUR-TyHwE1+j!YDE0c z&;QNJDx8aB^PzkhBRiazGbmR*9ii%jj6fA7E}>DJ-E0 zqN=MSe$0ZO2%t_!vUWkt2`ArAa+n;wPhlQiJmZ&a1911^2o$%s?%F00JTuG7y+!)T zmH+bpgT>U-FKaHI&>g!TmJAa>BlcC}>boZ#khg)T)n|~W{$bTX6p*OLGD}12EHsnc zN%J6`|KuhTgt)yZ#s*b%l*iafAcf>oq}_6ivGkS0e0@_S{>U3p!Xm(GB|;jbk5|NP zP0wAUBk>41FyN!IGVf%ZnaALzWAS(^V*u z!CEgrkYFR9@9i_M{#;D-`m#qk94j=4VU8YVnTTZj;*z<@n=YLJw{#)l&tL|>2#!VRsE#=-i9?IlQyg~Ui|xfH&^ zT?5euS!L@baK8Y`ZJc0?D2^ef#K13Mfa6uh3Ag505%27aP8b&kdfE5zv4U*ZDUu#` zzVDCTpkJT97?*KsG2D-*ba$sl_HBQ*RzTf$Deu5Vo-!vnGy8bdB^ot~BR2SUVg41& zg=RJL8UON|IR{!%l`ER;Y`O^jE5Y?M>b#oP$6fAZ~*i4LSFCKvn2n-T& z2w{AWG!{PK*P^s@h~eDks-ZI*aV{!iqk5Ar1=QWCh{C##`EN97j*)$ty}In|r{|}V zHG zLQ&3RBpbur`D|b1n86MXkzZm@|Snf zIw9?Tf+g`_IcvP6mzHWHlSd92&m0*s$!ZAnQxq&s;%jZ@aT~|Q_@7K?|IXyC?<=@n z-r{i$abYxKDhPOPOx^p?AKS%{;E-*2_Sq}ooZ>jC)w={LyLb%$Wl~YSsMkpILMG~7 zZ5W_b-Qbr@wl1x}N0ke>TSK_)<`2$f-x#!;e|otJkla;t*5zTo-HaEwM`AEVA`5wA*56@hTj zRp||M=DS~b(lQx)T-Hku5Vhbp3g>MDVISk_Jjg#OmMszql_Ow1KEg!5wa2`*4025C zh!bUC?;BdJp1c%`IZaPJQ}GD6^*{o-9n&v^K?%&wNS!&%aIfPu1$2_-vHgw$q zrOx+!FFhm)S7q2&yr0@esI4~?PO~rfw}C#c9IZoU&Jw|oprMenbsOpBomI6t)6N~~ ze}1jBJPtU<+-#z1%s6~rnnw3ud^~XC@dncFfa9NTEBp*qe?a7n*l=AkOTPfHW+F1%(cXOwM0U$uTufjtLw#^> z%A0sUxDUZ!Wb~A>2;@+akT?uCAll3~0x(c8kdhc10f>->pxNlId^@FnTDBm;pqhX( zzv$?vVoFYJF8+AXPPXKw*=jW>b^0Dw6tSMRI;${n>3VoA{TWVP)}S>qdZU?+tGm|Z zm>+9-S~$audh;cpx^C1qnQ4L&dc|UPPl}Xb$IP(2A{P6D`i+8&#j9Mvi;+)ti7>V# zH<<>{u0B%n;lGA|dq-w|Dk3OAVk+!Q_`N2hLZbezxA_<7%B(efA9lIUU|Xs4$pk0E z*gL_JV;br!OC1fcL@LH4t7CvM4Hqq1l9iIU3`m6 z737Bg+7voj-=b*7-8o(;BCRoDV=?#I-T=}>+_kA;SBAa0J8=28fC#!*i3ZT1P7_E? zL4Zf+Dwg>h4$&gb8*ycEsdhgduRuPFCOYk|rG+5vwf4ZYbdCs(Nz6H$gsTNoM!ug> zs~hBbfnU2Q7#4BxKn%wttGL>dTmJ7h5+VUExydI$O<&J3{i;J&FG#UPOqK2 z&X9v^1j8|X?h1$MQNM|1bYf>BCaDK3>^{g}L3K za?LOT@PI)Ix8*LGN zoqh4yw|pnmV|4-Xy*^ANodJ(3#4x0=YRv(<>HMsLdvOJMp?ClIJ4P%soi7{VtZ~y5!VZML(&)ws1;wkdagc& zE4Q;ZAWWY)s^~ok?S6(ckDvT-KT0pjEHNbO9hMK+ntgoDXS%a5n@q)W{9M9==KQy1 zPviEav+v5%FBhFh&X1(&c)mrIUFf%G**a<$8Vj$$%{F;6ugJEma#I=^dyWuOt(f$` ze6wfxC`XxO0j2Byh0{|$; z{SO+S|8ZkU-2CDSUtj^JME40*=+plQF z-KRY0==3rj)qL*XvplZaj_j*$C)u`#m(%b! zN!_4i1u2eW5f!JJ*b}3Psnn7v3rz@gUX)i=wFTx1dTk4_Q1w#{6wTUJ);U^pVurCu z>(|*5>J4IHl>IR16QW2PP8M^*;js$%Hqk{E`^(r2*=<<;r}R`TE5(Q`>5;1GMv;qQ zqVZx|!bCiaNXU(peQ#-TvlabPPj8uK#b7aveEFuLB`-sL; z+THD2qJ>1a7N!dU^&s8H2+l(ST<2UIb=E74l$Orp(Cs{;ahc6&Km<>Qf;joNe%MwzQa{Z^{M z!bpNA;AfaEqfsPnMSO;l)NnKd8LtCl-=If^D@nyAx0!aroYdcLujE9h3!06!7aZj4 z#xwE3gkr!@2fT4m85@)Jl0LOR}NE5H)#WMx-N;nv%@9xHC%Jva2GZ zMI}zv2}*RzB(yL`_Oxoo2tju@LF$qWB!&1+vMt9>hxHA!b4_zI#08b$g2`cOJG~@C zGfi5J`tX+Cu@H{Bdp)U(`R(;gN14#+!q6YXe2qbAG$beK8Tm4U*oYx+%1P;rU0L+F zbd%Lc>%{5=GL7`8w(@dL5BCrw36JJ3 z++-TLRg4f5CZDOyRhh9-2ga*|yL<=3mU!epI6;8KARGP!fYc+&07tqO0Bk${0Ko)w zz7-%a!rlM|vuwUd574@({(zNeH(C$yy0Bm%GyZ;n)coYW7NFF_ZiKAlzDX;1e`uUR zZma+$YMFfLy~!)!L1w6RDV#xXWL)WeH9#W=uK;KTD||zMTH)ZqWyyB%TS{L>+^0)9p9`+CZ{X@9_L){o60BwnDDXx)A z3kdid`KB8G+kYGSr2s!eP#@X*c*N@mlavAJB-|+hf`fDw=g69Eu8v-}g08>fC;otJMR8OsGLVk+lRQ+J)rKB(|$%Gn?hB`vJ z5CG>QO*|m-s%RpBPJOK4qlO}!d^cKCgZ%%Q?8loLb+@DsNp+~7h)>Vs3 z){Lnsp=JZs9=BF9Q1ei`Y6AHVk9=MO5ymYbyUyq;-XAT>|7r~l9+ZdA%VdPC>I`?j z*aZA)GsXjL?eEKc>r!;g2l)CH?Rt9C_NLQ&RqiGi7w;r}{UCGv2%vp;kN(KynYtX3 zeFUw{=zQ=u`wTd4hh+ipy6LC^CSo^Ti*u)0R)Xi*!Tq|YNe+IukiN$WT;()YZda5J zd)jo}q9;k+5}F2s`;@rl&c+iK^x#`Ws~6Q$RutN+^6bh*wbj1Ow3yI5+x^?({ z9on+(t?7Yt3l!V^HJUZU_M!fwzep=H_s~Ayl|#)Q>qj)#41Vjg=b+OA3R}W-8%1Ux z>D>E&A%4dwvtvuBA(*EcLVOr+yQ;$dxjyMFnr`hY~{ORrWYVHl}m1dIHTy=inC`? zV(>DT?p{F`ViH+nnXMpV(Bnm@NVTv9c&#WOm(0m^GNink+_<$R_^dEtXZDz7HDm}b zrSaJ2btz7n`PyTfiy8`@QTKY?5F@*;Wqc`QIo zHYYJVg6`jei?eoRGBes3S~&vP(va|)l|~si4B5H5|dnqH5gxATO2IA6;kzX%eZ0cneV&FsJ~sGYnVtjI-dokAmOhq`vcnZww8Famg@h$ z(r$$(8`n~-j$zi=z=ghdD1zHb2p9q-s3vYhB|5bJHsN}-F7O`mN~G`bawf^07e1>4;C_~2`4?9R(l?y~HoLgUvS|I@Zrjs~*1aWDRO z+$j&@S#>h-yse^%@IZsBvA$Q38&mU@BSb4(-B6^=61iv(owioCWPD2qLFV>HmAW$6Y<-R){>KumkOT-J-mXvdx7U;h#dew=Sg(Bhx^LrX zwxKk(DL6@SP1>0(w?{Si9Y@WBUDSP6CPF2G($9eqM-KEoNrjn}Vo+~56W7GFWJGot zcn>#fvrUY2&qc9QRm3MOF1|4lDgGPWtu!$(r&bFo*ukGPVivD&e!};bF!rW6_Ga97 zZOrg_V;IsYy3{Gh_U$k!vnY!4B<7}A#&&Jmf0$}R%VkH5)^o8mWti-MwSpFzvCmE6 ztV`N7zbtNn(?>{r0M*S1viIzM)9f*JVbshueVFy2h?K%z+mC(wV%#GY$n9@jWk0Nd7Yn+g_ zXLL`V_M~MWzfwuQa#R%zJm7NjpPvG^CrQs(ImTO;C_M1I`CrM>wo8DT1#rfwD*{?6 z4xHk#gtM02I_9(|vQ}U^_M{7GEby=HXKEaVdp+moCi#pOLN=sh{vUQC%uy zmn!i{!IuSa>7o^hNRObk7@B_>svOw_otoh=AkA8W$IRYco$Z1vj&I6>Ske?9LGNn78r)fv+{ z>-nltdby$(eGtfwHWFzH2Th9vnI5u%NX*z;3Jex1*?P!0jNi_qR_?nG17$9w=tmyf zgAtJ%Q^zFV8oc0Rj+YF?I?dV#Hi?Bj&4Q=))+F-3EV^p?mR6R7w3Ha_`KgavY$Nh6 z_UGWklIjG?6uKrAY}Kv@wP*m6x%sTql`N-{UZ;}2`!6PrS_oF_hdB{RWcP#L1+f%! zNokW=u^&zxwm%M8X+|D2=_@6|eC=DkB!t~(dGxylNA1CZy9aN2pm~}82AliAYI$Pf zK7<&f;q)21d@D|csEbo-GqqWBj6P{XE`Ner1&KKn-T1T*0+r4>$vM(#9qvehb9OCj z#*Ddjp;bo15UuY?(r)pJT3Rvju8u-S-0N)F?)*CqfaSXp2 zSHQ#0m(A z;7zp8G*FDXLh8Qq<03qAd;K(d8o8d<0pRYZ73h?&GV>UWEnQfMcRzELt{v$;A>Q8Y zlb{9fCVS1BKZXGl!qSXvWyg5JL^Jic@c8Ie4jJe1Fx05NbgD$3#Ipf~DW>C0=Bd@t zvUakXeeOc8IBvqV`1KJtf7Ea8F=xJjD>erI&Es~Qh8~I>9QmsgK}s^t_>ja{d+IcH zp7UUv6Nzs*ZsA=CLyRaxm^KPDIO(luSojxC&3)jm-KS4qS*dK9@S}Rggveq?rO2Sg zgFYBq9CK~q1mzMeF~WF$sFYE2Vq1~`V2jvd_cp2B*v(O7`mtTz^_sjrQbr9IvGa33HV)y{4Xgsk;)<&TnsV_cEXXG?wI?)*3tZ(@55<#-%mo9` zWx&g_Hc1b2dr1#4H@ooSlMKn`MsVUu8FH^qj3T67-jk(aVggI4lmd;?J)XbHQ3^-H zD5lavs}%7Uk}l-Z^|U+kZ%7L}j>MvFXb0R#h8$Rh+|YMPf4a2*>rwm-ZHa&k-yOjY zJcvhGHZpnFAacZ`1gpPY&+Kr)b#pNtWL|3m}) zUzeeRk^N7=(SKDlk`yfzu#Hf>x7bponk6L6px2~)xzBT9{ev?CWY)zSgfutRHc((&i9j7Z$RZ)D%3QQ zWkqXJ*Og7H+O!pPZO1J$ga;hWhtGzSo80IX&D@(6kTFi-X<9CX7w30& zKtRLF3t&OQs!5v5=2@`!>n93fxxr#enz@3iFyo9g2J>OyWK8PgsHjcUxhf60X)4$O zE~|Cs>BHPpTi2`V-X@1fs2biDi=)=mwf5~f5vul8Aze4-@2hI(>AiIed2%V&<60Co zb?Lc1PecU|QQNak4!57KUWo9q?2Is9OMWA?FQ`yikFPgcufs+NW0(B?1vqArK=KOa zR~!&KP?TBhn{YQJ?J_cX<3w zMb#U|sXQQwEOnMk6}D@UEVG}N>z&*ynD6fIK~m2j$~J87YFjPvmTaF3D+gHM#>wm0 zJ$S>R9CpI5{@fSrf<21j!QZLLK+y7gaHk!NVegDVSY}&Kp6m`b>zu*#eAr^#y=viN z^E&01<+94&9hM@5Dr z5+`$Ls*b~;zi0m(mf{GAYr`M}4^(b3%=LjE50`kTN+2pXkJos!<6@@yfYGi8j0;O5 zu?ygw<6lky1_!IEm^HScM-IanR?cquX#f)OC6)mH9uBghcg~sg+VBo^2@wQ$d2z=@ z;c`9JduYe`Uc){hM;6rnF`?*cPW^T`cPCpKHT^mpE14UH+jzwLVJQ<)=sJ_XWfcC4dh$83f?-M}`axB=tiG z-HB}r&Pzz6X9@$<5E@!Cxs|i3t5SLk1)_u?g{mSa&$U`Kw>VcSeL7-Yc&+}mg-3g)OuUhdi(C0RcfPFYRr$W zrmrP6IY~8bv}*^@p}>I`2zMY#nAzIt1#&bCN6GphHw_z<$r2|gnwbz{NRTuu0G7ZC z=SO4=gt>-D!a|u~7pE5~9yA?ooG?yk@v^WErv$tCuCFX%hTl~bOy;&qtD6xkusLFh zt@ax|n!^?tMv^GxsaEtEw3Wj)X*4X}g0LOgD%%iq?bQ{|V#L`Lj4{xZZ_sku&n+EY zNzAc-HlMTBG&g7ssCuMbY$wrFDiR`D?0ZU(ulCG$kYq~^C5EEqnZ>EDoK$zDfg`gL z#X%MOA=O>Sqn^&t8(EZ6p@atOTluX`nL0XgBS~O}>AFq?)xD18VEV>oc__cs&zNrt=9EfyzyYl3li7Ja8 z9+dB=%8aQhv>m(#^X9T7dxsn5szPi@4797tSi7cPX~bFF05m^oWRmD; z2mZ*NemYEeQFe=EGVEY;Nkhc?Ducr9(CNE>)(I+Pz=kMkO;~qxQ$4A zv}9vbASH<)SL^!`Es=9eOn{gZN{UVRNs${>(BV);j{|rl#rk#Fsl^Us_VO+#cJdC> zP+|ban$TrXYc#y<6e+mT3~g`dwYt4iOJm6OZLqp?gw>DKp}sA|uwCOuqz}7)&$##cUlC`5N#@>UcAhEkoZfwE$|k%t?*Ke7X1qR-n#>w zo-(7>1n`h`=9HgZJvs_KyjfrMWn_t^l zZkJ>ot;iAMnuaoMX&pR7zQJ?u&Lkm8S#zJ@TY^P3s1wg5$-`Vt@)t|P1!3Fuf#ra> z1yjC`sWm!lgg3E9N*N^d0kOVvkE}inR9DV3C~TY82YO6m^aLF6wYegJLlUE1#K`Q(=wWGt{bB%P0|=I|ms0$A*-_(MNmsywp$!hmSSBR@! zkWtV9IF4Yqomtvf-Vk5^rOVQ7bv0@~_aJxRDgVK!P2++mAkna`rZ^XZ4C>|Du%YD$ z@}54CP@|{SHh#?+MMYgW#s=gVosby<|qDK@m>_E^_w(mp5Mph_P#BqKT&rmWP;gc=ngeQlOrV?v%2x*I$}_{eN@SE#{nPFs-m8Ieno zvENa&`d-kyxm!Iu%7-Di4}@|pp5zVgmWtkQAme4fB_{o0D8a4XnFP#<_I1&+O&~S} za}E{GiL=j(g|_n#IU;|=;R*Uzqs2}M^w~OIt|<4^TiQ$13C|u>!ID;b=D@&DaM@#_ zGe>uV@EmsYkJ5*4`s?>iMJ2WMiMqeT&T);Z@h0dd9n@&;Q!@KO-j+A7w*^XeibE`; zx83e`Xj77pDV4T32bx?*-R@eQV@KRieIa7332PaJA+!gbl{lENTT|qpZ{MDo2Jm!; zc|zM(CJ$U8miP3i4_$%r^s0Xg)4(H)dYmTmK;1zlRoG$QwZgjLP@S&*eDAmHS3yow z+g9p@^#Nt-XXS4nIf~uvnR;ie)FvUeVP2e^Yy`N<$Q-*&2@)}fC@B!LnpYts8J)?z z!i(W61++fiYbjq^rBV>KB$>3t^YI3A>6v_}kDv1+UOvknAmr>uqNDG8n*G8Heu-la zRJZ)+sLY)>#zW4d5F8dP4Sa$5MeJuJ4oTY!6I>D&GSFY(X3Bj;#a#>^6_S$Tj3+v< zCj+d?4p)kx-fsy8tk;BvjUf-qN-lI}=9(o>W_lpze+S0rmY~8eB|BxijIBC!E%l;> z^=p##zef`5FF@?rPCj47HDAerOSE6h6dr!o$Oy}BzKL9)QwpUni3~xMpHti|L17`O zu5S!(=SDc&0pn0}swLU+kqyb-=uA^phi#wILCbQCAap5N_SkAgy*Dux41Urq>8?t( z)xM8&I1FFGUezqha9Y%HC$y^8hS`h zIX*a8dTxkP%mgm0P+;lZ1$^=Su#!g?ze_p_+cggMn6!cwQF}7R(~6PQB4y9M3V>t{ zg?g?yKmDBLqgyN^Ik}PmJ3kgyZd7^+)wy2VfXt#V*HBB3%%Xa;EvR)$J}U!2!GW;K zjq0dqW5}4{=_YEjM3pz`C}(}lZ0N?6Wb}|-EFVLW~tY02)HKmwCKWaN_WYDlgd zbm`#`n9)qzsb5`Uxhdy`bAW^lJ~5MfDl0+l3wQ&!*OH}}r9z!U*bJIMTSM{>m2FXT z;BAYlngOr1gC)Q*`3kfBtH4OT1*{6;VUA^1J30qrMy3AlaKPH1bq-M zDjl%2R%Dx=;McC`;!Rqe+neM>bfudK$>~Z@o8^|%igi{AXNP<19UQ;2mLPt&L|Jmk>1MMGu=L?ZskJ#Yt{t=xAU}HgkMv!JPk4+kKSs~zGrgf? ziP@>l_f3bXuICMh?gp;6c^~gb3jm&%Aovc?mCFGUuan1JXVAyp>eR%LLhj030vu#y z7MzTe7{~%PO`vjs#Zc?5E;Fjjt+GFP?bi7^e%qq0phU=QG*?E%3DH0@ga*e_v=S@H zMx>hg2en!3W=IqZ9?>RHuVSF?e;waV-dcwzj@uG4@tEr!%}AqRQB6d^LnNT6RBS`E zMwsh`Z1B?U+vI#*Yji&fwl{?Txi;=(rLL|=ahYR*`w?eXB9|9%7Y{I8@nC7 zb6O?j`9>fO{)QG_LTtulM5lGW_BI(gSlWIALoyu~TUDrQ;J%@iO=2ihB8?kPB*vXO z$Ol!LwJAxkRoP-W!!B3enX27ka69uKwRwrLSdv0XuVs~~*J`WN%tygsRL9vzTE1pe z(Hy#0RjBHtB&mZ^p4IOc8>PoNE;T|gvYl1BMyiw1c&xQ&IF;2`kX0JGzhB{^E-3JE zQJJcMUXs?2Q*0V@m4(JJAte|a&e_&Cvmhf{$2A_NM;jRuDwE=K^sYoDj=elrALTe) zlsV2h5{gmbW7al+jqR*dXVo$(jYhIWZnO0YKgA zJe5q_;HUB@5FXH;Y{q313&VRH~C2az;f&%jQoK;AW%$zOaSQR+ z?G#qos%$C$WE=SwnV&6b`dji6oX3cwQ`BU>9*)beq0y=AFkXo5BLS<)ifR371*-puVa`R82Cbcu-<~?w_5a1i}MVL&TtCJ4Zpr_&udUMP4aaO~{7c^W)8LU&Bgh z?sW+~CLDz$4KNiNi?Zk$Ltw~gj!24FEzvUr-Bi>imlPAcJ4RVpiTbd^bbwLf^#7`` zN7yQ|ySE?T4o*X!{VG(U?6}1$(st|xRK@vhg{JLlZMDY!OfP${ut$9sRw6l5$oD2G zrQIPWy?efnN^dj&XUFHqBhi2#QZc1>) zGbxB7@R{KXF)_8w9BAlAGly^&SB^5bf;%>@BP$=DJa2Uq%^8u1kmD(&t6pFY`dIF5 zIJ$8xHLEkv*9zFU7?ZFU^P&*fZcdsoA0cqmOP@}~k=ebs_kAmR(5YrkjAwS8CVf(z95i!8x6*A=?K~X6@8ca9tvYP7GS1q4n``&6)h6C zXO_Soh0J|PJVg|6eELXesY&V`<%-AA8TNk5I!^fa5k$sV?1rK`K+r{@K=i?`kzU{L zs<2u+e{z9Ev@wV?Mi4x#)3cgLy5cXF)j8F1Gjnf#dG%z6#~UD5omTs z+Sgkqd5QYtS5TOk2+HZH{gK(>so1GAZLFV$K-Z(20@?kgH))Qk-H`rk!n7jPsF)bB z>+vqBzT(_tAoYVd*h8WwSpl!wFzc?#z9ZfF28<+UnK9mo&)HriP~dofKUrP7qGlmm zyDaw4ezg;QPir(-gS_OSwP4+Q5@iEm-qB-(@5c|npMTqizC{0n40Aca=N52Fi8~ye zNIaunZdKGPt^$2ba7Rq}ncCt8<@}DB>H((0HJWbYe&dtl%G|(SvDp;!-G!xU98&i=WGlQ*X5fIoY_?Xx` z=hyCG_kdfqqptwhst2CBpvP=GeRCNui3KM^q$JYT-^{dU9_tnIWw#valqwaLQ`niG zS!+J@wJwI{YvB=fV#USLZ_3)@ofA4K_iSJPhxP<$5SB0csT*WN{s(OkhSm;B@{&K^ zZAT;5|4|_*S}9;Fp?I_QQCDjCEf7YbRMA;snJy8os3TZWJkUrXB9uJMlc)_8Wpt!% z!uHe6`0UWx;(QwR{B)ZY;Ah>6aAY^ETJx_!2r*{<1L@?R<}jJ=^7+31fCo^iWer^h zzYPv{{F*Bcp72*>R9&!rvojO9fEq_EH?9KDR%~*ECCXRdv`ty8e$Z5EQOea51@Tis zb6O{Z(YQ2cS852rHcZr*^sN$Tv>`IZFqz3ma#};h&hDV9XjZXwj}9J#(`h?puc%h^ zyQH~Rx)A=QRix*S`&8*%s|1%)ZQv!MWMpToHsDL-^>^anu$Z`_Tn-C!#3_dv8!NI| zKK=~y6)Cf7xBh&QdKMwcYJCk&dsFEhZC_0fNt`{|-t*k=@;!f;MeXxLXUR}0$!3$X zhOP~yR%BHYpDiDUl-YsWztWsCwjZ+f0#Idt%KQfvD*T!s=)N6^! z%77_0+DYVP-EYO-vOY(uo(=^n!jVTK3g=~NE3y2Zw+`j?Ql zL@2kWn?92`S*hLbj+-Oov77bM*KeE_i!sFR9?C*=|1AjsFV8vcO_?`NGC?K=U*-sS z$;bwb-Vjn@yEvh(KtBo6UYGn>s&8O(t772kPqjm&73_v>eRT z!AL(B`tdzvw0ml_6HrzAiic>7TWGPGe)=vq=Qg$N`YzaRfe)Nk)Lly`nLA#_Xk6wi zHf=nZs_}FrzIlTkrJSVgoJvew#YzvQF>MeLV#z2Sc*uRAtjmhp_8t_VC6{QlK5Cq7?rIZUtrI+VT!yA{Ma&z{^GlJ{D58@&NQr3Pql}2U z>xp{=ci{R57J|OUQ$e^7P zi6GHDB6*1jdejIi5@#9nn#=#r$L{Yom8N&96)p&!zJ_O06CR{zLH2*eFpO=wEj^K&lpRl-!Xv38v@y*k`isYKxQO+4Mu>Gd1yY z?Cb36gxV@ufV4`o;`E6+gt{&eZD@xdcj>$dxHQ7VX{|Fzyf@xc7mCvd*@() z=@zW4R1_qmQW7f-usfM0Xw{4I?+F8Hbk#LYPUc^$^)x(1j^PFl#uh*waN%o~1}ax55CD@Qt? zCMw%fd*tw~9SIRJIK}iyNGHl7QJ-EQ8ft#)hg~C$Dtl+>_18;;E6+k1X;D}_MGrlr zB35E-%vx2aL9tc*4cD$RC+Yf|n|bI1k|lqjbSOuf(MaBhm&f2%4e{pDUF_^%{Ou)c z;wn=ljOkwPmcB)Sz2Mke7mc=CGD*AA4AK)AfkZ2Il47gIuiEb$NQG1_)=Ik@9O#14 ze>QeFmxZmk=^|DfdR8wrH*WpbR#)d%FSJ-~)Eq)E;Ol;e6sp*8<|AB;dAT%tN+Dw* zSfQd{VD0Nz!DYjQ#8rhl{pL>1;m#Tuz@P#nv=geq-|~0=*#0816Q2tnpt=Bk8tPIz z<2`&6+=)uzt7n|~I$NR)q4OpXp?8F!Gva-Z9oIh)lOV1M-eK=W3_>6keh&^0^cD}z zzjd8Zj4v5P4URBah;NQ>@RmK)uFyaAPq?7lRQ29dPTt#3a?s+UA(isSZ>&p?oXIE|;}y1A@x1Q+|=?3~)A z-UOXeAsL6tX+)AY-y@&U2-QCz5v}3G)rdV|Bx`z539gZ5)COo~6UZ`qkc!+xSjrI5 zFxq;koY{H&$8>Q+%c>)6iCTY}gmw^ctV#ok*$~m>QScF4`P;+c%kT*v=e~io%ej5| z;yo2DnrO-v#-uuBB2){sZGJ*L?hw_3V`#0S^Fz2eNVzzQIXMCw`JCyL@Qd1p^zq|A z@+rDLu>b#J0uzqPCb&wkp!$Qs0RCVwH2=eqa>1*6#uwKBn)_xi-cH6x_19XfgY?&4Ch);#HgR@qIB zM(v6ODjqb!PPzox=u3i|oF4kev?M7o1r zO713ufyvVn^wRWfg7lR`uCG4X8?kB9YpnVS$}CRUp9~5>PNoZ22$@HJ51C`jtlwdt z^0CQgbc=LpCmY>!hFr(yvWg#O3vY(VWPvBPz2=m`IsOAcs@?G{&h&^Q(+W@vnwn=~ zi~qrjc4@^yHJ}49l2qZYhNo~AqTbYUD$&%}B7_;GRG$e^QRC%4`YkI|ujXYVxUjBq z>iGxNM##~R_g&7hGKvb#bRVb6#SL)W-MnkR*%hmaeDok2(Xg6jUu z|5Yqw1|bU%d5Cjj10dblK@YjXGV6qPCLyWHemDsQCEOpGe!N9Z$r=;i*B5-ae9?g& zb>aSWK!3f-5w_@{)Tj{^{`J3|!T$wOfiS}pmT!nQe)l~3{|ZDMtj%fv4W{w(-!KIP zZd1STZv1aJwPtFHl8R{<+rnxAD%WFN54gValomrZ@A%W3@s{aWjapb7QY&!A|H}na{c? z4kx4!Z>cl|_Je#652t!*wjb%jI50-i^EK4MbuKZZRYBvV!QG!5B9tq+tD=OD!b3hA z4;rQKKmj@Cw1~Bi4EsbTx3ldC8k$mY*nwU7`fN|&GQA&pM@(3?J*wBy z#oAR$#5M`5Zcg!U%US<9SdDPhKDUV)`v7q%XGQT`hWG3HTv>K2QHV}QKbP=c;1g~w zE8tzWedrU4Ov}sTyQ=e_^f_Q_fV=wo7e-_BV%d72C87|b;Wrt~w{AVifxz{QI76ixdrZ3!a=de;V@JOpSwT_9OzPcvQQ9Jy)r?CYCF zeb6$Uc%K_KcVUghjy^K4$hjHvyaj}QM_{)6I~!<0N(m$m=Kd*!{3|#;Tu1TUP6p7s z-gBchUA$*%EVXh&9v|5~P~@%SY))z6Lu5lhvZKnVMw`CJ#aC9zgw>-xM&DB6+6Hh3 zIAuA`XGpUGn)i-XMx*ZFn*71Tr$qs)iXan!mI%g1@+OszV|-@z4$ggxskp>xbzJ|q5mof9gI!C z`GOAawERxC*5-yX`qsvB`VNl&leAT+@EQ zF^GEgo?AMr{<1tJ{Y`B68cQA^iF*cqmmgZSRE&8{PrjJAm|&cqn7p{+<^2uh7Md1X z0g;ZcOp#5W@>WF(jJ}Ls_l89HvHHyc`1VG(8{X$%f0?;}OxAiCSd1<_&M2Wnq)5se zuBqAtCf(^Gy4F7t)#o+CcGRV-_&}QPLaOo*ptstJh~dC!AqX=@qXV?@OD=iz;~n{H zNK#nf-4y!=G~<*t^%GvY1kCS_!TIOrGiHbdqSg^7thKI`2W6 zN^U94K%H2eOz%4s>0(Jn<%%>jsXmZtV|j6RM_sLc_q*8O5Buz#7FPq*`4SHl{K|X! zpw7I0O~-+U5HlWn2&ctPDT%DKN;D$wSW>)_h}RF}9oW(0s||SznE3(snN@g)_PHm% zqUk@4Cy=HeU=w2v(%baqR<5fRy9Hh_oicMw$4|`Z{;%e|7K+Tew}b+^@(sA`?@3?e zzYRJ8a~mUb8&lzL{-?2n{=edF|Hr^zsJyL+qzd@78G(b)e9?!uK+aWx!FLX~rlt-F zKx1ynA?^Wq*(15c6^_!>ud2PHzLMV8PV>y5`=)Z_^E^eL-M6z!A`)@T?;dV=PIDh~ zZogcP9%cXj@`2LBIRD8#ItpXl43g*AWcYUXlYrK4H?`KVi|(Q9G~vPTYE{Nv1y7|R z)7l2KL1EFkqT>8{DT@|mYe5EQNIiu87qQiD_E`SR8&N$+5x zd+lj&eOt|}%SEfr`Z1TyCmo!4F8<@oFMl-{mP%5zGEJWJn%k%b=by1oE7dCxXs?E7 zA^LPdxo9*4*Y42CDKmcqX)!hz4hB4fVUTeZsZ!>8Vy#zel*wu8 z{CPe~lO4$T$lRK{%NW3{B_t$B8;9Y6$CMFY1cwi!t0&P9K8GPv7`kf-1F;cj-xhTD zT!gB-*Tl3fai@)?dhLy6D9wmFtUMv+$U3#oIrok?89nz77-l|g4^lTj0uhmcJEC4? z{4J&Kn%-UNW_k9)e8OrqtYN+omefol9LG!9Y^1^}HJx6#2e=3hjR+b^l8An)Y zBmQ<9+M3TH^ zyVyPu)`M|uf&K9uxM!tMN4?Qo4_j;U6Lue~Pv1+JW_}`Mk3&9-VhJC19pnRRE{8w9 z3w~MOVd4rCNI0qc3&-$E$x^?G-hOW|Yd$T2(g9im?Vzpf5+KJ%AdzRkA@`c8sFE}e zcEyyU5bczML+KbY{5O}a+N1P3)*4!`Sa83Wa zy50kMl5oXQNnBZ2d3SSFIl1$L-~V1a%+!*{yuWLQ#P?ND>c3q({?)1kt@Iro<@C)R z{*MY$sjRKIt^&_pXAB6yK>ArwxZ=z^hbAa5p2nglAqh_81Twn7#MmQAD`FU4ODqzn zcnkH4`?_+>HIoWrl9pO9{UM*4x0>%Zol@A%9YyN1lB~um&!` zV;o<+7_{#6!DbM6eAO~7W;S|eh3a02PhbM$N*MhFyJ1n0nPh5h*u| zt+OmCb6i-xBjOzqUo>3tnBTKMQ#%5ATJ+Evm-h0JcZ8G;wdzU*ci>Zw(Uh_IO#eE4 z#j@qFv`Zceg#l%VPLE%7%rCSdkRL!Tr8m~cRz$rKBQhKj2zR}R$1_;L)D$Yd!IHac ziPYNkG9`rLTJW-DG?u}%E#{cqY)-s#T*$zgc4uRXJ?+Y>Imyks5$AQV2w9eQqZE+k zCF|E3-jJ2ZctfglW6>3&c`K-=;-{kKyxb8K{*&`A-d8rJuLLV@8&_LK>UW?$Ht`yA z7q^K>7>_20aBG53pl9K!YRXr5E2-Hba<6OPJ)JjpR<}UcY3A3$OPoN%S}Q~z39(+%z)R-9{JpCr>GKU7bf<{T z8z9`4*vLG6h4Z!A$Y^8N8X#KkXA@x6wg(c7;ubzi0)qA~c54m{0x{3nh9O0?at z^Dw^LO(J}`9lreM2q6>o8w4KGF<@c#!FsHH!AyQ@X117E5YOUuHb(6tM(isU1u8^{ zA+-*#3!?tmx2G?>CzZrgDk`F!eTl(rb4sh4!SWZVs##ZIbjdVmyD`dV0ei*-K;34i z5TL#Qu)Eb}kY45!EO3>DZ{2hglpOk-GWOsoH8eTelVnM$Hozli$rNB$=DcU7^JFL-@j6_OJ0@`aAD!pSQow+d*=YKB-UN$(MKE-Vzh(Pk~oo zZ>6R{6UewL@@B(`oCGdHe@~hWgRxcD>=Us$|F#GZ;Q)abBqmiV?tlTw6YA++z&!hZ zo*??(4{8jnH+#8D3R<2IH9a!J{Cs)1911#WimWU@r?oL#Z^^6bvUZl_q_zd5tjsO6 z*jtBt?x!UMAx9>I8#S{mR9l-{S#GZ=Eo(K`pmr zm1hwIOg#iMwHFjajcu)X)-fO5^SYKUr8y`jF;}T#4*$Xio0m6L3h{BuUS135?as&$ z7U~Ukfw+6CI(hy?*lS$T>LxV^c=DzQ?oTcId|x&dZ>YW zEktk`Q{0bAqKL@TixUq%+fbk741ws!5(km*FgfcH$sZI;V?0j<(>jC{MK?Ukq|<4h zK8-Ub&R|`bv<@Gfg+Fq0_-rx;{xDNnL4$Z{a`|#pFQbN{ ziJ1_`2Q)j~(HHFGuP~lHT}Sv5amwUj=;&!+A=igI_@#(LO_msMe*W3R7um~#Jp-H5j zRo!g^ouhYc=TYxuY=8py{JCLqu+!wvGTKI~E z>xg8+&5x`!Da7oIDp?T#H@QfgfPQ`hu?b|IwYLKz3K=6(lg$&T*Q{L4DDLUKP^Tu0 zl;T_w^v-1ouUzLC(kh0sw=0Wbb(zW?=!?3ksq4%Y^YE4uBeFKoXNe0$iaH4ETeDN} zB-QPNlEqne>K_~E%WIH#?1|+XCx@SrZRX;LG{S!-B?ua7q-#?{(iXS`EWM0w#fap4 z(Mj@FgpD4>GmV^+Wg8J^n_OILyNRBS_xw=BIEkvz<=O3K=h3&KX1!;0I zp0qRg{2phTllak?d;)5oE4>~<1~`!mJrmfaR>q-#YkDnf^61OV-I<~g9;>o53(mGd zK75TN4yUMAu2Dsdwn!9h9Li5~S9%+D?cmp+1k4I@+NYAKtT%XCyR(^?XAn7zE2HPsdrBW>tjX<4^(A-yz{qAz{~W~_ zuzw5J=;NIt>BxbON&3TKtE$Gf{)>Xb(%d~+#l+DyGg#uSq3S#5jyv`@*9G}a;~k{MylaAr)E zJd0--7?H@JGHRA!9~%*F++xf$`psC>7{Wlujh!XPR~AW+Xk=I#RioWUME}dcGSZ?n zWXwR5d?SyJY3wBxBsxTbu7i%v;Kjf)zCvJF4&5DL&CoOsK5~+Pkbn?3OS}(>u8-b4 zwnDwng5EsdA~=-EaGA&1>s^-Cnly3QRFYy<}dgc&UMA|M5O0ZkhridIF`W}~;TqL=(ZJuqgBOOYBZxtq_>zM;b_`6T!tH>7qG{7F+P!1 z(UoRSL#r?2TKzs}MD_cQjnH=^fow&p&`|2GIDX(`FH2p+rIfjg9@Lv5X%#g=$AVkl zYEaA*gCv#T8w#;)CSpnOXktZ*0xqk{HYH5JH0z*kzQUC0n3}BdT4%|=tZ8BnqByZA zZNJdD;l7{av~CV=)DM)r)`5!>j=J{t2W1~SN&t#y#XPxmP~)Dug|PYLy^_NjjW;Aa zOqZ7gyK`3J{u&n!7;<6KWfleal*}a0E(w`U z+~R(r%3i!`i$a;c5B6|iEr&GJ8GErw<)%sD{!V#pQlZoF0g)m*572#hy+ww>3Di-v zrT+jb6tyN@m$yP?y~_*z*N%c{(@S$KauMMV-dYpM#OwSwE3h0VFqBdp`#6IbiE{a(jon(A3s(HAk%(2gqS z7L$Iekp@qP1H?8uAXeiGj)KHdJ9CUPViD=LU^(_x;$|!b#V~^j6}8&7)F^c3GuCZJ zNw25OM)*@E8`PIm9srlkp73*jKnFh~C4!37gidW@=cklYp2SK9o1&E69wYRaP#Y3d z;KhJy;AUtmL4T+Y*fL}=5;8%23wSY-t|^^5e6qP;O9nLw`!3?Dj1mKztdvR2zEJ3h zsliVuA)sn9Cxf<>zD|N8*2T~_bS=^;yFCxE!96Kb53~&0BF0T<(kTQ+_k4Akg|JmA zFO>PrNhi}g5n|{gHhRqjPI_S_HhCh7%;&rk2ZJoO;KJjC?N`;+-!N_7xyK=X|5q)Byn+d=q8 zo9sNw8#8;hjd(BA-ru2XS;BeoP^Aq@6*})7S4mF@55=~!aQFGk40|s7;4K*`skt> zjtgMIaG^s;!%6PLKl0fa7{FfLpg*wkvvCJ+5R%I~QdqXLx`d8?|8TrUp6K^i3#raU=`1O3 z0)pEo(Ae}7oei_q$HwV5Uf2%dsr#GXFwEn$2cgB!d6nZr`nZo_QJtS@i%0Gfdv{Uf z0+-ddx$vl$LgW_Y;)9}F*n~>>Ow#D>mPNN+lnwkH=RU(fzq(^7z`X|?)(>7dOhZV{ z?UKY4ccU@4%RN^azhMjOBTMS(Klg_8aH;I^djRCdRbzj_En!dBD7BlcikR%F1Xfjq zu#K1LsZH44K1bythIG*Sf@tB=gg4g(E|a3!wdAr-Mj(IvMX97yl07Abb4mf=;mh)j z0C8ieuuBSn;Vm?DM>yUyE!dI_+XFpIYTIi}A!c&`*)|#o2j!H~vRbI3!bR*xGE(GZ zKbU^iI{es6BvA!rAO4FhxR;FhI*92#+0V9?Wmt{|;KhO$JXn>D+&dAg5BC^;8)VF9 zV-e6i(r0<;;V-Q0ePYU;CYJYA9W~S;jAoapw}oF!XG@RcN0(9f(Iw18YLC;%?3Nzz z5tujNRmT}xOj#Q@wZB~;fb+5}=%j#XzoYnqnW;nlm;TomT~<)u1(WnDM<0DM)iRxq z4J|JG+w0&i&t}!>nD6J7UOScdI@MZIeRS;2LmRSX!@jg>JF)$HxUXT`6uq|cz<@oK z{BIkR_udxaLO)@{cbe6B>NXyioz;G~Ms8ETIP_Q11b^Ej!)hmGmHTkk;DPEnvIZ^Y zCjE}BtazPLtWUn!N?quvy@yzg^zgUZyKT`vz`VZ7K6{~dDQAy65gHksX$S-vJVWRK zU*kx@Ep_-=Rj3lPu|7oO!$K7xeuk{BR_1_=f<}Js+(UctAq~my%H&;rwO++Om}!F8 zf1+1c{6SSCHbaIlE~N|VltH`2&WWigp!#E<_oKU%;zT2L?Eh{$k?#b8dJI%gb`UD!4w z={!%pD9x(Lnwi+^F~qWhP~SU+??3s03oU}&(ll)-rWmJSo!5II;?HbedWwpeN@43w zTZeQTa~5oT?6}l#sz^nYpD8O+PMlAji#n*_0a%z7G(@);a1eG&rtrh}EDNF> za-zObQZK^va5l4GQX9AqH?h&rK>wKj|Ag0D`}!z`$aX z#fm&sMb9u@UNk{SgWWtp{8}0%X|UZwOoKi@#ml_T&gXK8)x2;|F`rUB@5Pf&BPes3 zfZxKLu`iT`iohlWh!<+^y{muVuDemEKC81wdLWv&VQko3Qf#;#^U_APp#&uAFqYp# z9E6s`tRJ4QAI`g2tY0h|F4|^+t4CG7H z@+p3Me-{2SM$UI5Mume5-Ige+y)hGe7s(k}TCRYj5DmH!@ucaJuhPQYK6=ITmv|`! zMBUXwPqs-&(uFFuW%b>PNFitECf`e^;Jd^cZUwOKp+HV=-haEsjSpbAq^z0L{wgp1 z9om9~Ij|WN^Kfo*ZHdn*4W$%1*JI##G<(*_F-Ygg+^+`OEAI%u!OP=1$I=q>nmtGT z)n)QxO+P-3F;u;uRLpQAx=;VXS#0@QY7}v$4}^SBE?x9HL~2{o5kiM$8!EJ2{`wm|gILfsJGU0~U4EfQf;n&}n80^k zdO22TRXFWOa6*<9;u$SGXd1Z=G1c^@gujD+4+lo;5{Cl1zMaOlPBPmvOQe+oA$TCkB_}Aor3vMB$$U^ z1FnuYng)XC2Y8*f>VJH0GUYQuFo%R$v582H$f4#7tP;f8Q%DcF8x`!$RL^bsYAOL5p@>FGASkr+9zdhboQ@A{M@9AS$)SWaaPk@C(uMp zI1ew9rA#RjF$cmjOCx!aEuojp`VJC#gOfdD)U#NKKKW{OvatN-K#jm87Uu%NZf>1! zZX0@q97dRENXaP+H>J~wDh3K zAAmds;|Rx$6}9eafC8PHB+FeQ_C`UTqb^CZ8Pp0rLq286ApOf9>GX@Hpebujc@9VT zO8MQzUvqiA^8D|R_cP~ddURkI=$ssXwl-4D=@w)pM;}hJPCbdnrwn5gJ=DUKN z)f@cFk{Mj`=I|(9erHQ4{4`}qd;r@*ICjAEqmESWQL!g|Y8tTTZq5;C;MuXzgBtA; z{GO<%yuhUEqX7pqui|n?LDh?I+fndX8ezjxs15*W?~VIjufWhPCJgq z?E>FOX=Y;NHLRtcl`y$YHV*0UFjZ-`fzOX)F@H5OnAn@FJ_~cS^MYdg)_Z7<0@GS; zjNZjLGMkvJe(Slrmh`19LhPQ8IoInPr;!~axYHq@5UD3rhDUCt7q8I$1nB0JxpE8^ zR!g|VG5(vuW4jO~oFV+Umva9-$xbqddVI&5lvnCTt+#}+>N{wT_@7*b@&qId}M} zTZ6c}U7ds^Tp@n?f~61_MV@#7!JarmC3HI|;MKC-n%!(% z9|-3+Yc`yI#$V~3wX7Ky*wk5wCkI+^mL`fC#5*Kj;t&-h zLktx09iYUHg~TK^Jo?~kT!5U_4*2hgD6Gh=Pw5Ni#fF&`ojb-+t_dwDEJ_LKt$F@L z!dh@){%o>06R|P8@lVG;}(88F~|)mGR2ZHCq2ZG&8g; z-7~rc`Wf08ItCgBx(huMqg-Z(Z=tK1F3-t5oNqLU))hjf5{Q-!;w}$sM`Kl$wSKtp zQ$)|$pLOiKz`C9}%>ruH=|?u|3b>YS7>zSXt_YkQKIU=QnKrJ(_ku9bEsf1l$7qM& zm72;F@8j~H+#{^hiowp$y8amt^G48z=(8{jSU4{x&VYFRFfmG*|GE*T=- zmfzBb1%~wxN|)_09#5?iuICYU5B=ng7N*L#DLA&(I45D;N0xBJI8-GOOd)gz2_vh3 zfktHp3i!C%_;7^)W4G3l01`uPRAsFZv_$!+kcf|vF*1LeeY_zfs~&e6XmlPTBB!0W z0GSlTHah%WaGkiBNGL5eEvpCm*J~75B4Oe79weNI`W`}s8>Wd_b8~-e%(zdVLrfkyw|#8!5EKmk%S!LuQ7R^W zo!XML%N>5QFx_a)-E9?%LN7|Bd#!f~twEb>dr0-8&~dl`W%WY5UQq`0I7;1uO}fmH z&8R7{MzVI17XHwUOE3d*>Ge195>C57+x;;$D@My`00{Z@94H4D`72QGqgqY-ih5*c zQr!s@(?_tjnT^fgH`m;24G;VQ-D_!{E!a>I9@EtR;t|?UaH}tf^Vtn!`EqsPc}rSN z*nyXx?T-P)fd+*ZJM3&$u)MVLx`ZJNaw)=ajsIBh%OX2g-Fr(Dtl&WXACEF@QuB&j z5jRNxhT-MbJG*lIxh}j-LBk*0Yv>{0lCS*?x#w^hG6bJ)AJ|S-IiiiKY++l;*lIF= zxK1knWyThReXN(9)|R{#MQ&02`@3?gz8REBNS=_(RDqAGNtS^Y-Y3}If<>rmN_Ovz`oLa+p)AjJjLey7FJ6%nI{k}&vdt{AD8b^zyMO^ZUqqMG8cMM}3@NQ(;ZUq$YOMh{rmaDu#!=#T zew7Y2@%El4$H6vRRFRs-zYVs&m49=d1Dl2&;$M;5>-KzKqR@%i*rpIChrE&HQ61wM%Q7`?mJ z?p`WI$>#6H+~6Efx5@>h{)UFaFV1}qW0=e<_W8(Tl3)Nta{Jtni0Ut4uEyo;Tkp8J zwxJi$^}u+J!OF@#t`(6vjtO;*GCOn?^``D;8*cx;ot_+1JF^*5EiG-{Ps|nJD{z0C z%P_m9;I`F9^CRNU@Z;bbqruFcKXwJWg4}b5SIY@vh_8v(llOW0&7R=RIeXr!q}k1@J`VXjOjxAw+u@SiE(#qLH5 z@exR+3)`{t3e|G)XsfYEEZ!?{z@}JnVR(J`)iLkmPdH*YW4NqfN-jS<%X=XVWOK#@ z$xClvn`_<$`dO8F=NIb8BjZ+;X;IK~9!PlP3jO*p3>$mS;F~{~oi1qU3*`GA77T|i zZC;&9IVfg=w8iq-7nqCLb{^azf;i!OyLKIHR`1$({Za^wT~Wm>1yxz_E^2%*TskWC zffOn$w%4+hJ)-pSsc(MElUP7bt0*ff>)H10oo^5iaO_7kSLIr8Tt{QxRop$?Q7p%1 zT7xinPYf!)oENC8Rksud{!bCwb;wqdf1^vfbrF;A`ekHJrh%XYeBanD-u@vGqUpg0 zzW-+Q8$kZ}A^U#`Bf5%~##a9+8B*4EL{dicX_BrpPZLN_l7JKjkdfnRgJ4Pc5;S-f z6bO+4#)E65W#g&SH(OQ{@(38A86EcB@b@Dkw%80zI}kH-^+b2qFu(pVenMVh4If+0 zSr?cGL)FDUbsT@VO|ehEU9N6_eH^m>u-$b*vkj^xkC@cAg2zQE7deoT8jD&RKI#&q$(fHIFF(D=Pj9G! zn!f-dUu|YnDrz)?#W?U>6ct&BotKg%kgx)Jv%Ir(V>IOaJIFQ17v(G{k=RLw7O{A= zMr&8<4BdV%z1d@(-ikVvhb0~X6rwW6x;G6c8xfsV+X0H$6@O)+vO)#9!(ukA?oeSe zJjkKTujTid{wDd6Q$5A+%qvdY!(_Mp@!P_jec^5O*k*0|o!FK~;o}i!eMr?KXWC;7 zmN55G*Tq*&qYJ5Tdak%(wCvN6#U;|_g&(fs)yY?>ZVBn#-K5+dZf*a-p%s)Hg&{P zanMLstbXJ}6$qQP&(){jU-s>kE$7*`wwvJ}55?cQ`(>pHWdzmPT!YN82MP{lE4iDt zut-{sMtVG9{W}8m#X%X z_{tROsH=yd$ZB2aMEzMBkQ+Si?r&%!E{i+_q%9LAX&e?l@p`^Y-CSTIZc^&HV<$RW z)U{TES(FVCA5bqUTS7@nLpCjeOD#ogWU9?!Q96q_h+XEp9!k^3s91L9CQEpe*N`EG zh|K~;Y16*@=<)qtaR4M5)PnEim= zc>Vla0KND|1Si2bz53))67+u{$O8cJ3Pyxz18#(m`x=B>y~gBK*MD(qNDrE={-|b` zYhIRgfV$zoHXbb2a2TuYIg#_yWH`RIh`Ul5-_5g?aRz0mMqsL*yx@p~>x*8*#Ul*E zC|+L-w|Ik!$_2wVe7Zv^!j+^v0e4@+VAWqDwF zfa9KuE8j#Yma1p<6TvAz)sT{9*O2z-fWHJ4MVi)+N)tyco!9XA+LbNmL4(!vTTMb-=^S9-TZRynV{xxuC(fNk89x^9Y1At>a-t|u`fA8EW+z|Jl;oV8t zvhZ^0M@e^)TrS7GsT26x^QamU3V;uaD;Mrxar;l2kI>xzf9R{U#%~M z=B#0Cp3X!;83LKsbmcXFk~suJ!>0N5QG3caM^sKnT1>~7eetG4bBpB?X@d~4{*dM;ORq4d<5MVm?Zk2s^%SIw@^&g=#wf+NnR8}P@Auz($Tv&>U{}_wVYHKer_gbI zZ^!@l3apc}!T;1`uDT*AV|^BhbDE=(1ym*|v$W3?jmW4|YvLEI@X`O-VQRGoi%X?T zP4I&ngZ0}9>hp)=8S$s3!l`wr;d$HR-C_Sk?sDhyagAdU6hHH4`TJ4%& z+X70f*P8r}rPY}-{7QltX3?&dyj*?h2$?7HGu#l|1(Byv?|pu3{A&)5%=r;tOZ!!U z7#lX^5ptu;5cqKbH`#@qtIA57p&H5LXF!%rJQ1}b9rRZbyhL*9Bq#kaiiZe4HS(Kw z0wfddlwYV#5PMF}7#*?{ipVXE^ zM8qxP;rkK)b$$Q~M_PJQEzMJC$YG$wQG7p?(RRXV1R$tBgrEcM$bA%HbFAR8W|*m1 zo0EUS-PAXmX_I)Iz*?7s%sQ0emF;Id$F^W{hMv@BT>*sR-kw`q>QKQ8iniM3>pcCb zD)94Jdr$y5T&W|^pf-${BB@NR$e=Zh1bLD|L#aY;wv3>{pzvRXU9pzGcS0;R_Tu`C zTTuL?VWb7Wz{dVy8>}91Jvdvyqx9Gsri82yYp ztM;NXeLO?63Bjn~@Q|;oLZPNIVt+OnquxA^hF#%QV=zJb-g~vN*?f;Bj5+G6H)>36 z%uDx*T2T;26Ml{k#vUf#POD#IVrB+NTM(PXvLtw>2H`^iYlaSr90uw@;g=vyG1G*w zMn9GjQ-v>ir3&@qo)fi4Y+^Wda)wq0p3D9RUY;9kh)pY2j~qPr$oOF<9_((X_(~vS z{52RDX)cQCp@R&~@!>5HZjB7(XtJXNDXx_$Yo-o&W-%64IlFFiTZn#`8P7cFg};Zc z#>jEc-WNe9N4DUY@L?WAQLeN}n7*OPmQ0AYh{iSVw+Tpv06dUVK2SOxG9*tj9BGq6 z)>Ulte0V7FHXfq{M#3ragX0rGs_57>p-V9G?cU`rd!KLPDME7O39xJ^Ye%kxS*DO} z=(>RlIk5K`gAuM8Y+-PdHvCNY2wa5)3n~~E4SSHillKKd!^O8#6Mc`+FDr`5`v!hQ z1Gh3F=*xn$EJCI)V4Xj#F)`rLV2G_UZ%BRKm3Z%Lbu>jywWpF~0nz1D4Kh@L3EUN? zgkNdn6NVYB72JMFUAPasDSBKU^2DTy~d#X9VaSOnWjIIgxY}){@htwGa zk27>^3ufIRvW`$j&QtLT_5MIZz0A#h@zk>Mi3lHqc7olX#}Lx+>Fo^`ejwh4w!$4E zRg#n*r@K`0Js*b5tL$$n{4@22o5TGIy?GP!CAwkd9cD?mKM?u3ce$>dvX4s+L5U-x zArjU-4Idd?)*9&A!O;i1^5^6I!s(QL%K=#ChVb{%E+oN4?l?{2t@Epxx&ryO&_p6} z;;prb*jOBjgDY^jF)cmjFFa8)A&u#*%xHhLsa*>Kn0-1~?jUQoaQo=`9@}}r;q-#x z8By!FxSk)U-2#7=3qmRS@1*i-?V!~2*djScYQL~IND~`5hhOU{ z2Gn+~LWV`H6zS5tc=F;l5FAub>C@}_=80YX zHmH-&30;RDI3+HjnpMkE%0Ch=TR$EadH>f={V$y)59N+8@wY@R^LsJm_-_yW|0bCH zPhD^G!IfS3>x=}1`dx}}yjr@M6?Uq?8il9h&QFzIlO~A6^(QGYlyAM{eNBKr6#|2~Y;Z_>V%5$B@|-~VBqkQPm{IC| zLmo(}Sw2T7T?$mZc%oq0`P4{kn09JS@`;AnriN2QLombr$%}1-^7I4;L2iJgR*o_R~X$#|nvtq;FZTm|*TD zCp>eh_+S=OQr-j1`T87d`m?4WM7bBV%L$9=vi1w=g8H{wk|w7lz)wDfFCk(_Geu}L zrGDA$&HJMxaM`XNV&A$!O0Uy5*!dmJI^S8U968_y)<@)KA1%g!0L801QdJhQFdDwT z$CCqYO8pNmbaxYT(Jh{0UE!_B0eCACHH#{U5Gn9whUEKf8qN-c<4^k>|&_j=K}KYjq{s|{=?S6lve*6Q)b4r zX8I1+wl?mx7T@tT}*H=YHA|xgNC|Y=aKH{g^0ri3FVnXNDmC8 zt41Rtal7BbUF&&muNGSAQ?7__d2Ua8Za-~3eXM-GPy6HkzzV<=u|%`hzetqBJs11s zq~(Vt=~_U!e*Z=+)+aE12tIb??Ak*bf;3?5$71I><%HedW8K$`wt?%6 z_4RH>a=5~iO-d!Ol5&;SgztNZJ&g-^>Jz|Nf;tFEb%~meo`@+8Ntu(x$!#}%VArm9 zTA!Iq8id)zu#1cXXJpGh6yA2S3R5)}+J(N9Sa|@!q(LrftSbMDF09AD4(0}jc>YF8xqH^Whz4GCwj?JXCpdDR2=r$rejEsc8l2Q$& zPI68Jlc~x>0rW&7C7%|e`W*}g6Zg>}K3zrIisC;uGf|VMk0}V%?-GO!T}{`(cww?a zn9F^afq#-Xli=9&^t_NL=8( zl|gTxo1kFK+O-Bv^^mw@xx_ngec6b-r_0UH zTSBcv9_hFgL~+$RU=5LKD}{z-j%Z@6!aIe772@NcrO>3woFqpu-8dz{|`F`qHByp6qmYl$y0J*-@}%{q2!0|?)$){1%Vh>1Qb&0xMZ3TUN7eo zgzXbdt`J^U0(t5*Gpq4bXa_yA;ZtKS#|ksi!}W2Io+@bo04Wo&g*vgq+E%+TEdU1W)eAk&+$gFM4Q`K0`b2}ByAZpjQ((XpQ+(;JpuvX+2-WGity2o z3+lkS!&Y5)ncQA$#^n$zU*HhOtDnX+gFuMTkU%l(nLlHoFRur9??Z3!y@y|9PbH zj4?ysf4-~t>%Fe``Tfp0_qoq~&bjaBeiHhWJzIot6e?b|iVhsyUV8sB-I7C$^P4aR>RoA6saxSF#}CeB>(c;`Jk@*1AaxM4gnH8kh01>~&<;`>w7i=+~iCH^7(q zMSm09=QUi)RoC0M_WRdFT3E)_>{qa_{+rR|!~5Toew-=ZaHH!wxS53o7FBH(Lq!pF z9aT{+_3bJ;1}ZOhJBBR1!vjDg+AUUp_+L6 z(^VhCQVfn9ia&qom3~`+i%5 z+q2yEbU4QIL;J?@+_}9^1K9T+`B8tP=XPXue9ypeen-IDQbL^csQAE-fVSS+;h5X; z#_jt(Ma*ApxXwNh@cfO&e?^6hdyJ(|-n#ASb--(+d#U_}!Hf?j??(x}BXS4X)VyWb z8`Byxy6+{#_@)d>For!k@w_sbRZhUHc6+;d^M%FP8Or!)mGO)7vMim_Sd85o47aO? z1gHg=U(5ZFVZP`K`L|aXS}*x%B(j-O!9DzM|H#loxG8?_N8&3 zjib9QzS=xz%psm#`f|Yzw<9d1&YPw0kMswH*5vb#7=N2JK)705;r>8$&R#7KU9M(7 zuH?h_%WA?R*88w!Tg!&BcFyWim1Q8#7R)1!x_9Q?OkR5;S9r8W?DZUV<(~qoU`uyf0lS6fB!{ zo^hdhlLjGOZk5poPT@}xBL3e>q(w)aDh8HcDYxII$9b@E`+)U)jw)exb)UDp^K_L{ zu{HCD0_$47Y>UAPZg7eo#o0#Yf9;K2(tk1i*cH>zVfCboy!W!)iy1xI@b8*Nn%{V< zWx74~c(H)}oS%B}^X{fD+4TK5k$Inq_QpTv7FgQ~FC1FE!!$dWP-SCrl22I0{$OqA z1wjT2UEBAEcgDRPROLwVVYL(!zpPevN3S?S_roKLp*c}0df~C8+oSCNwMQIk=KUej zgtObcXTQDsATIx`$mX5Bvliib3WXD0dcy^Om@vXMj#1_tmx{B=ge}F^;}?iM_&CQ@ z+G#=gv9iUfLh1|Kw+?o6`<+?z_Ci|jl97a%%F))QMMD0TA-)eKQ-u0%Z(QxlrLvs< z{yMSp8{tc{tB%(P?UCLnWZji^af@cFN##pp(!-@2KPa+$$X%AdF8W`FX?}K3>i5j( zRd+&5=UD58kQ!eRVwGEc8;8Tcyf`*54B@ndF5ZWHNcGUbSI+0ao3;GVSfri+0;G`x>0MNKwY!^|(z%s_xl&>+_E; z@nqGGmd6HcO47Pu_H*f*p`)`O?;hREr_c0mm!RY+OyEJ~TmYfKTTOlFhConbg27j}RektaSOSlt;eDIRF6}Bwx~=NxEI-A$saKlk2t;g9;l0`4 zoPTtyQiu8%j^KDz)qKviw%x(qOU*v#z#VXRHA{wgyx+0oSi9gA*(M8b#E9M=oeRMsHZ56}f^m~!5FK^i1zPP2c&pJbQyGpWvqRbp`iI-L#7{2-H zbPRG&x64;74rPwne|>&PZt|hh4KMkmMh2Oh$_ZEAiO+5R;%l2{G^kELYim?k-!MLJ z5zp$q%jG1w6^q?E>VzspHTz#=mSQ{Ebe>DHna9T+b=>F6vu%D2f6tI$hGJz6)AgO* zTMRzQG%L%Etj(!2Q_mm#`9O_*b4o$nEanRuD~>HOaV-ijSaN|~T4EJu>lMd0$1OKS znY5d?)JxJS8P0vmw{H07stS(hUc*TbSuEU+hQxY?IVCX=(>$(!EI1WyRCj;y>i$aG zWBJ*koEif?Z~GL_Y6BC9&TKn% zM@+oj)-%?9JftfnXYL-qx7O=buzWLr!@Ycy`VIyw#y4jQ%kPBa4;J=nl?Ns5b7^NR z{8?gBrMj9B_bPGB)BhEriAgbGgcQc z79Lc+!maJ<7p9W_k)zHhxXj)lQY%yVM)u16miFSMW@~&|J%`d1do`rAw({>i;kGmm z7E)mbnf)8nqd1G=0_4svihk=otixOCa3D7743}H+wz?%>XLDLtu@n_M(zC6QTav*0 zqb+c$*Run|oIgW98V8Onwij^8zM$XQl83KR_r$Q&HCJUZ?ns)%$fg_?rhka(+17RTtY20z zdR;AeAC_&}cd|w*?5S8nB}wjvTO?tR-dw;clq6}H@)WsPDv!VT-qmPrnBzG zHMScOOK)CDoST+Yd3lcjJ}kCwesggD$;gwJ*KFN!TjoOl>8<_vxT?kk%ZzFO9T;l6ZLjJ;kK7~taR~o&asjl(M@K&>zZB_vlf!J7V*oZ zU&&&}MpS9ig|Gz+;`3GfG*|>}W0Jk26}o3Hji(!FzV-QGbY)#dgF*7v2RlPcbRQMI zeZ|kCwe_>6bII(kZf~W{*-qK3Vj{Xu)Zq;uHN|l6mwlza@Uh;2lXWEVmgWMvxosbU zqiP?O++JqXkoBpazgt*RvPMh7tSm4*?7_y)hsjpWCLa?MGq1{DlnY5w;^ny3-}UXt z)2DNkO9O4I<_VScnvOM#NG#k+xlR%(yhi6!4nHnaUu*1`^fmqJ>vIAb+@pa^%k@qt zI-JM$R5~erlGmzs*G(GDEbr$Ka@6VwwsD?6P{XI)Jog#*i52&ZKimE!xxOrS4Gqdt zim`u6JkC5UEIi1ZoDf!>JV#tiZg<4uZ8ef-)aS1}u2^bwGWo7hP8)|=t#^V>Z0bV2 zy+_Um*nhh9=~AJyNGpAYl8o;XR{!T;?;W_?QfT0HPJls5=%)N@>kN*C?Agb-@(cOg z@n4*tyncJV&cfC5jb?O20>{H^#+F&p{yo=?1B~>0;YfMN&7SU(;q=?L)8S1X8v#O3 zA8|HeUqJes>h_+1H%PN;Dp|Kb5Z5 z@#!fK(?Iv5rx!eiySqPqdSANB>Q0J--Elfr**)o=x9^$pwHfjbEo8FOwv~M4xvbz+ ze68F^f2&oGZL$uZ?&3bWSUvX1E%(^I3v1op=N`JT$ljdy>sznZI>P3IulBw3U|XtL z)@qmEuu!y@-7tENg8p-fb#V)LCAaLD6VutypQYV$;a>Q6?=LlJ+KI=WXt(ktVpzsv4!`1(e>B3Y(o zO~oW3={jvXo{)V)fo*GV>C^^q+jo?|;Hb|?rH@5$JVzaym~N1NOsU7qScdinVs~m~ zNM3A1Ls^h`x~rP0?dP4YTw2ir&nsG9wO5pQcLb~^1|E13wDGCAbhv-V+1^ zR`2pWA-i{|e+xV2x^XP_%xKh(=5v*dPlo91%l+nlQ^>RLa*1>(eS7w~^0$+w(%7pd zO>bocR{2yMzD^$s-5|5%7p}KYBzNq{Ng1s;kf4sg`ZTa_&8j1|by7p^0*YTUkG-1j z?4i}{_Auk&#>50?Y`DO8=Z_IX+oLucq+hm=&s#fsXfWsSd%bOE(`sK2^53m}dj8da zxpF$%tfz&vZEEFB=$*&et*02c6F7J;SvlWW zC}PzRP+d}zhyNK>w5R;IRM^jv%P)iDpYNGFZ&r%Jt}~nG^Qag%_P-D-36|rl+mf?pY>fkGgjU#n*m5EY;iI*}?Rq z*C{rvKk$9IYY%5p`AXGSClCHu&v!+%`%qnyE%!M!GXmb8x6rc1YLs+0eqV{`Lpcxm z-TkAS%(IWAX1m+JS63O8Ouu!J{Ym7d$hM6^P35`=KYtZ@*v0>)(XrD?##ZnhXO^y% zoR~fD-HHlsv4eRZcl7+M7s??X9gIwmv9*xn{?5JU=f*Q^MZs3G%}L!~xYj?@>k#!` za^q)6l)R7I^}@6Iiv=&$NzC%0S1fRsxI2R3(UpAmT9oy5Cr){&+c3A&dg2|GNTq&Y zC}6iHbY#{*M+OS^zm>YqPD7~GGs4<5ABeFWZDSl+5iGwpg21H5;>}UA;&_73gMsz= z?)TQSZ%D=cEUeg{clu%Ei|sMKRR`K$%)tEjC65rggTj%2#=NlzC+DTlX-h8n)j~u^zB{kmOhA|GbSyxoy3hUfDp4xvO2;ZV|z(*Nb#D z>1Hj!z%B#)7Q(LA*k8u~0e9h({r+@Jem^z~GY^AomYLbE?=^(YvH;k#Sb};;2>$KQ zW7>*3>Z&RRh8wh1e`=`SUJLc+}%%WcGvOjT3(N;BjQnX`;nT$)12usZRL49)DtdmuljJBe{@hy$?U+E7w$#}WucS6vd(3P)4f%5r0bKumpP=LO#!Y z8G^h6MGu;XSlO{aUzWY=|UBoV6C7rovlK_L~j?ECD7aI*mPPMFu-{zzCO=mD2?f#1+@0td@hL z0HWwX!eOmFm5309Xjre?u>ZXfh;|Ha+(wVCwk-wZKUd^Zw&A-X^*i+-A3Mm(g_1Md zo&uV>qto~cHsn(~21=NXG z*OLpl^QvI#H-Jb5A<=#;NSq8s=~i-bMEAX#UTomQGO#AELJ4Q?L>ZBKj9JLM?%g7g zt`YvA^Pfz2ig*S%D>o9JW)Oc=cSajo9gw^V?Td3g$Z?72Fiyi4={00#BT;erq(P7K zoP?~4gY3`61ul7~fr@cR+NS`h3jr0D>Ipv)uSuw`;|mTAOk2BEKlA`o6fn^%PnI_s z=1zFqa4fByLHbv)>+rrE08b&3A0~qbA4S$lSkv4b#v(eE%r*B!=*90Ku@0o`=t$Xi zgbbEyJ{jD3AZb73fVFT$gL{HKVY(ilj5G0-RdS!dYaU4#0|>~3aW{7v3k)Se<%%z$E`XY=NdT!E3kU{_L@hG~2%$9DhQ+UBWqR2O7Zmt96 zAz7dB<2y$iQ=MSsLTlt&!(Zl#gT(hCTFXtqhwLqqHiI_N8V{N1bV|*23|rN8K$Wkc z3OY^Hfmws9j3}7Lh4LD`KU_eg1$uEmU)R5C~inD1)!LK^=KK8z=uF2zeZOQtoH`00=svUPK!@_12UG z%6Jmh@+4gVTM+?a(w&bycx2t45_EjQq=oIltnXz8p0N{zRzO)K^Z^y@u~OpCFsfT4 zO%EG94lZ+}+VWVCdf?J7U{e4#w8LwZOq)=LfW~ElaI9P%CSP?eM2KscWeL+BvBe%uAUNFhiKqtW%tL+ zXh<*2p<;u?xXBc1wNp|Uz-tzcSYtfVVLD;-!`_kq>~?1yEK$`HT$q*QSLEvUNc<7BOeUWHAGz z5lD-!r{=dz4M{5s?G#w)n+pO80kRlM(7i7xq9PTp3%n$Q+ir&?*g~q{;))~uzKw%C zDAyUp;0}Pic@RU<>D<27snC%^3o!;|!#W(_YJxP2dZ6G%&lHY!YKXt1BNgbvsz}CU zFhMtB4wNZEI;cQXw*aBu<1l0tn11+!miHiJ%&7JMmm}=7+z%UJ(=o1c*2zMoBB})g zqm8@gEgAIKzSdX*Fdp|P8&`FNRpc88iWDyB4rzKPB}A%VQfhgFu^`@3Sn<*R+S)}0 zZ2Xk}>W!2|lwkO>3~7+I!h97(4bt6@v{5Nzrn)`u90IJvpf-BoH}z7&RPg|phpwAG z&e;v;GKHgV;i)vb383%b4_bXvA9YX{CnCXRip-cPYJT}eKm-e7_~Fmr9}zqZ4C7T{;Cas+crEEAQG#lawOf$wP7ouPb0UIyuhj$p@v7Y6S8+4p$7O+pd&l#NrXdEbyhTa0p!DLHnV+ruB+uz_+r|5?3=i0PD zVuwj-2NMe=Xk7pXuSfb6zujso^KuTwvFQP{5kR9C?8L>>gr;oinEs5ew_u7@5LVEI zggmq?C!1rU%pm&M+@fj}mARjtRiKDC435Etax_;?N(B1W&nh6&&YH5z(WiHOjEq-@QgA+8jpyBG^Yg^u`(#is() z#EpN2om}Bpg3?>6Kw%|N811P-o2CLI8{pk#(u$BE?x7$5IJB~bnNekq;Rs28vFsJ7W;$w_H{s} zhd~-Sq9}h-gq_IAs73@Aq66%gAv;<`q)7bLu%K)Q$@Y)ekUfrFU}SX5WxvV{z^SBH za>dT#nIQHGU_lp#d5~{RTYT#2)+3cBeF)!UyDaG8EP%ZT6bW)x2eRW|`4;NkLUO+z z?O7(33{uO%aH9SC2aE+JP#92G-0w_=TAgsGtJW7uy_3OP(CN%4*vO&=tPfXD0EF|(or@IzC7`6J;;vq4$%Fr75gcGqPIS%`iQ>V$rfaC zo&{vGWyyZJ$VzT_2e@W{vgk?r@dKeSs?0E|XiwSiK!M;_*Nn!H?v-s^@Rb#VX#+P| zjT+KzL|T}XrA$7*J`6F#H82Aj(ft?&#A!@Evp2_QHvwWOAfh9Ggbyu5ss`mc8Q#$h zGg=>(6tt*$$0-2AEG9a*LtcesKa`c%`_5VhMF>U}h6%lx*7#11IK_Cg4Cs|X1&+xE zz4_t)|Ne&jD1c3jIFzNEdu+8GBS_{85nlE$8vKp@G~JX3wf>ySQz5wHNkoF<*y#%_ zxam}JBJ!YQRT}W0&T;G>0;|=(n-}XxL$lK>%$OxncA_k!$EEtHT*J*r9dB38s!2Z9_NUCKafwan0WkgqM)WSaMCLRYk&=g6L~SIpyhVzBZx}OlcTxr7 zB29&iNDkBvfXG|=ga<#+VtCYJi1As4pWCQK7MKIvg zB7jEmm<}7@0;TZ@N}lC09~*In^DHGeGm}Q!LUhX#uQXt;+ok4@s-d(xCyTW zh@p{&oY6VBcrArb_`Dus43dHZSNgC=9q4(5%EE0*9&;hYhoi4foDmm$!k z1=d0-l;w^)&yY#mc8X{tFB`tv3$*cvo-z7RNX?OHa_Au&hj8#!A7@1*SyMJz-ba2H zLx?rn;B9CpxO8%wG~-PR(rQI`vCh*44{dAY5Tnm%4cYY z9A8IPb`>~hLt(!F8LNk+u2|#*6bpDcI{9Ni{qKYZaID11j!2p+O7MBl-7SQ{4Cs+3 z&W!;xB&BRdnZTjJN1&Am3>(^vJ~=Za*pA#qx_a!NRLsaI1url|V$`#UJnm)Y{R<&w zwaN^`)SDpnO5-7S`ilQ%z=FKBL(Sp zy9|78<)jdP{Y##vHv0 zm9|b3-H?POz;+YKb;>x0$x+q640eix`WU^S-h>_4X^jPBR-B^X+R?{ z!cGN`_>;m5FZsm)-vIE+sOT*8Wt#A$-|yKfx)L4nR@91Dgt5J0*_{dw7mCi4%@(JOrx?o3Fa}H!}7)&wzZy5yGA{BbfT#T;b Kc1>|HvHt@Yf1hXo literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/largeClassUnpacked.jar b/src/test/resources/org/apache/harmony/pack200/tests/largeClassUnpacked.jar new file mode 100644 index 0000000000000000000000000000000000000000..1acefe90a977d7e36201f1f004d0084a1e1645b6 GIT binary patch literal 10793 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/pack200-e1.pack.gz b/src/test/resources/org/apache/harmony/pack200/tests/pack200-e1.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..6a54f8df963875bb564fdf3660344e7278052c47 GIT binary patch literal 14751 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/pack200.pack.gz b/src/test/resources/org/apache/harmony/pack200/tests/pack200.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..75f3f3c9ff56fcbc66a704ada0107f9f339a7d80 GIT binary patch literal 10438 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/simple-E0.pack.gz b/src/test/resources/org/apache/harmony/pack200/tests/simple-E0.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..35c60509fd8fbb3ed74e83dfe799d1de344dfe33 GIT binary patch literal 598 zcmV-c0;&BUiwFP!000000CiJcPZL2DJ+m#{c5MY)TLhIazY5rHYfMbkm=MwmX$wu- z)EJ+JWyHblZnL{J_~bkP1|A^ML=zwR1N;kr0`blk<+GE_otbm*oH=*z-exTlHK4}Z zVE4uTH|@^^?bW=EC>oXaQekziYBrYER;!g(yV$6n903jP$dAGg3LWA3(sf?Wl#8X5 zkusY9>7Ena@$v4&Zw*j0M_5aCd$w2+w(Y)iJ$tig+1&S!PQL#nXBlQ3(Kupp#2LU4 z$@Z}u`4?_V*KB&y30i?Cc=sP_b7#w} z>{y}~kZz(nL)SO9g%w|F zj--y1j+;708PfI3f?qLY>(|IU!!HUYJoDk4gQBIgrK0m!QT5q!`D?=GJ4xKa-6V93 zB#~A|$5av-OeLu1GX_=Zp@DJCDf7U<9n4Zr%kCy6Ia-&FSnGE;gxBU9woqxg7PmXx zlj?j5X0H@k$zU*AZr`&+RoVix$P%?08r7M^kX@jYNh_5eBMXO^-wWM~WMd)7@RV$F z5I}$DB&`XIVfyrP4-tw7X7=$YtsUU;4~)N0M-GwyRbM>769qGZ_b5J2$)_pB0skbu z0Jz=c* kKD3vbwUOB1yK2~_wGsg((_C7vJu8*|0@^XtBkThJ0KqFM=l}o! literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/sql-e1.pack.gz b/src/test/resources/org/apache/harmony/pack200/tests/sql-e1.pack.gz new file mode 100644 index 0000000000000000000000000000000000000000..d1c51fc709b65bb4a8e5cce2aa503aca6ca41e95 GIT binary patch literal 50618 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%0D-y0VlI4xa~pYZ2SP6VhA@eK8w-kVaZk?RXMdl& zfdLm@w7<)7UCa1WSSB0ZqJmi9VFKVX` z@_P^jL-FtRxsx??|g z73Z;q-_Bpbx@5h)@QjvNv>u0!9LHPJF~N2Np-r|Q7Qf|PgH!%_{v-SFx`P}-EL%3R z5X1(`_BC){f&C>L>Q@Da>{a!l`Y$uLt}}&|FLT#9k$#d(aum!qi1@cK8R9c8EXnDwH~vMir#;mSGtn+V=v{PPW~#rneG>+CLFvKkCC zI4-}0o?&#kg!u;qyLTtf$z}Nb!mWtJQ3ps3cYz^Y7{^FI^tzq?eB6Fyk+tL;VW@C% zr)eSg?C%*T?c<+KJxv5wa9V`qB}`qUWzVF_hxPeqkSCT-`@OUan{DKaW^vV7+{6~a z@djqRZP<@EJa6dUhJ@L`-9*e9YTh9%@CqGlyp?!m1055pQ~7Y}0(GD_g?9*p3bR*4 zbJ_5xF?HL(@!i}WM&8Tf?sxQ8;kcOnCgNt=i>cxPgu!j#W=(rhbRNMQ@2cOSe?8-x6X|I3upZX476uX6QO7zE6a=uiP<(6ka<7{X3C9=g15vi$*>P zR!y*~#tao4T&+aP8m4j8V+%QK_?>aoO9!$0b6omG)(7{Cg3}0Z{pVYbA|aA@kTWO< z|GtK9$BGu0$Z^{_9=r&b%b4|yCB-Be8y1O2u(2g&H90{~z}O#Wf5gaxtO%;}NHuSX za!#kB5U10b!T#nDthTJk+VL*_ha>)d6Sxy1MzpkBeY^;7)jYK#FR^l?m6KQ_yfc^~ zTdn^N`O%B`CMmy_Uclkh+jS(5z+!n1IYcI7>5pFg5qUAc;73^FMLa_-HT~j)7r82| zfp_1z$-NjeMI4F#SDWsZ{h?kohyBx*wn2a=-DW|&DUGfwj__n3x1S?NIhpL|_7FN> z5S%->P53u=WyDQJ3BuxlVq^nVlvC;6681lA>L1!U9mH+}9h^}^qTNFYSVH{g5d7ap zPNw+Bd^YsBIsAh>PFvsSWkaUjmX&Tc73H&dZ7SzVlJ1{s;;be~%yN}M-L?ECo~DUJ zaEJ>YfI7v(C}JU2#V8~Zr;tq8A1?}Q%ZNw@@|~9y-ku>8UgRVh^e(kIBS;pd;pYOE z^91FW%=yxLph!^G^YF) zKcf{>fBZw?x9@TE9HoDFB(01yrN2%fl?sUk1vi1ozDlVHI-L7!fipJ4IIiuG>7c^% zT0Ud(S?Wn{>AIuP@&gZ)`U z-dLnvKJ>`Qz)oVl-Bp`A^aSvNeaz4{`cO=XqHrML6kg~`t?qvY-a}T31e&3i`IMSK zTB`L{lQ+24bPZig*U|O#HFBC$jJ^K}$7-6vS$31l5;yyqb+lL7Bt7%FJ(OE~(sZtf z%N2P8w|oYFU3y`Uz;dRKx6{QX9?Ur)aBIb#POeBwc~msJM!hcY%<=58yd}SMuJA2+ zBNdL9i|_IS!Z&X7dn|90J$YQlm~GPUx4PMA5@$4UrMV>r?!3H<7Va@|FKp!=+$q37 z>YEL>g=F$Pzm>DtyPElrZ;T*xu6Ud95OAt=@k0K99YnS@J;=XLH}vd>-ntfHvB)�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 P96tRA1KE!ZVeJ6`+aF|B literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/sqlUnpacked.jar b/src/test/resources/org/apache/harmony/pack200/tests/sqlUnpacked.jar new file mode 100644 index 0000000000000000000000000000000000000000..8472a00addd28b70a37916677a9b19f1a0d2b907 GIT binary patch literal 335442 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

`de7_wa-Q4u3Ev5&{0spwuq1qNSCC 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/org/apache/harmony/pack200/tests/sqlUnpackedNoDebug.jar b/src/test/resources/org/apache/harmony/pack200/tests/sqlUnpackedNoDebug.jar new file mode 100644 index 0000000000000000000000000000000000000000..9e8a04e0889bf7a5872cc7d720d5be5d7a3db581 GIT binary patch literal 243185 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